将变量传递给游标
Posted
技术标签:
【中文标题】将变量传递给游标【英文标题】:Passing variable to cursor 【发布时间】:2015-08-13 13:30:33 【问题描述】:我在将 for 循环变量传递给显式声明的游标时遇到了问题。这是 PL/SQL 代码:
DECLARE
count_total number := 0;
i number :=0;
ch varchar(10) := 'abc';
ch2 varchar(10) := 'xyz';
CURSOR cursor_sim_b IS **--identifying if value is garbage--**
select a1,a2, a3, a4, a5, a6,
trim(translate(a1,'0123456789',' ')),
trim(translate(a2,'0123456789',' ')),
trim(translate(a3,'0123456789',' ')),
trim(translate(a4,'0123456789',' ')),
trim(translate(a5,'0123456789',' ')),
trim(translate(a6,'0123456789',' '))
from temp_clean;
sim_b_rec cursor_sim_b%rowtype;
BEGIN
dbms_output.put_line('OUTSIDE the CURSOR ');
FOR sim_b_rec IN cursor_sim_b
LOOP
dbms_output.put_line('OUTSIDE the FOR LOOP ');
FOR i IN 1..6
LOOP
ch := 'a' ||i;
if sim_b_rec.ch is not null **--ERROR--**
then
BEGIN
execute immediate 'update temp_clean
set sim_b_rec.%ch = NULL';
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;
DBMS_OUTPUT.PUT_LINE('a'||i||'<' || ch || '>');
end if;
END LOOP;
END LOOP;
END;
/
收到以下错误: PLS-00302:必须声明组件“CH”
有没有办法将变量传递给光标?
【问题讨论】:
sim_b_rec 记录中没有 'ch' 元素。 @Gary_W 你能详细说明一下吗? 这一行:如果 sim_b_rec.ch 不是 null 。游标定义中没有“ch”。 @Gary_W 这是我的问题。我已经声明了一个变量“ch”,我想将它传递给游标,因为对于每个循环,它将存储一个不同的值,即 a1、a2、a3 等等。所以游标可以将值更新为 sim_b_rec.a1, sim_b_rec.a2 这可能吗? 【参考方案1】:怎么样:
update temp_clean
set a1=case when trim(translate(a1,'0123456789',' ')) is not null then null else a1 end,
a2=case when trim(translate(a2,'0123456789',' ')) is not null then null else a1 end,
a3=case when trim(translate(a3,'0123456789',' ')) is not null then null else a1 end,
a4=case when trim(translate(a4,'0123456789',' ')) is not null then null else a1 end,
a5=case when trim(translate(a5,'0123456789',' ')) is not null then null else a1 end,
a6=case when trim(translate(a6,'0123456789',' ')) is not null then null else a1 end
【讨论】:
试图编辑我的答案,显然声明应该是: 这个更新声明绝对没问题。但我想在循环中使用它,因为我的表包含数百万条记录。那么有没有办法将显式声明的变量传递给游标呢? 为什么拥有数百万条记录意味着您需要循环?对数百万条记录的逐行处理将会非常缓慢!也许我不太明白您在这里还想达到什么目标。以上是关于将变量传递给游标的主要内容,如果未能解决你的问题,请参考以下文章