Oracle
 sql >> база данни >  >> RDS >> Oracle

Вмъкване на данни в таблица с помощта на Execute Immediate в Oracle

Можете или да получите резултата от първата заявка в променлива (дата) и след това да използвате това:

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 ... модел. Можете с една колона и подзаявка, но дори и тогава не е добра идея и не работи, ако имате няколко колони в подзаявката.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да инстанцирам профилиран DataAdapter, който да използвам с MVC MINI PROFILER?

  2. Коригиране на грешка „ORA-01789:блокът на заявката има неправилен брой колони с резултати“

  3. клауза съюз в sql

  4. Устройство за възстановяване при нулева загуба на данни

  5. Свързване към база данни oracle 10g чрез R