【发布时间】:2012-06-15 18:04:06
【问题描述】:
我有一个接受多个参数(即 pName、pHeight、pTeam)的存储过程
我有这样的查询:
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;
希望有人可以提供更多解决此问题的方法。谢谢。
编辑: 我实际上可以使用以下内容:
-- 根据传递的参数构建查询。 如果 pName 不为空 SQLQuery := SQLQuery || '和名字一样''' ||姓名 || ''''; 如果结束;
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 注入的影响...
【问题讨论】:
标签: oracle parameters dynamic-sql