sql >> Databáze >  >> RDS >> Oracle

Vkládání dat do tabulky pomocí Execute Immediate v Oracle

Můžete buď získat výsledek prvního dotazu do proměnné (datum) a pak použít toto:

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;

Nebo si otázku přečtete doslovně a použijte první řetězec jako součást druhého řetězce tím, že jej zřetězíte:

query_date := "SELECT sysdate FROM dual";
EXECUTE IMMEDIATE 'insert into test (my_date) ' || query_date;

Pokud byste vytiskli druhý příkaz místo jeho provedení, uvidíte:

insert into test (my_date) SELECT sysdate FROM dual

... což je platné SQL. To bude fungovat, pokud query_string je složitější nebo je sám konstruován dynamicky. Ale pokud počet sloupcových výrazů v query_string výběrový seznam se také liší, budete muset sestavit seznam sloupců také dynamicky, jinak budete mít příliš mnoho nebo příliš málo sloupců pro vložení.

Jak to přesně uděláte, závisí na tom, jak vytváříte řetězec dotazu – v podstatě při přidávání výrazu do řetězce dotazu byste také přidali název sloupce do samostatného seznamu a skončili byste takto:

EXECUTE IMMEDIATE 'insert into test (' || column_list ' ||) ' || query_string);

kde column_list je vytvořen jako col1, col2 a query_string jako select x.col1, y.col2 from ... .

V tom, co jste ukázali, není zřejmý důvod používat dynamické SQL. Nebo, pokud opravdu používáte sysdate, potřebujete k tomu samostatný dotaz, jak to můžete udělat:

insert into test (my_date) values (sysdate)

... takže předpokládám, že váš skutečný scénář je opravdu složitější. Pamatujte však, že nepoužíváte values klíčové slovo s insert ... select ... vzor. Můžete s jedním sloupcem a poddotazem, ale ani to není dobrý nápad a nefunguje, pokud máte v poddotazu více sloupců.



  1. Jak převést mysql na sqlite3 pomocí PHP

  2. Jak přeskočit duplikáty pomocí INSERT INTO lépe optimalizovaným způsobem?

  3. Jak zakázat fond připojení?

  4. Funkce NLS_CHARSET_ID() v Oracle