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

Comment utiliser Execute Immediate avec la clause INTO dans la base de données Oracle

Exécuter immédiatement avec la clause INTO

Le SQL dynamique natif ou NDS aide les développeurs en offrant de la flexibilité, en améliorant les performances et en simplifiant les syntaxes de programmation. Aujourd'hui, dans ce didacticiel, nous allons apprendre à écrire une requête SQL dynamique dans Oracle Database à l'aide de Execute Immediate Statement.

Qu'est-ce donc qu'une instruction d'exécution immédiate dans Oracle Database ?

En utilisant Execute Immediate, nous pouvons analyser et exécuter n'importe quelle instruction SQL ou un bloc PL/SQL de manière dynamique dans Oracle Database. Et par dynamiquement, je veux dire au moment de l'exécution.

Exécuter immédiatement ne prend qu'un seul argument. Il peut s'agir d'une instruction SQL ou d'un bloc PL/SQL. Le compilateur traite les arguments de l'instruction Execute Immediate comme la chaîne des types de données VARCHAR2. Assurez-vous donc de placer votre requête SQL ou votre bloc PL/SQL dans la paire de guillemets simples ( ' ' ).

Pouvons-nous utiliser n'importe quelle instruction SQL avec Execute Immediate ?

Toute instruction SQL ou bloc PL/SQL qui renvoie une seule ligne de résultats peut être utilisée avec Execute Immediate. De plus, si votre instruction renvoie plus d'une ligne de résultats, il existe d'autres moyens. De plus, nous en discuterons dans de futurs didacticiels.

Quelle est la syntaxe de Execute Immediate Statement ?

La syntaxe de l'instruction Execute Immediate est assez simple. Jetons-y un œil.

EXECUTE IMMEDIATE dynamic_query
[INTO user_defined_variable-1, user_defined_variable-2…]
[USING bind_argument-1, bind_argument-2…]
[RETURNING|RETURN-INTO clause];  

Où :

Exécuter immédiatement :Exécuter immédiatement est une expression réservée.

Dynamic_query :suivi de la phrase réservée, nous devons écrire notre requête dynamique. Cette requête peut être une instruction SQL ou un bloc PL/SQL. De plus, le compilateur traite la requête dynamique comme une chaîne de type de données VARCHAR2. Par conséquent, vous devez vous assurer que vous placez votre requête dans une paire de guillemets simples.

Clause INTO :En utilisant la clause INTO, nous spécifions la liste des variables définies par l'utilisateur. De plus, ceux-ci contiendront les valeurs renvoyées par l'instruction SELECT dynamique. Elle est très similaire à l'instruction SELECT-INTO. Il s'agit également d'une clause facultative, donc si vous n'en avez pas besoin, vous pouvez l'omettre.

Clause USING :Si vous avez utilisé une variable de liaison dans votre requête dynamique, cette clause vous permettra de spécifier les valeurs de cette variable de liaison. Ceux-ci seront à leur tour remplacés en conséquence pendant l'exécution. Encore une fois, il s'agit d'une clause facultative.

RETOUR ouRETOURNER DANS Clause :La clause Return into est opposée à la clause USING. Alors que dans la clause using, nous fournissons les valeurs à la requête dynamique ici, dans la clause RETURNING INTO, nous obtenons les valeurs renvoyées par la requête dynamique. Et stockez-les dans la liste spécifiée d'arguments de liaison. Encore une fois, il s'agit d'une clause facultative.

Vous pouvez également regarder l'explication détaillée de la syntaxe ci-dessus dans la vidéo correspondante ici.

Exemple d'instruction Exécuter immédiatement.

Faire une démonstration d'exécution immédiate en utilisant toutes les clauses mentionnées ci-dessus augmentera la complexité et rendra l'exemple difficile à comprendre. Ce qui est exactement le contraire de ce que nous voulons.

Ainsi, pour garder le concept simple et facile à apprendre, nous ferons l'exemple d'exécution immédiate en utilisant la première clause qui est INTO.

Exécuter immédiatement avec la clause INTO.

SET SERVEROUTPUT ON;
DECLARE
    sql_qry     VARCHAR2 (150);
    emp_tot     NUMBER(3);
BEGIN
    
    sql_qry:= ‘SELECT count (*) FROM employees';
    EXECUTE IMMEDIATE sql_qry INTO emp_tot;
    DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot);

END;
/

Voici un exemple très simple montrant comment utiliser l'exécution immédiate avec INTO clause dans la base de données Oracle. Voyons ce que nous avons fait ici.

Section de déclaration

Dans la section de déclaration, nous avons déclaré deux variables. La première variable est sql_qry de type VARCHAR 2. Nous utiliserons cette variable pour stocker l'instruction SELECT que nous voulons exécuter avec notre instruction EXECUTE IMMEDIATE. Comme cette variable va contenir une instruction DML, nous devons donc nous assurer qu'elle a une largeur de données suffisante.

La seconde est la variable emp_tot définie par l'utilisateur. Nous utiliserons cette variable avec la clause INTO pour contenir les données renvoyées par notre instruction SELECT.

Section d'exécution

Dans cette section, nous n'avons que trois déclarations. Ce sont :

Déclaration 1 :

Dans la première instruction, nous attribuons une requête SQL valide à la variable sql_qry.

Déclaration 2  : 

La deuxième instruction est l'instruction EXECUTE IMMEDIATE – INTO. Dans cette instruction juste après avoir écrit la phrase réservée execute immediate nous écrivons le nom de la variable sql_qry. La même variable dans laquelle nous stockons l'instruction SELECT.

Lors de l'exécution, le moteur d'exécution remplacera cette variable par le contenu qu'elle contient, qui dans notre cas est une instruction SELECT. S'il n'y a pas d'erreur, le moteur d'exécution exécute l'instruction SELECT sous-jacente. Renvoie ensuite son résultat s'il y en a un.

Pendant ce temps, notre instruction SELECT renverra une valeur qui correspond au nombre total de lignes de la table des employés. En utilisant la clause INTO de l'instruction EXECUTE IMMEDIATE, nous stockerons cette valeur renvoyée dans la variable emp_tot.

Déclaration 3 :

La troisième instruction est une instruction de sortie à l'aide de laquelle nous affichons la valeur de la variable emp_tot à l'utilisateur.

Information :
En cas de transaction DML, une validation explicite est requise car l'exécution immédiate ne validera pas automatiquement une transaction DML.

Une autre façon d'écrire cette section d'exécution est :

BEGIN
    EXECUTE IMMEDIATE 'SELECT count (*) FROM employees' INTO emp_tot;
    DBMS_OUTPUT.PUT_LINE ('Total employees are: '||emp_tot); 
END;
/

Si vous le souhaitez, vous pouvez ignorer complètement la première instruction. Écrivez simplement la requête SQL directement après la phrase réservée EXECUTE IMMEDIATE.

Veuillez regarder la vidéo sur ma chaîne YouTube pour savoir quelle est la bonne façon d'écrire la requête pour l'exécution immédiate.

Qu'en pensez-vous ?

Personnellement, j'aime l'ancienne manière où nous utilisions la variable pour stocker la requête. Et plus tard utilisé cette variable avec Execute Immediate. Parce que cela donne à notre code une apparence soignée et propre. De plus, cela nous aide à garder une trace de notre requête au cas où nous voudrions la changer ou la modifier.

Qu'en pensez-vous? Quelle façon d'écrire Exécuter Immédiat préférez-vous ? Le premier ou le second. Dites-moi vos avis sur ma page Facebook ou sur mon Twitter.

Si vous trouvez que l'apprentissage en regardant des vidéos est très pratique, vous pouvez regarder la vidéo sur ma chaîne YouTube. Et découvrez Exécuter immédiatement avec la clause INTO.

Jusqu'à présent, dans ce didacticiel, nous avons appris ce qu'est l'instruction Execute Immediate et comment l'utiliser pour exécuter dynamiquement une requête SQL à l'aide de la clause INTO dans Oracle Database. Je pense que c'est suffisant pour ce tutoriel. Restons simples en ne l'étirant pas davantage.

Assurez-vous de vous abonner à ma chaîne YouTube pour plus de tutoriels intéressants.

Merci et bonne journée !