Можете или да получите резултата от първата заявка в променлива (дата) и след това да използвате това:
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;
Или като четете въпроса си буквално, използвайте първия низ като част от втория низ, като го свържете:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
Ако отпечатате втория израз, вместо да го изпълните, ще видите:
insert into test (my_date) SELECT sysdate FROM dual
... което е валиден SQL. Това ще работи, ако query_string
е по-сложен или сам по себе си се изгражда динамично. Но ако броят на изразите на колони в query_string
списъкът за избор също варира, ще трябва да конструирате списъка с колони също динамично, в противен случай ще имате твърде много или твърде малко колони за вмъкване.
Как точно ще направите това зависи от това как конструирате низа на заявката - по същество, докато добавяте израз към низа на заявката, ще добавите и име на колона към отделен списък и ще завършите с:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
където column_list
се изгражда като да кажем col1, col2
и query_string
като select x.col1, y.col2 from ...
.
Няма очевидна причина да използвате динамичен SQL в това, което сте показали. Или, ако наистина използвате sysdate, всяка нужда от отделна заявка, за да получите това, както можете просто да направите:
insert into test (my_date) values (sysdate)
... така че предполагам, че вашият реален сценарий е наистина по-сложен. Но имайте предвид, че не използвате values
ключова дума с insert ... select ...
модел. Можете с една колона и подзаявка, но дори и тогава не е добра идея и не работи, ако имате няколко колони в подзаявката.