Insérer DML avec une variable de liaison :pourquoi ?
Allons droit au but! Les deux principaux avantages des variables de liaison sont la sécurité contre les injections SQL et l'amélioration des performances en réduisant l'analyse difficile. En raison de ces avantages, l'utilisation de variables de liaison dans votre code n'est pas seulement suggérée mais également recommandée.
Ne serait-ce pas une cerise sur le gâteau si nous pouvions trouver un moyen d'utiliser les variables de liaison avec le SQL dynamique natif ? Si vous vous posez la question, mes chers amis, vous êtes au bon endroit car nous allons faire exactement cela dans ce blog.
Qu'est-ce qu'une variable de liaison ?
Nous pouvons définir la variable de liaison comme la variable que nous créons dans SQL*Plus, puis référencer dans PL/SQL. De plus, nous pouvons déclarer une variable Bind n'importe où dans l'environnement hôte. Par conséquent, les variables de liaison sont également appelées variable hôte.
Vous pouvez en savoir plus sur les variables de liaison dans le tutoriel PL/SQL 6 ici.
Comment utiliser une variable de liaison avec Native Dynamic SQL ?
Afin d'utiliser la variable de liaison en SQL dynamique, nous devons prendre l'aide de "Using Clause ” de l'instruction Exécuter immédiatement.
Qu'est-ce que cette instruction Using Clause of Execute Immediate ?
En SQL statique, nous devions spécifier la valeur de la variable de liaison après l'exécution du programme PL/SQL. Alors que dans Dynamic SQL, nous devons mentionner au préalable les valeurs de toutes les variables de liaison. Les mêmes qui sont utilisés dans l'instruction SQL que nous souhaitons exécuter dynamiquement en utilisant Execute Immediate.
Par conséquent, pour spécifier les valeurs de toutes les variables de liaison, nous prenons l'aide de la clause USING de Execute Immediate Statement. En appliquant la clause "USING", nous répertorions toutes les valeurs de chaque variable de liaison utilisée dans l'instruction SQL que nous souhaitons exécuter dynamiquement.
Maintenant que nous avons appris ce que sont les variables de liaison et l'utilisation de la clause de l'instruction Execute Immediate, faisons un exemple.
Exemple d'exécution immédiate avec clause d'utilisation
Pour la démonstration, nous allons insérer les données dans un tableau. Et pour cela, nous utiliserons l'instruction Execute Immediate. De plus, pour améliorer la sécurité et les performances, nous utiliserons une variable de liaison avec Insert DML.
Pour ce faire, nous aurons d'abord besoin d'un tableau dans lequel nous pourrons insérer les données. Par conséquent, créons-en un rapidement. Et comme toujours, je garderai le code aussi simple que possible pour faciliter la compréhension du concept.
Étape 1 :Créer un tableau
CREATE TABLE stu_info( student_name VARCHAR2 (20) );
Étape 2 :Préparez la déclaration DML
C'est une bonne pratique de programmation de préparer au préalable votre instruction SQL, que vous souhaitez exécuter à l'aide de l'exécution immédiate. De cette façon, vous réduirez les risques d'erreurs de syntaxe.
La restriction d'écriture DML pour Execute Immediate restera la même que celle pour l'instruction DDL. Similaire à l'instruction DDL, l'instruction DML ne doit pas se terminer par un point-virgule. Par conséquent, en gardant cela à l'esprit, écrivons l'instruction INSERT.
INSERT INTO stu_info (student_name) VALUES (:stu_name)
Dans la norme INSERT DML, nous écrivons généralement les données dans la parenthèse des clauses de valeurs. De plus lors de l'exécution, ces données seront insérées dans la colonne correspondante. Mais comme vous pouvez le voir, nous avons utilisé ici une variable de liaison ":stu_name" au lieu de coder en dur toute valeur spécifique à insérer dans la table.
Étape 3 :Écrivez le code PL/SQL
La dernière étape du cycle consiste à exécuter INSERT DML avec la variable de liaison en appliquant la clause USING de Execute Immediate Statement of Native Dynamic SQL.
SET SERVEROUTPUT ON; DECLARE sql_smt VARCHAR2 (150); BEGIN sql_smt := 'INSERT INTO stu_info (student_name) VALUES (:stu_name)'; EXECUTE IMMEDIATE sql_smt USING 'Steve'; END; /
Comprenons ce qui se passera lors de l'exécution de ce bloc PL/SQL. Lorsque vous exécuterez ce programme, le moteur PL/SQL substituera cette valeur 'Steve' à la place de la variable de liaison :stu_name puis exécutera le INSERT DML qui insérera cette valeur dans la table mentionnée.
De plus, vous devez prendre en compte certaines choses lors de l'écriture du programme PL/SQL ci-dessus de votre côté.
- Assurez-vous d'inclure l'instruction INSERT DML ou Any SQL que vous souhaitez exécuter à l'aide de Execute Immediate dans une paire de guillemets simples. N'oubliez pas non plus de terminer l'instruction d'affectation (ligne 5) ainsi que votre instruction d'exécution immédiate par un point-virgule.
- La valeur que vous affectez à votre variable de liaison via la clause USING doit être identique ou compatible avec le type de données de la colonne de la table dans laquelle vous l'insérez. Par exemple, dans notre cas, nous insérons le nom 'Steve' qui est une chaîne de caractères dans la colonne nom_étudiant de la table stu_info qui est de type de données Varchar2. Le type de données caractère est très compatible avec le type de données Varchar2.
Grâce à ce programme, nous avons appris deux choses très importantes.
- Comment utiliser un DML INSERT avec l'exécution immédiate de SQL dynamique et
- Comment appliquer la clause USING pour attribuer des valeurs à la variable de liaison utilisée dans la requête SQL que nous souhaitons exécuter dynamiquement.
De plus, assurez-vous de vérifier la vidéo car j'y ai expliqué comment traiter l'erreur "ORA-01008 :toutes les variables ne sont pas liées". Je parie que vous ne voulez pas manquer la solution à cette erreur car elle est très importante du point de vue de la certification de la base de données Oracle.
De plus, restez à l'écoute car dans le prochain didacticiel, nous apprendrons comment gérer plusieurs variables de liaison en appliquant la clause Using de l'exécution immédiate dans Oracle Database.
J'espère que vous avez appris quelque chose de précieux sur ce blog. En attendant, partagez-le avec vos amis sur votre Facebook, Twitter, WhatsApp ou tout autre média que vous trouvez pratique. Aussi, abonnez-vous à ma chaîne YouTube pour des tutoriels plus rapides et intéressants. Merci et bonne journée !