Oracle 以“varchar和sys_refcursor表”作为参数的动态过程执行

Oracle 以“varchar和sys_refcursor表”作为参数的动态过程执行,oracle,plsql,oracle11g,Oracle,Plsql,Oracle11g,尝试使用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;

尝试使用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'
文档说明BIND_变量只接受有限数量的数据类型,并且“table of varchar”和sys_refcursor不在列表中


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

通过绑定数组支持varchar表,尽管它必须符合dbms_sql中的规范,该规范按整数而不是varchar2索引


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

我知道它很旧。。。但是,如果有人遇到这种情况-在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;
/

那你是10g吗?因为您分配的标记是oracle11g。特别重要的是,考虑到11g.DazzaL中添加的主要dbms sql API,数据库是11g11.2.0.2.0。我没有注意到DBMS_SQL API中有任何重大变化。谢谢您的帮助。实际上DBMS_SQL有一个varchar2类型:varchar2_类型的table是VARCHAR222000索引的表,由二进制_整数表示;动态SQL用于在过程中执行SQL查询,从v_filter_criteria变量中检索参数,并将结果作为输出变量存储在sys_refcursor中。目的是使用动态过程来避免多个“何时”条件,例如:`。。当v_sql_name='MY_PROCEDURE'时,则MY_PROCEDUREo_光标、运行日期、筛选条件`示例过程创建或替换过程MY_PROCEDUREo_cursor out sys_refcursor,date_to_run in date,reportcriteriamap中的filter_条件为开始打开o_cursor FOR SELECT*from dual,其中param=filter_条件'param_A';结束我的程序/