Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment utiliser s'il existe - s'il n'existe pas en PL/SQL ?

Votre code est généralement bon, mais vous devrez le modifier soit comme ceci :

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;      

ou comme ceci :

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;      

La première option utilise l'orthographe Oracle correcte pour les créations de chaînes et le SQL dynamique et la deuxième option évite complètement le SQL dynamique en exécutant INSERT sur place (l'option que je préfère).

MODIF : L'erreur que vous avez est due au fait que vous n'avez pas encapsulé votre INSERT à l'intérieur d'une chaîne. C'est ce que j'ai changé pour vous dans ma première option lorsque j'ai mentionné correct Oracle spelling for string creations and dynamic SQL .

J'espère avoir aidé !