3

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

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

我究竟做错了什么?

编辑:根据一个建议,我尝试使用对 rowtype 变量的获取,但是每当我尝试获取行时都会出现 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;

我添加了异常块以查看哪一行失败,不用说它是第一行。我运行的存储过程返回来自多个表的选择查询的引用。临时表定义为引用列及其类型的精确副本。不确定是什么导致了异常。

4

1 回答 1

9

您不能从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;
于 2012-11-20T22:34:55.240 回答