动态更改oracle游标中的列

Posted

技术标签:

【中文标题】动态更改oracle游标中的列【英文标题】:dynamically change column in oracle cursor 【发布时间】:2017-12-28 12:58:57 【问题描述】:

我在一个表中有 50 列,需要更新每一列。 尝试下面的 plsql 代码。 (评论更新部分正在工作)。

但动态生成的列不接受。 (PL/SQL:ORA-01747:无效的 user.table.column、table.column 或列规范) 有人可以帮忙吗?

DECLARE
cursor udas is
select 5109 as udaid from dual
union all    
select 8209 as udaid from dual;           
BEGIN
for uda in udas loop
DECLARE
cursor c1 is
select 
x.item, x.uda_id, x.uda_value, x.uda_value_desc 
from 
hp2_uda_data x 
where 
x.uda_type='LOV'
and x.uda_id=uda.udaid;
begin    
for i in c1 loop
begin
/*update testtable set item_uda_5109_v=i.uda_value, 
item_uda_5109_d=i.uda_value_desc where item_code=i.item;*/
update testtable set 'item_uda_'||uda.udaid||'_v'=i.uda_value, 
'item_uda_'||uda.udaid||'_d'=i.uda_value_desc where item_code=i.item;
end;
end loop;
commit;
end;
end loop;
END;

【问题讨论】:

【参考方案1】:

动态代码需要execute immediate:

execute immediate
'update testtable
 set    item_uda_'||uda.udaid||'_v = :b1
      , item_uda_'||uda.udaid||'_d = :b2
 where  item_code = :b3'
using i.uda_value, i.uda_value_desc, i.item;

在变量中构造动态代码很有用,以便在发生故障时报告或记录它。

我还建议将 code indentation 作为使代码可读的有用技术。

【讨论】:

非常感谢。真的很有帮助。 很高兴它有帮助,但“谢谢”cmets 不鼓励这样做:***.com/help/someone-answers

以上是关于动态更改oracle游标中的列的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PLSQL 中使用游标的动态列名

从 Oracle 游标批量收集列的子集

如何实现Oracle数据库中的动态游标

oracle 动态游标 传参的问题

Oracle动态游标实现动态SQL循环遍历,和静态游标的比较。

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常