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.