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

Inserimento di dati nella tabella utilizzando Esegui Immediato in Oracle

Puoi ottenere il risultato della prima query in una variabile (data) e quindi utilizzarla:

SELECT sysdate into query_date FROM dual;
insert into test (my_date) values (query_date)
-- or if you really want dynamic SQL, with a bind variable
EXECUTE IMMEDIATE 'insert into test (my_date) values (:query_date)' using query_date;

Oppure leggendo la tua domanda alla lettera, usa la prima stringa come parte della seconda stringa concatenandola:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;

Se hai stampato la seconda istruzione invece di eseguirla, vedrai:

insert into test (my_date) SELECT sysdate FROM dual

... che è SQL valido. Questo funzionerà se il query_string è più complicato o è esso stesso costruito dinamicamente. Ma se il numero di espressioni di colonna nel query_string select list varia, dovrai costruire anche l'elenco delle colonne in modo dinamico, altrimenti avrai troppe o troppo poche colonne per l'inserimento.

Il modo esatto in cui lo fai dipende da come stai costruendo la stringa di query:essenzialmente quando aggiungi un'espressione alla stringa di query, aggiungi anche un nome di colonna a un elenco separato e finisci con:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

dove column_list è costruito come dire col1, col2 e query_string come select x.col1, y.col2 from ... .

Non c'è una ragione ovvia per usare SQL dinamico in ciò che hai mostrato. Oppure, se stai davvero usando sysdate, è necessaria una query separata per ottenerlo, come puoi semplicemente fare:

insert into test (my_date) values (sysdate)

... quindi presumo che il tuo vero scenario sia davvero più complicato. Ma nota che non usi i values parola chiave con un insert ... select ... modello. Puoi farlo con una singola colonna e una sottoquery, ma non è una buona idea anche in questo caso e non funziona se hai più colonne nella sottoquery.