Les Paramètres de liaison Oracle SQL Dynamique
J'ai une procédure stockée qui accepte plusieurs paramètres (pName, pHeight, pTeam)
J'ai la requête comme ceci:
SQLQuery VARCHAR2(6000);
TestCursor T_CURSOR;
SQLQuery := 'SELECT ID, Name, Height, Team FROM MyTable WHERE ID IS NOT NULL ';
-- Build the query based on the parameters passed.
IF pName IS NOT NULL
SQLQuery := SQLQuery || 'AND Name LIKE :pName ';
END IF;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = :pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE :pTeam ';
END IF;
OPEN TestCursor FOR SQLQuery USING pName, pHeight, pTeam;
Si j'exécute la procédure de passage de tous les paramètres, il fonctionne correctement.
Mais si je ne passe que d'un ou deux paramètres, puis les erreurs de procédure:
ORA-01006: bind variable does not exist
Comment puis-je lier sélectivement la variable avec les paramètres en fonction de l'endroit où la valeur du paramètre a été utilisé? Par exemple, si seulement pName était passé, puis je tiens seulement à l'exécution de la requête:
OPEN TestCursor FOR SQLQuery USING pName;
Ou si les deux pName et pTeam était passé, puis:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
Espère que quelqu'un peut jeter plus de façons de résoudre ce problème. Merci.
Edit:
Je pourrais effectivement utiliser les éléments suivants:
-- Construire la requête basée sur les paramètres passés.
SI pName n'EST PAS NULL
SQLQuery := SQLQuery | | " ET le Nom COMME "' || pName || "' ';
FIN SI;
IF pHeight IS > 0
SQLQuery := SQLQuery || 'AND Height = pHeight ';
END IF;
IF pTeam IS NOT NULL
SQLQuery := SQLQuery || 'AND Team LIKE ''' || pTeam || ''' ';
END IF;
OPEN TestCursor FOR SQLQuery;
Mais ce serait TRÈS vulnérable à l'Injection SQL...
OriginalL'auteur Batuta | 2012-06-12
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas très élégant mais cela signifie que vous pouvez toujours fournir tous les trois variables de liaison, même si certains d'entre eux sont nulles. N'ajouter le supplément
WHERE
clauses en cas de besoin.(J'ai essayé de formater le SQL dynamique pour le rendre plus lisible, vous pouvez simplement fournir en tant que chaîne longue).
Je ne suis pas en face d'une station de travail avec une DB access donc je ne peux pas tester la fonction, mais il devrait être proche (s'il vous plaît pardonnez les erreurs de syntaxe, ça a été une longue journée!)
Espère que ça aide...
Il est déclaré dans le
WITH
clause dans l'instruction SQL, c'est un mannequin table pour contenir les variables de liaison. Voir ici: orafaq.com/node/1879Essayé cela, mais encore, dit-ORA-01008: pas toutes les variables liées
Vous aurez à me donner plus d'informations que "Essayé cela, mais encore, dit-ORA-01008: pas toutes les variables liées" si vous voulez aider à la résoudre. J'utilise cette méthode à moi-même pour presque exactement la même situation et il fonctionne très bien, la syntaxe pourrait être un peu comme ma réponse explique, mais le principe de base est saine.
J'ai essentiellement exécuté le proc que vous avez fourni... et il dit que les variables ne sont pas liés.
OriginalL'auteur Ollie
Vous pouvez utiliser le DBMS_SQL paquet. Ce qui fournit un autre moyen d'exécuter du SQL dynamique. C'est peut-être un peu plus compliqué à utiliser, mais il peut être plus souple, surtout avec un nombre variable de lier des paramètres.
Voici comment vous pouvez l'utiliser (attention: je n'ai pas testé):
(Note:
DBMS_SQL.TO_REFCURSOR
est nouveau dans Oracle 11g.)OriginalL'auteur Luke Woodward
L'approche que j'utilise est à inclure dans le SQL dynamique un d'AUTRE cas, les membres de l'inverse de la SI. Votre code tests pName n'est pas nulle, donc, je voudrais ajouter une clause à la requête générée par des essais que pName EST Null. De cette façon, vous pouvez passer les mêmes paramètres de tous les temps, sans affecter les résultats de la requête.
OriginalL'auteur Donogst
Comment sur
?
OriginalL'auteur archimede