如何动态地将光标传递给过程并动态设置rowtype变量?

时间:2015-12-17 16:49:09

标签: oracle stored-procedures plsql

我用动态设置游标和%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)。

那么为什么会出现错误以及如何将其删除?

2 个答案:

答案 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;