我们有一个要求,我们必须在运行时将表名传递给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;
上面的代码会给我一个错误。有什么解决方法吗?表名可能会有所不同,并且不同的表将具有不同的结构。
答案 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
并获取列大小和类型定义。