【发布时间】:2016-03-24 05:48:09
【问题描述】:
我已经用动态设置游标和 %rowtype 变量编写了程序:
create or replace procedure process(source_table IN varchar2, my_cursor IN sys_refcursor)
is
c sys_refCURSOR;
rec my_cursor%rowtype;
begin
Dbms_Output.put_line('process starts');
open c for 'select * from '||source_table;
loop
fetch c into rec;
exit when c%notfound;
end loop;
close c;
Dbms_Output.put_line('process is over');
end process;
我将光标转移到程序中,函数如下:
CREATE OR REPLACE FUNCTION ddp_get_allitems (source_table IN Varchar2)
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR 'SELECT * FROM '|| source_table;
RETURN my_cursor;
END ddp_get_allitems;
编译过程“进程”时出现错误: PLS-00320 表达式类型的声明不完整或格式错误。 编译器已使用“rec my_cursor%rowtype;”突出显示该行。作为误差源。变量“source_table”和“my_cursor”基于同一个表(select * from my_table)。
那么为什么会出现错误以及如何消除它?
【问题讨论】:
-
你不能这样做。 ref cursor 没有具体定义。它不是表格行。
-
你的目标是什么?您可以使用包 DBMS_SQL 获取列,但不能为此使用 %ROWTYPE。
-
@Wernfried Domscheit:嗯,我有一个可变数量的表和可变数量的字段。而且我有使用静态表名和静态(明确声明)行类型的当前过程。我必须更改或重写它以使用可变参数(表和行类型变量)。
标签: oracle stored-procedures plsql