0

尝试使用 DBMS_SQL 动态执行一个过程,该过程使用以下代码将 'table of varchar' 和 sys_refcursor 作为参数:

   DECLARE
   TYPE CriteriaMap IS TABLE OF VARCHAR (100)
                          INDEX BY VARCHAR2 (100);

   o_cursor             SYS_REFCURSOR;
   v_cid                INTEGER;
   v_dummy              INTEGER;
   v_date_to_run        DATE := SYSDATE;
   v_sql_execute_proc   VARCHAR2 (1024);
   v_filter_criteria    CriteriaMap;
BEGIN
   v_sql_execute_proc :=
      'begin MY_PROCEDURE(:v_date_to_run, :filter_criteria, :o_cursor); end;';
   v_cid := DBMS_SQL.open_cursor;
   DBMS_SQL.parse (v_cid, v_sql_execute_proc, DBMS_SQL.native);
   DBMS_SQL.bind_variable (v_cid, 'v_date_to_run', v_date_to_run);
   DBMS_SQL.bind_variable (v_cid, 'filter_criteria', v_filter_criteria);
   DBMS_SQL.bind_variable (v_cid, 'o_cursor', o_cursor);
   v_dummy := DBMS_SQL.execute (v_cid);
   DBMS_SQL.close_cursor (v_cid);
END;

结果引发以下错误

Error report:
ORA-06550: line 14, column 3:
PLS-00306: wrong number or types of arguments in call to 'BIND_VARIABLE'

文档http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_sql.htm说 BIND_VARIABLE 只采用有限数量的数据类型,并且“varchar 表”和 sys_refcursor 不在列表中。

是否有任何解决方法可以将参数传递给列表中没有数据类型的动态函数?

4

2 回答 2

0

我知道它很旧......但如果有人遇到这个 - 可以(在 11g 中,不确定之前)将 sys ref 光标转换为光标编号,绑定它,然后在执行后将其转换为 refcursor -就像是:

declare
   vSQL varchar2(1000) := 'declare 
                              v_rc sys_refcursor;
                           begin 
                              open v_rc for select ''this is a test'' from dual;
                              :v_cursor_number := dbms_sql.to_cursor_number(v_rc);
                           end;';
   v_rc sys_refcursor;
   v_cursor_number   NUMBER;
   v_cur number;
   v_result number;

   vFetchValue varchar2(20);
begin
   --open the cursor
   v_cur := DBMS_SQL.OPEN_CURSOR;
   --parse
   DBMS_SQL.PARSE(v_cur, vSQL, dbms_sql.native);
   --bind the cursor number
   DBMS_SQL.BIND_VARIABLE(v_cur, 'v_cursor_number', v_cursor_number);
   --execute
   v_result := DBMS_SQL.EXECUTE(v_cur);
   -- get back the value of the bind cursor number
   DBMS_SQL.VARIABLE_VALUE(v_cur,'v_cursor_number', v_cursor_number);
   --transform it to a standard sys_refcursor
   v_rc := DBMS_SQL.TO_REFCURSOR (v_cursor_number);
   --close the cursor
   DBMS_SQL.CLOSE_CURSOR(v_cur);

   fetch v_rc into vFetchValue;
   close v_rc;
   dbms_output.put_line(vFetchValue);

end;
/
于 2014-05-08T09:44:45.533 回答
0

varchar 表是通过 bind_array 支持的(尽管它必须符合 dbms_sql 中的规范,该规范由整数而不是 varchar2 索引)。

您能详细解释一下为什么在这种情况下使用动态 SQL 吗?因为您的示例不保证动态 SQL,因为调用的结构在这里是固定的。

于 2012-11-14T08:11:24.667 回答