Oracle
 sql >> Database >  >> RDS >> Oracle

Come usare se esiste, se non esiste in PL/SQL?

Il tuo codice è per lo più buono, ma dovresti modificarlo in questo modo:

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;      

o così:

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 prima opzione utilizza l'ortografia Oracle corretta per la creazione di stringhe e l'SQL dinamico e la seconda opzione evita del tutto l'SQL dinamico eseguendo INSERT sul posto (l'opzione che preferisco).

MODIFICA : L'errore che hai ricevuto è dovuto al fatto che non hai incapsulato il tuo INSERT all'interno di una stringa. Questo è ciò che ho cambiato per te nella mia prima opzione quando ho menzionato correct Oracle spelling for string creations and dynamic SQL .

Spero di essere stato d'aiuto!