Twój kod jest w większości dobry, ale musiałbyś go zmodyfikować w ten sposób:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES (''value1'', ''select max(column) from table_2'', ''20'')';
ELSE
sql_cnt := 'INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES (''value1'', ''select max(column) from table_2'')';
END IF;
BEGIN
EXECUTE IMMEDIATE sql_cnt ;
END;
END;
END IF;
END;
lub tak:
DECLARE
l_count NUMBER;
l_count_2 NUMBER;
BEGIN
select count(*) into l_count from table_1 where name='NAME_1';
IF l_count = 0 then
BEGIN
select count(*) into l_count_2 FROM dba_tab_cols WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';
IF l_count_2 > 0 THEN
INSERT INTO table_1 (xycolumn1, xycolumn2, xycolumn3) VALUES ('value1', 'select max(column) from table_2', '20' );
ELSE
INSERT INTO table_1 (xycolumn1, xycolumn2) VALUES ('value1', 'select max(column) from table_2');
END IF;
END;
END IF;
END;
Pierwsza opcja to użycie poprawnej pisowni Oracle do tworzenia ciągów i dynamicznego SQL, a druga opcja to całkowite uniknięcie dynamicznego SQL poprzez wykonanie INSERT
na miejscu (opcja, którą preferuję).
EDYTUJ: Wystąpił błąd, ponieważ nie zahermetyzowałeś INSERT
wewnątrz sznurka. To właśnie zmieniłem dla ciebie w mojej pierwszej opcji, kiedy wspomniałem o correct Oracle spelling for string creations and dynamic SQL
.
Mam nadzieję, że pomogłem!