Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wstawianie danych do tabeli za pomocą Execute Immediate w Oracle

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jak zadeklarować SQLCA.SQLERRD?

  2. łączenie wielu stołów

  3. Jakie role i uprawnienia należy nadać użytkownikowi w celu wykonania CRUD(na Oracle 12)

  4. Połącz węzły XMLType w zapytaniu Oracle

  5. Dokumentacja MAA dla Oracle Cloud