Du kan antingen hämta resultatet av den första frågan till en (datum)variabel och sedan använda den:
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;
Eller läs din fråga bokstavligt, använd den första strängen som en del av den andra strängen genom att sammanfoga den:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
Om du skrev ut den andra satsen istället för att köra den skulle du se:
insert into test (my_date) SELECT sysdate FROM dual
... som är giltig SQL. Detta fungerar om query_string
är mer komplicerad eller byggs i sig dynamiskt. Men om antalet kolumnuttryck i query_string
Select list varierar också, du måste konstruera kolumnlistan dynamiskt också, annars kommer du att ha för många eller för få kolumner för infogningen.
Exakt hur du gör det beror på hur du konstruerar frågesträngen - i huvudsak när du lägger till ett uttryck till frågesträngen, skulle du också lägga till ett kolumnnamn i en separat lista och sluta med:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
där column_list
är uppbyggd som säg col1, col2
och query_string
som select x.col1, y.col2 from ...
.
Det finns ingen uppenbar anledning att använda dynamisk SQL i det du har visat. Eller, om du verkligen använder sysdate, något behov av separat fråga för att få det, som du bara kan göra:
insert into test (my_date) values (sysdate)
... så jag antar att ditt verkliga scenario verkligen är mer komplicerat. Men observera att du inte använder values
nyckelord med en insert ... select ...
mönster. Du kan med en enda kolumn och en underfråga, men det är inte en bra idé även då, och det fungerar inte om du har flera kolumner i underfrågan.