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