Oracle EXÉCUTION IMMÉDIATE avec un nombre variable de lie possible?
J'ai besoin d'utiliser la dynamique de l'exécution SQL sur Oracle, où je ne sais pas le nombre exact de lier les variables utilisées dans le SQL avant l'exécution.
Est-il possible d'utiliser un nombre variable de lier les variables dans l'appel à EXECUTE IMMEDIATE
en quelque sorte?
Plus précisément, j'ai besoin de passer un paramètre dans l'inconnu SQL mais je ne sais pas combien de fois il va être utilisé.
J'ai essayé quelque chose comme
EXECUTE IMMEDIATE 'SELECT SYSDATE FROM DUAL WHERE :var = :var' USING 1;
Mais il l'a jeté en arrière avec ORA-01008: not all variables bound.
OriginalL'auteur Kosi2801 | 2009-06-17
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas faire cela avec
EXECUTE IMMEDIATE
. Cependant, vous pouvez le faire en utilisant OracleDBMS_SQL
paquet. Le La base de données Guide du Développeur d'Applications a une comparaison entre laEXECUTE IMMEDIATE
vous êtes familier avec etdbms_sql
méthodes. Cette page documentsDBMS_SQL
, mais que quelques exemples (en lien ci-dessus) qui devrait vous obtenir a commencé (exemple 1 est un cas simple de l'exécution d'une instruction qui pourrait avoir un nombre arbitraire de variables de liaison).DBMS_SQL
est beaucoup plus lourd à partir d'un codage point de vue, mais il vous permettra de faire à peu près tout ce que vous pouvez concevoir.Plusieurs instances de la liaison variable, survenant dans le SQL sont autorisés. Cependant, vous devrez connaître le nom utilisé comme lier des variables (par exemple :var dans votre cas) afin de passer en
DBMS_SQL.BIND_VARIABLE
.OriginalL'auteur Steve Broberg
Vous pouvez également contourner ce problème en utilisant un
WITH
déclaration. Généralement à l'aide deDBMS_SQL
est mieux, mais c'est parfois plus simple:with vars as ( select :1 v_surname, :2 v_forename from dual ) select person_id from people where surname = (select v_surname from vars) and forename = (select v_forename from vars)
OriginalL'auteur Karl Bartel
Ce Fil sur AskTom couvre le sujet dans les détails.
Dans votre cas, si vous souhaitez passer un paramètre ou none, vous pouvez construire deux requêtes qui ont un seul paramètre, et dans l'une de ces requêtes, il n'est pas utilisé (i-e le prédicat est toujours vrai) comme ceci:
Vous pouvez probablement d'affiner le prédicat de sorte que l'optimiseur va comprendre que c'est toujours vrai.
Vous devrez utiliser dbms_sql si le nombre de paramètres est inconnu
OriginalL'auteur Vincent Malgrat
J'ai effectivement rencontré ce exactement la même question il y a quelques jours, et un ami a partagé avec moi une façon de faire exactement cela avec
EXECUTE IMMEDIATE
.Il consiste à générer un PLSQL bloc contrairement à SQL bloc lui-même. Lors de l'utilisation de
EXECUTE IMMEDIATE
avec un bloc de code PLSQL, vous pouvez lier les variables par leur nom plutôt que par la poste.Découvrez mon exemple/code et sur ma propre question/réponse fil:
OriginalL'auteur John
On peut utiliser
dbms_sql
comme Steve Broberg expliqué, mais le curseur ne peut pas être consommée (lire) dans un grand nombre de clients. Oracle 11 a ajouté une fonction de conversion (dbms_sql.to_refcursor
) qui permet de convertir undbms_sql
curseur à un ref cursor mais pour une raison quelconque, on ne peut pas consommer ce converti ref curseur dans une .Net application. On peut consommer un normal curseur ref .net, mais pas un ref cursor quidbms_sql
curseur.Alors, quel genre de client seront à la consommation de ce curseur?
OriginalL'auteur Theo