我有一个简单的函数,我运行一个返回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;
打印正确的数据。
我做错了什么?
编辑: 基于一个建议,我尝试使用fetch到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;
我添加了异常块以查看哪一行失败,不用说它是第一行。我运行的存储过程从多个表返回一个select查询的refcursor。临时表定义为refcursor列及其类型的精确副本。不确定是什么导致异常。
答案 0 :(得分:8)
您无法从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;