Můžete buď získat výsledek prvního dotazu do proměnné (datum) a pak použít toto:
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;
Nebo si otázku přečtete doslovně a použijte první řetězec jako součást druhého řetězce tím, že jej zřetězíte:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
Pokud byste vytiskli druhý příkaz místo jeho provedení, uvidíte:
insert into test (my_date) SELECT sysdate FROM dual
... což je platné SQL. To bude fungovat, pokud query_string
je složitější nebo je sám konstruován dynamicky. Ale pokud počet sloupcových výrazů v query_string
výběrový seznam se také liší, budete muset sestavit seznam sloupců také dynamicky, jinak budete mít příliš mnoho nebo příliš málo sloupců pro vložení.
Jak to přesně uděláte, závisí na tom, jak vytváříte řetězec dotazu – v podstatě při přidávání výrazu do řetězce dotazu byste také přidali název sloupce do samostatného seznamu a skončili byste takto:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
kde column_list
je vytvořen jako col1, col2
a query_string
jako select x.col1, y.col2 from ...
.
V tom, co jste ukázali, není zřejmý důvod používat dynamické SQL. Nebo, pokud opravdu používáte sysdate, potřebujete k tomu samostatný dotaz, jak to můžete udělat:
insert into test (my_date) values (sysdate)
... takže předpokládám, že váš skutečný scénář je opravdu složitější. Pamatujte však, že nepoužíváte values
klíčové slovo s insert ... select ...
vzor. Můžete s jedním sloupcem a poddotazem, ale ani to není dobrý nápad a nefunguje, pokud máte v poddotazu více sloupců.