加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

将参数绑定到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;

但愿有人可以或许找到办理这个题目的更多要领.感谢.

编辑:
我现实上可以行使以下内容:

– 按照转达的参数构建查询.
假如pName不是NULL
SQLQuery:= SQLQuery || ‘和名字一样”’|| pName || ”’;
万一;

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;

我不是在具稀有据库会见权限的事变站前,以是我无法测试该成果,但它应该封锁(请包涵任何语法错误,这是漫长的一天!)

但愿能辅佐到你…

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读