oracle-如何为已存在的表创建对象类型

时间:2018-10-25 01:18:44

标签: oracle object plsql types

我们有一个要求,我们必须在运行时将表名传递给pl / SQL对象。

下面是示例

create or replace FUNCTION ABC
(P_TABLE VARCHAR2) RETURN NUMBER IS 
C_REFERENCE SYS_REFCURSOR;
V_TABLE VARCHAR2(50):=P_TABLE;
V_C_REF v_table%rowtype;
BEGIN
OPEN C_REFERENCE FOR 'SELECT * FROM '||V_TABLE||;
LOOP
FETCH C_REFERENCE INTO V_C_REF;
EXIT WHEN C_REFERENCE%NOTFOUND;
/*some processing*/
END LOOP;
return(1);
END;

上面的代码会给我一个错误。有什么解决方法吗?表名可能会有所不同,并且不同的表将具有不同的结构。

1 个答案:

答案 0 :(得分:0)

rowtype声明必须是静态的(如果不是,则编译器无法确定从其引用的字段是否有效)。

可能的解决方案是:

  • 在INTO子句中放入逗号分隔的变量列表:

    FETCH C_REFERENCE INTO var1, var2, var3;
    
  • 创建自己的记录

     TYPE  V_C_REF IS RECORD ( col1 VARCHAR2(20), col2 VARCHAR2(25) ); 
    
  • 使用具有预期结构的表

    vc_ref table1%ROWTYPE;
    
  • 编写一个PL / SQL函数以查询dba_tab_columns并获取列大小和类型定义。