Oracle 是否可以将DBMS_SQLHASH.GETHASH与绑定变量一起使用?

Oracle 是否可以将DBMS_SQLHASH.GETHASH与绑定变量一起使用?,oracle,plsql,Oracle,Plsql,在Oracle中,DBMS\u SQLHASH.GETHASH是返回查询哈希的好方法,而不是滚动自己的哈希代码。我们已经使用了一段时间,一切都很好,就像这样: SELECT DBMS_SQLHASH.GETHASH(q'[SELECT * FROM SCOTT.EMP ORDER BY 1]', 1) FROM DUAL; 但现在我们遇到了需要将绑定变量传递到执行的字符串中的情况,我想不出一种方法 实际上,我们正在努力做到这一点: SELECT DBMS_SQLHASH.GETHASH(q'[

在Oracle中,DBMS\u SQLHASH.GETHASH是返回查询哈希的好方法,而不是滚动自己的哈希代码。我们已经使用了一段时间,一切都很好,就像这样:

SELECT DBMS_SQLHASH.GETHASH(q'[SELECT * FROM SCOTT.EMP ORDER BY 1]', 1) FROM DUAL;
但现在我们遇到了需要将绑定变量传递到执行的字符串中的情况,我想不出一种方法

实际上,我们正在努力做到这一点:

SELECT DBMS_SQLHASH.GETHASH(q'[SELECT * FROM SCOTT.EMP WHERE JOB = 'CLERK' ORDER BY 1]', 1) FROM DUAL;
这显然是可行的,但不使用绑定变量,而且有点难看

我的想法是使用动态SQL绑定变量:

DECLARE
  vResult VARCHAR2(4000);
  vRole VARCHAR2(5) := 'CLERK';
BEGIN
  EXECUTE IMMEDIATE
    'SELECT DBMS_SQLHASH.GETHASH(''SELECT * FROM SCOTT.EMP WHERE JOB = :Role ORDER BY 1'', 1) FROM DUAL'
    INTO vResult
   USING vRole;

  DBMS_OUTPUT.PUT_LINE(vResult);
END;
/
但这将返回ORA-01006:bind变量不存在,可能是因为execute immediate字符串中的bind变量也在字符串中

我看到一些建议,可能可以使用DBMS\u SQL以我想要的方式执行查询,但我在这些方面的实验得出了相同的结果

是否有可能以这种方式传入绑定变量,或者我注定要在没有它们的情况下重新编写查询


谢谢

在这种情况下,文字连接是正确的解决方案:

CREATE OR REPLACE PROCEDURE my_hash( p_job IN VARCHAR2 )
IS
   vResult      VARCHAR2( 4000 );
   v_statement  VARCHAR2( 500 )
      := q'[SELECT DBMS_SQLHASH.GETHASH('SELECT * FROM HR.EMPLOYEES WHERE JOB_ID = '']' || p_job || q'['' ORDER BY 1', 1) FROM DUAL]';
BEGIN
   DBMS_OUTPUT.PUT_LINE( v_statement );

   EXECUTE IMMEDIATE v_statement INTO vResult;

   DBMS_OUTPUT.PUT_LINE( vResult );
END;
/

DECLARE
   vRole  VARCHAR2( 12 ) := 'PU_CLERK';
BEGIN
   my_hash( vRole );
END;
/

我为人力资源计划修改了你的例子。请注意,由于两级解析,即使在q'[]符号中也需要双引号。这也防止了SQL注入,因为参数总是被解释为文本值。

过程
GETHASH
接收参数
sqltext
,因此我假设在内部,动态游标将使用
OPEN v_cursor FOR sqltext
打开。要传入绑定变量,必须使用参数
USING
。所以我想这不是通过BVs的合法机会。