sql >> Database teknologi >  >> RDS >> Oracle

Indsættelse af data i tabel ved hjælp af Execute Immediate i Oracle

Du kan enten få resultatet af den første forespørgsel ind i en (dato)variabel og derefter bruge den:

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;

Eller læs dit spørgsmål bogstaveligt, brug den første streng som en del af den anden streng ved at sammenkæde den:

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

Hvis du udskrev den anden sætning i stedet for at udføre den, ville du se:

insert into test (my_date) SELECT sysdate FROM dual

... som er gyldig SQL. Dette vil fungere, hvis query_string er mere kompliceret eller er i sig selv ved at blive opbygget dynamisk. Men hvis antallet af kolonneudtryk i query_string valglisten varierer også, du bliver også nødt til at konstruere kolonnelisten dynamisk, ellers vil du have for mange eller for få kolonner til indsættelsen.

Præcis hvordan du gør det afhænger af, hvordan du konstruerer forespørgselsstrengen - i det væsentlige, når du tilføjer et udtryk til forespørgselsstrengen, vil du også tilføje et kolonnenavn til en separat liste og ende med:

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

hvor column_list er bygget op som siger col1, col2 og query_string som select x.col1, y.col2 from ... .

Der er ikke en åbenlys grund til at bruge dynamisk SQL i det, du har vist. Eller, hvis du virkelig bruger sysdate, ethvert behov for separat forespørgsel for at få det, som du bare kan gøre:

insert into test (my_date) values (sysdate)

... så jeg antager, at dit virkelige scenarie virkelig er mere kompliceret. Men bemærk, at du ikke bruger values nøgleord med en insert ... select ... mønster. Du kan med en enkelt kolonne og en underforespørgsel, men det er ikke en god idé selv da, og det virker ikke, hvis du har flere kolonner i underforespørgslen.



  1. En Flask-SQLAlchemy-opdatering skaber en ny rekord i MySQL

  2. Indlæs data fra *.xlsx eller *.xls til Oracle-tabellen fra Oracle Apex 4.0.2-brugerkonto

  3. Hvordan finder man de privilegier og roller, der er tildelt en bruger i Oracle?

  4. Hvordan får man navnet på den ændrede tabel i en Postgres-hændelsestrigger?