如何使用if exists- if not exists in PL/SQL?

How to use if exists- if not exists in PL/SQL?

我正在尝试将 if exists 语句从 SQL-Server 转换为 PL/SQL 但出现错误。

我正在尝试检查 NAME_1 是否存在于我的 table_1 中,如果它们不存在,那么我正在检查 COLUMN_NAME='NAME_2' 是否存在于我的 table_1 中=], 如果存在则 insert (NAME_1 and NAME_2) 变成我的 table_2。 谢谢

T-SQL(SQL-服务器):

IF NOT (EXISTS (SELECT * from table_name_1 where name='NAME_1'))
BEGIN
    IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2'))

        EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2), 20)');
    ELSE
        EXEC('insert into table_name_1 values (''value1'', (select max(column) from table_2))');
END

PL/SQL(甲骨文):

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  VALUES ('value1', "select max(column) from table_2" , '20' );          
        ELSE             
            sql_cnt:= INSERT INTO table_1  VALUES ('value1', "select max(column) from table_2" );
        END IF;                    
       BEGIN
         EXECUTE IMMEDIATE sql_cnt ;
       END;
    END;
END IF;       
END;        

错误

Error report
ORA-06550: line 11, column 27:
PLS-00103: Encountered the symbol "INSERT" when expecting one of the

(Oracle版前答案及错误信息插入题中)

如您在此处所见:IF-THEN-ELSE Statement,Oracle 的语法不同

IF condition THEN
   {...statements to execute when condition is TRUE...}
ELSE
   {...statements to execute when condition is FALSE...}
END IF;

即没有 BEGIN ... END 块。相反,语句以 END IF

结尾

您的代码大部分都不错,但您必须像这样修改它:

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,第二个选项是通过当场执行 INSERT 来完全避免动态 SQL(选项我更喜欢)。

编辑: 你得到的错误是因为你没有将你的 INSERT 封装在一个字符串中。当我提到 correct Oracle spelling for string creations and dynamic SQL.

时,这就是我在第一个选项中为您更改的内容

希望对您有所帮助!

假设 table_2 没有第三列的 DEFAULT 值,您可以像下面这样简单得多:

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
        SELECT COUNT(*) INTO l_count_2 FROM dba_tab_cols  WHERE TABLE_NAME = 'table_1' AND COLUMN_NAME='NAME_2';

        INSERT INTO table_1
        SELECT 'value1', MAX(column), CASE WHEN l_count_2 > 0 THEN 20 ELSE NULL end 
        FROM table_2;

    END IF;       
END;

没有动态的原因SQL。