【问题标题】:oracle - how to create an object type for an already existing tableoracle - 如何为已经存在的表创建对象类型
【发布时间】:2023-04-05 17:14:01
【问题描述】:

我们有一个要求,我们必须在运行时将表名传递给 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;

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

【问题讨论】:

标签: oracle object plsql types


【解决方案1】:

行类型声明必须是静态的(如果不是,编译器无法判断从中引用的字段是否有效)。

可能的解决方案是:

  • 在 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并获取列大小和类型定义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 2012-03-16
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多