将RefCursor插入表中

Vic*_*tor 3 oracle plsql

我有一个简单的函数,我运行一个返回RefCursor的存储过程,我尝试使用该RefCursor将数据插入临时表.尝试这样做时出现以下错误:

SQL Error: ORA-00947: not enough values

我知道refcursor返回与临时表具有完全相同数量的值,正确的列名,它们的顺序和类型.我跑了print RefCursor,我可以看到所有的数据.这是代码:

var r refcursor;

EXEC SCHEMA.PACKAGE.SPROC(:r);

insert into SCHEMA.TEMP_TABLE
values
(r);
Run Code Online (Sandbox Code Playgroud)

我必须补充一点,存储过程有一个refcursor定义为OUT参数,因此它返回一个正确的类型.使用print r;打印正确的数据.

我究竟做错了什么?

编辑:基于一个建议我尝试使用fetch到rowtype变量,但每当我尝试获取一行时获取无效数字异常:

DECLARE
cur SYS_refcursor;
rec SCHEMA.TEMP_TABLE%rowtype;

begin
SCHEMA.PACKAGE.SPROC( cur ); 
LOOP
FETCH cur INTO rec;
EXIT WHEN cur%NOTFOUND; 

INSERT INTO SCHEMA.TEMP_TABLE
  VALUES rec;
END LOOP;
EXCEPTION 
WHEN INVALID_NUMBER THEN
DBMS_output.put_line(rec.move_id); 
end;
Run Code Online (Sandbox Code Playgroud)

我添加了异常块以查看哪一行失败,不用说它是第一行.我运行的存储过程从多个表返回一个select查询的refcursor.临时表定义为refcursor列及其类型的精确副本.不确定可能导致异常的原因.

Jus*_*ave 8

您无法从a插入表格refcursor.您可以编写一个从游标中取出并插入表中的过程.如果schema.package.sproc返回一个ref光标temp_table%rowtype,你可以做类似的事情

DECLARE
  cur sys_refcursor;
  rec schema.temp_table%rowtype;
BEGIN
  schema.package.sproc( cur );
  LOOP
    FETCH cur INTO rec;
    EXIT WHEN cur%NOTFOUND;

    INSERT INTO schema.temp_table
      VALUES rec;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)