Oracle 如何动态地将游标转移到过程中,并动态地设置rowtype变量?

Oracle 如何动态地将游标转移到过程中,并动态地设置rowtype变量?,oracle,stored-procedures,plsql,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_ta

我已使用动态设置游标和%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_表和my_光标基于同一个表从my_表中选择*


那么为什么会出现错误以及如何消除它呢?

由于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;
比如说。有XMLTYPE构造函数或DBMS_AQ排队和出列函数。你可以在那里传递任何物体

目前,您不能在自定义函数中使用此数据类型,因为它们还不是该语言的一部分,但也许有一天会有一些支持

只是一个修改soe参数的想法,它可以基本上保持相同的输出 你想要实现。基本上这里的功能我已经取代 返回类型为表类型,可在过程abd中调用 可以进行rest操作。如果有帮助,请告诉我


你不能接受这样做。ref cursor没有具体的定义。这不是一排桌子。你的目标是什么?您可以使用包DBMS\U SQL获取列,但不能使用%ROWTYPE。@Wernfried Domscheit:我有一个可变数量的表和可变数量的字段。我的当前过程使用静态表名和显式声明的静态行类型。我必须更改或重写它以使用可变参数表和行类型变量。@那个年轻人:谢谢你的回答:-希望一定会破灭…:-@阿夫拉吉特·罗伊:谢谢你的回答。它看起来不错,但我看到了一个缺点:-SQL对象创建创建类型源\表\对象是对象;-需要显式声明表。但在我的例子中,我不知道传入表的确切表结构。在每种情况下,我都可以拥有可变数量的列或相同数量但不同类型的列。
--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;