Mam procedurę przechowywaną, która przyjmuje wielu parametrów (tj PNAME, pHeight, pTeam)wiążące parametry do Oracle Dynamiczny SQL
Mam zapytanie zabudowany tak:
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;
Jeśli I wykonanie procedura przechodząca wszystkie parametry, działa poprawnie.
Ale jeśli tylko przeszły jednego lub dwóch parametrów, wówczas procedura się błędy:
ORA-01006: bind variable does not exist
Jak selektywnie wiążą zmienną z parametrami oparciu o wartość parametru gdzie użyto? Na przykład, jeśli tylko PNAME została uchwalona, to bym wykonać tylko zapytania:
OPEN TestCursor FOR SQLQuery USING pName;
Albo wtedy, gdy oba PNAME i pTeam została przyjęta, a następnie:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
nadzieję, że ktoś może rzucić więcej sposobów, aby rozwiązać to. Dzięki.
Edit: I faktycznie mogła użyć następujących:
- Budowanie zapytania w oparciu o parametry przekazywane. JEŚLI pName NIE JEST NULL SQLQuery: = SQLQuery || "ORAZ NAZWĘ 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;
Ale to byłoby bardzo podatne na SQL Injection ...
Gdzie zadeklarowano t_binds? Czy muszę go gdzieś zadeklarować? – Batuta
Jest zadeklarowany w klauzuli 'WITH' w instrukcji SQL, jest to fikcyjna tabela do przechowywania zmiennych wiązania. Zobacz tutaj: http://www.orafaq.com/node/1879 – Ollie
Próbowałem tego, ale wciąż mówiłem ORA-01008: nie wszystkie zmienne związane – Batuta