我有一个简单的函数,在其中运行返回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);


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

我究竟做错了什么?

编辑:
根据一个建议,我尝试对行类型变量使用访存,但是每当我尝试访存行时,都会收到Invalid Number异常:

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;


我添加了异常块来查看哪一行失败了,不用说这是第一行。我运行的存储过程从多个表中返回一个选择查询的后代。临时表定义为refcursor列及其类型的精确副本。不知道是什么原因导致异常。

最佳答案

您不能从refcursor插入表中。您可以编写一个从游标获取并插入表中的过程。如果schema.package.sproc返回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;

10-08 02:27