我用动态设置游标和%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;”对行进行了加权。作为错误来源。 varibale“source_table”和“my_cursor”基于同一个表(select * from my_table)。
那么为什么会出现错误以及如何将其删除?
答案 0 :(得分:0)
由于PL / SQL是静态类型的,编译器需要在编译时知道所有变量的类型。
因此没有高级元编程的余地。我担心你不能这样做。
但是,SYS.STANDARD
处有泛型类型,还有一些内部函数接受它们。
-- The following data types are generics, used specially within package
-- STANDARD and some other Oracle packages. They are protected against
-- other use; sorry. True generic types are not yet part of the language.
type "<ADT_1>" as object (dummy char(1));
type "<RECORD_1>" is record (dummy char(1));
type "<TUPLE_1>" as object (dummy char(1));
type "<VARRAY_1>" is varray (1) of char(1);
type "<V2_TABLE_1>" is table of char(1) index by binary_integer;
type "<TABLE_1>" is table of char(1);
type "<COLLECTION_1>" is table of char(1);
type "<REF_CURSOR_1>" is ref cursor;
以"<ADT_1>"
为例。有XMLTYPE构造函数或DBMS_AQ ENQUEUE和DEQUEUE函数。你可以在那里传递任何类型的对象。
现在你不能在自定义函数中使用这个数据类型,因为它们“还不是语言的一部分”,但也许有一天会有一些支持。
答案 1 :(得分:0)
只是想要修改soe params,它基本上可以输出相同的 你想实现。基本上这里我已经取代了功能 RETURN类型为TABLE TYPE,可以在Procedure abd中调用 休息操作可以完成。让我知道这是否有帮助
--SQL Object creation
CREATE TYPE source_table_obj IS OBJECT
(<TABLE_ATTRIBITES DECLARATION>);
--SQL TABLE type creation
CREATE TYPE source_table_tab IS TABLE OF source_table_obj;
--Function creation with nested table type as RETURN type
CREATE OR REPLACE FUNCTION ddp_get_allitems(
source_table IN VARCHAR2)
RETURN source_table_tab
AS
src_tab source_table_tab;
BEGIN
SELECT * BULK COLLECT INTO src_tab FROM source_table;
RETURN src_tab;
END ddp_get_allitems;
-- Using Function's OUT param as an IN Param for Procedure an do all the requird processing
CREATE OR REPLACE PROCEDURE process(
source_table IN VARCHAR2,
src_tab_in IN source_table_tab)
IS
BEGIN
FOR i IN src_tab_in.FIRST..src_tab_in.LAST
LOOP
dbms_output.put_line('job processing');
END LOOP;
END process;