sql >> Database >  >> RDS >> Oracle

Gegevens in een tabel invoegen met Execute Immediate in Oracle

U kunt ofwel het resultaat van de eerste zoekopdracht in een (datum)variabele krijgen en die vervolgens gebruiken:

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;

Of lees je vraag letterlijk, gebruik de eerste tekenreeks als onderdeel van de tweede tekenreeks door deze samen te voegen:

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

Als u de tweede instructie afdrukt in plaats van deze uit te voeren, ziet u:

insert into test (my_date) SELECT sysdate FROM dual

... wat een geldige SQL is. Dit werkt als de query_string ingewikkelder is of zelf dynamisch wordt geconstrueerd. Maar als het aantal kolomuitdrukkingen in de query_string select list varieert ook, je zult de kolomlijst ook dynamisch moeten samenstellen, anders heb je te veel of te weinig kolommen voor de invoeging.

Hoe u dat precies doet, hangt af van hoe u de queryreeks construeert - in wezen voegt u, als u een expressie aan de queryreeks toevoegt, ook een kolomnaam toe aan een afzonderlijke lijst en krijgt u het volgende:

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

waar column_list is opgebouwd als zeg col1, col2 en query_string als select x.col1, y.col2 from ... .

Er is geen duidelijke reden om dynamische SQL te gebruiken in wat je hebt laten zien. Of, als je echt sysdate gebruikt, een aparte query nodig om dat te krijgen, zoals je gewoon kunt doen:

insert into test (my_date) values (sysdate)

... dus ik neem aan dat je echte scenario echt ingewikkelder is. Houd er echter rekening mee dat u de values . niet gebruikt trefwoord met een insert ... select ... patroon. Dat kan met een enkele kolom en een subquery, maar zelfs dan is het geen goed idee en werkt het niet als u meerdere kolommen in de subquery heeft.



  1. Hoe rijen te krijgen met een som die gelijk is aan de gegeven waarde

  2. Oracle Instantclient installeren op Mac OS/X zonder omgevingsvariabelen in te stellen?

  3. PostgreSQL:prestatieverlies voor het samenvoegen van twee tabellen in afzonderlijke schema's

  4. Wanneer moet ik Oracle's Index Organised Table gebruiken? Of, wanneer niet?