2016-11-23 38 views
0

是否可以声明带有表格名称的光标作为参数,然后通过它循环?带表格参数的光标

我想是这样的:

create or replace procedure p_update_something as 

v_tab varchar2(100) := my_table; 
v_name varchar2(100) := my_name; 

cursor c_global (l_tab in varchar2, l_name in varchar2) is 
    select * from l_tab -- [here points the error] 
    where substr(comp_id, 1,2) in (l_name); 

begin 
    for r in c_global(v_tab, v_name) loop 
    [update statement] 
    end loop; 

end p_update_something; 

,但在编译时我收到提示:

ORA-00942: table or view does not exist

在游标声明(标注在上面的代码为[这里指出错误] )。

任何人都知道它有什么问题吗?

+0

出于好奇,如果所有表都具有相同的结构,为什么还需要更改表名?这不是因为你正在创建和删除表,是吗?此外,您可能最有可能将更新语句和游标组合在一个更新或合并语句中。 – Boneist

+0

我需要循环遍历少数数据库(每个代表其他国家/地区)的类似表格并更新我的主表格。此外还需要在10k行后提交,这就是为什么我不能使用简单更新。干杯。 – massko

回答

1

没有名为'l_tab'的表。 (编辑:我得到你想要做的,我只是从编译器的角度来描述它。)

要在运行时改变表格,你需要dynamic sql,例如,

open c for 'select * from ' || l_tab; 

(有没有for r in c loop游标循环建设为明确打开的游标或者,让你的下一个挑战将是如何管理一个未知的表结构,除非您的使用情况下可以保证为l_tab通过了所有表都将有一个共同的结构)

+0

是的,我知道有没有这样一个表 - 我想通过它的名字作为一个变量;我的表)的结构将是相同的,所以这不是一个问题,而不是一个问题:)我知道我可以使用OPEN FOR, FETCH结构,但是如果这种情况是可能的,我就会徘徊 - 所以答案是:“不可能用表名参数声明游标”对吧? – massko

+1

正确的是,您不能在静态游标中使用变量作为表名或列名,例如'for r in(select * from l_tab)',其中'l_tab'是一个变量。编译器需要在编译时知道这些事情。 –