Oracle
 sql >> Base de données >  >> RDS >> Oracle

Insertion de données dans la table à l'aide de l'exécution immédiate dans Oracle

Vous pouvez soit obtenir le résultat de la première requête dans une variable (date) puis l'utiliser :

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;

Ou en lisant littéralement votre question, utilisez la première chaîne dans le cadre de la deuxième chaîne en la concaténant :

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

Si vous imprimez la deuxième instruction au lieu de l'exécuter, vous verrez :

insert into test (my_date) SELECT sysdate FROM dual

... qui est du SQL valide. Cela fonctionnera si le query_string est plus compliqué ou est lui-même construit dynamiquement. Mais si le nombre d'expressions de colonne dans query_string La liste de sélection varie également, vous devrez également construire la liste des colonnes de manière dynamique, sinon vous aurez trop ou trop peu de colonnes pour l'insertion.

La façon exacte dont vous procédez dépend de la façon dont vous construisez la chaîne de requête - essentiellement lorsque vous ajoutez une expression à la chaîne de requête, vous ajoutez également un nom de colonne à une liste distincte et vous vous retrouvez avec :

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

column_list est construit comme par exemple col1, col2 et query_string comme select x.col1, y.col2 from ... .

Il n'y a pas de raison évidente d'utiliser SQL dynamique dans ce que vous avez montré. Ou, si vous utilisez vraiment sysdate, vous avez besoin d'une requête séparée pour l'obtenir, comme vous pouvez le faire :

insert into test (my_date) values (sysdate)

... donc je suppose que votre scénario réel est vraiment plus compliqué. Mais notez que vous n'utilisez pas les values mot-clé avec un insert ... select ... motif. Vous pouvez le faire avec une seule colonne et une sous-requête, mais ce n'est même pas une bonne idée et ne fonctionne pas si vous avez plusieurs colonnes dans la sous-requête.