我已經接受多個參數(即PNAME,pHeight,pTeam)存儲過程綁定參數到Oracle動態SQL
我已經建立了這樣的查詢:
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;
如果我執行程序通過所有參數,它運行正常。
但是,如果我只是通過一個或兩個參數,那麼程序出現了錯誤:
ORA-01006: bind variable does not exist
如何選擇基於使用的參數值,其中的參數變量綁定?例如,如果只PNAME獲得通過,那麼我只會執行查詢:
OPEN TestCursor FOR SQLQuery USING pName;
或者,如果PNAME和pTeam都獲得通過,則:
OPEN TestCursor FOR SQLQuery USING pName, pTeam;
希望有人能夠擺脫更多的途徑來解決這個。謝謝。
編輯: 我其實可以使用以下方法:
- 構建基於傳遞的參數查詢。 IF pName IS NOT NULL SQLQuery:= SQLQuery || 'AND 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;
但是,這將是非常容易受到SQL注入......
t_binds聲明在哪裏?或者我需要在某個地方宣佈它? – Batuta
它是在SQL語句中的WITH子句中聲明的,它是一個保存綁定變量的虛擬表。看到這裏:http://www.orafaq.com/node/1879 – Ollie
試過這個,但仍然說ORA-01008:並非所有變量綁定 – Batuta