您的代码大部分都很好,但是您必须像这样修改它:
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;
或者像这样:
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;
第一个选项是使用正确的 Oracle 拼写来创建字符串和动态 SQL,第二个选项是通过执行来完全避免动态 SQLINSERT
现场(我更喜欢的选择)。
EDIT :你得到的错误是因为你没有封装你的INSERT
在一个字符串里面。这就是我在第一个选项中提到的为您所做的更改correct Oracle spelling for string creations and dynamic SQL
.
我希望我有所帮助!