将参数绑定到Oracle Dynamic SQL
发布时间:2021-05-15 06:56:09 所属栏目:站长百科 来源:网络整理
导读:我有一个接管多个参数的存储进程(即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 passe
我有一个接管多个参数的存储进程(即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,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 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注入进攻…… 这并不长短常优雅,但它意味着你老是可以提供全部三个绑定变量,纵然它们中的一些是null.假如必要,您只需添加特另外WHERE子句.(我试图名目化动态SQL以使其更具可读性,您可以将其作为一个长字符串提供). FUNCTION myFunc ( pName IN VARCHAR2,pHeight IN VARCHAR2,pTeam IN VARCHAR2 ) RETURN T_CURSOR IS -- Local Variables SQLQuery VARCHAR2(6000); TestCursor T_CURSOR; BEGIN -- Build SQL query SQLQuery := 'WITH t_binds '|| ' AS (SELECT :v_name AS bv_name,'|| ' :v_height AS bv_height,'|| ' :v_team AS bv_team '|| ' FROM dual) '|| ' SELECT id,'|| ' name,'|| ' height,'|| ' team '|| ' FROM MyTable,'|| ' t_binds '|| ' WHERE id IS NOT NULL'; -- Build the query WHERE clause based on the parameters passed. IF pName IS NOT NULL THEN SQLQuery := SQLQuery || ' AND Name LIKE bv_name '; END IF; IF pHeight > 0 THEN SQLQuery := SQLQuery || ' AND Height = bv_height '; END IF; IF pTeam IS NOT NULL THEN SQLQuery := SQLQuery || ' AND Team LIKE bv_team '; END IF; OPEN TestCursor FOR SQLQuery USING pName,pTeam; -- Return the cursor RETURN TestCursor; END myFunc; 我不是在具稀有据库会见权限的事变站前,以是我无法测试该成果,但它应该封锁(请包涵任何语法错误,这是漫长的一天!) 但愿能辅佐到你… (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |