Możesz albo uzyskać wynik pierwszego zapytania do zmiennej (data), a następnie użyć tego:
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;
Lub czytając pytanie dosłownie, użyj pierwszego ciągu jako części drugiego ciągu, łącząc go:
query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;
Jeśli wydrukowałeś drugą instrukcję zamiast ją wykonać, zobaczysz:
insert into test (my_date) SELECT sysdate FROM dual
... który jest poprawnym SQL. To zadziała, jeśli query_string
jest bardziej skomplikowany lub sam jest konstruowany dynamicznie. Ale jeśli liczba wyrażeń kolumn w query_string
lista wyboru również jest różna, będziesz musiał także konstruować listę kolumn dynamicznie, w przeciwnym razie będziesz mieć za dużo lub za mało kolumn do wstawienia.
Dokładny sposób, w jaki to zrobisz, zależy od tego, jak konstruujesz ciąg zapytania — zasadniczo, gdy dodajesz wyrażenie do ciągu zapytania, dodajesz również nazwę kolumny do oddzielnej listy i kończysz na:
EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);
gdzie column_list
jest zbudowany jak powiedzmy col1, col2
i query_string
jako select x.col1, y.col2 from ...
.
Nie ma oczywistego powodu, aby używać dynamicznego SQL w tym, co pokazałeś. Lub, jeśli naprawdę używasz sysdate, każda potrzeba oddzielnego zapytania, aby to uzyskać, ponieważ możesz po prostu zrobić:
insert into test (my_date) values (sysdate)
... więc zakładam, że twój prawdziwy scenariusz jest naprawdę bardziej skomplikowany. Pamiętaj jednak, że nie używasz values
słowo kluczowe z insert ... select ...
wzorzec. Możesz użyć pojedynczej kolumny i podzapytania, ale nawet wtedy nie jest to dobry pomysł i nie działa, jeśli masz wiele kolumn w podzapytaniu.