Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Einfügen von Daten in die Tabelle mit Execute Immediate in Oracle

Sie können entweder das Ergebnis der ersten Abfrage in eine (Datums-)Variable schreiben und diese dann verwenden:

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;

Oder lesen Sie Ihre Frage wörtlich, verwenden Sie die erste Zeichenfolge als Teil der zweiten Zeichenfolge, indem Sie sie verketten:

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

Wenn Sie die zweite Anweisung ausdrucken, statt sie auszuführen, sehen Sie:

insert into test (my_date) SELECT sysdate FROM dual

... was gültiges SQL ist. Dies funktioniert, wenn der query_string komplizierter ist oder selbst dynamisch aufgebaut wird. Aber wenn die Anzahl der Spaltenausdrücke in der query_string Auswahlliste variiert, müssen Sie auch die Spaltenliste dynamisch aufbauen, sonst haben Sie zu viele oder zu wenige Spalten für die Einfügung.

Wie Sie das genau machen, hängt davon ab, wie Sie die Abfragezeichenfolge erstellen. Wenn Sie der Abfragezeichenfolge einen Ausdruck hinzufügen, fügen Sie im Wesentlichen auch einen Spaltennamen zu einer separaten Liste hinzu und erhalten am Ende:

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

wobei column_list ist beispielsweise aufgebaut als col1, col2 und query_string als select x.col1, y.col2 from ... .

Es gibt keinen offensichtlichen Grund, dynamisches SQL in dem zu verwenden, was Sie gezeigt haben. Oder, wenn Sie wirklich sysdate verwenden, ist eine separate Abfrage erforderlich, um dies zu erhalten, wie Sie es einfach tun können:

insert into test (my_date) values (sysdate)

... also nehme ich an, dass Ihr reales Szenario wirklich komplizierter ist. Beachten Sie jedoch, dass Sie die values nicht verwenden Schlüsselwort mit einem insert ... select ... Muster. Sie können mit einer einzelnen Spalte und einer Unterabfrage, aber es ist selbst dann keine gute Idee und funktioniert nicht, wenn Sie mehrere Spalten in der Unterabfrage haben.