Utilisation automatiques des bind variables ?
Bonjour,
Je souhaiterais savoir si lorsque j'exécute un script ou appelle une fonction (ou une procédure) en PL/SQL, selon quelles conditions l'instance binde automatiquement les variables utilisées dans mes requêtes ?
Je précise :
-J'utilise une variable PL/SQL dans certains exemples appelée SQL_TXT pour stocker les requêtes.
-Si j'écris directement dans la chaîne SQL_TXT les valeurs explicites des variables que j'utilise en réalisant de simple concaténation (||ma_variable||), je sais que les variables ne sont pas bindées quand je fais un EXECUTE IMMEDIATE SQL_TXT;
-En revanche si dans mon buffer SQL_TXT, je place des ':' devant mes variables de ma requête, en réalisant un EXECUTE IMMEDIATE SQL_TXT USING <liste de variables de ma fonction ou procédure> alors mes variables sont automatiquement bindées ce qui évitera à l'instance de la base de données de redéterminer le plan d'exécution.
La question que je me pose et que si dans ma fonction j'ai une requête qui est appelée directement, c'est-à-dire sans utiliser de EXECUTE IMMEDIATE, est-ce que lorsque la requête utilise des variables de ma fonction pour vérifier les conditions sur certaines colonnes, l'instance binde automatiquement les variables ?
J'ai une procédure P1 qui utilise un curseur C1 définit sous cette forme :
CURSOR C1(var1, var2, ..., varN) IS
SELECT <liste_de_champ> FROM <Mes tables> WHERE Tab1.Champ1=var1 AND ...;
Est-ce que mes variables sont bindées automatiquement dès le premier appel de cette requête ?
Lorsque en revanche j'utilise là requête suivante ci-dessous pour faire des mises à jour dans une table est-ce que les variables sont aussi bindées ?
J'ai des variables var1, var2, ..., varN définit dans ma fonction et dans le code source j'aurais :
UPDATE Tab1 SET Tab1.Champ1=var1, Tab1.Champ2=var2, ... WHERE Tab1.ChampN=varN;
Lorsque j'ai affiché les rapports AWR j'ai pu voir le SELECT de mon curseur et l'UPDATE de la fonction. Quand je demandais d'afficher le texte qui allait avec le SQL_ID, Oracle avait mis des ':' devant les variables varX. Mais est-ce que celà veut dire que les variables ont bien été bindées dès le premier appel des requêtes ?
Merci d'avance de vos réponses,
Zidmann