Ho una stored procedure che accetta parametri multipli (cioè pName, pHeight, PTeam)i parametri di rilegatura a Oracle SQL dinamico
Ho query costruita in questo modo:
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;
Se eseguire la procedura che passa tutti i parametri, funziona correttamente.
Ma se ho superato solo uno o due dei parametri, quindi gli errori di procedura out:
ORA-01006: bind variable does not exist
Come faccio selettivamente lego la variabile con i parametri in base a dove è stato utilizzato il valore del parametro? Ad esempio, se non altro è stata approvata pName, quindi vorrei solo eseguire la query:
OPEN TestCursor FOR SQLQuery USING pName;
O se sia pName e PTeam è stata approvata, quindi:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
speranza che qualcuno possa fare più modi per risolvere Questo. Grazie.
Edit: ho potuto effettivamente utilizzare il seguente:
- Costruire la query in base ai parametri passati. SE pName NON È NULL SQLQuery: = SQLQuery || 'AND Nome LIKE' '' || pName || '' ''; FINE 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;
Ma questo sarebbe molto vulnerabili a SQL Injection ...
Dove è stato dichiarato t_binds? O devo dichiararlo da qualche parte? – Batuta
È dichiarato nella clausola 'WITH' nell'istruzione SQL, è una tabella fittizia per contenere le variabili di binding. Vedi qui: http://www.orafaq.com/node/1879 – Ollie
Provato questo, ma continua a dire ORA-01008: non tutte le variabili rilevano – Batuta