将变量传递给游标

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

【讨论】:

试图编辑我的答案,显然声明应该是: 这个更新声明绝对没问题。但我想在循环中使用它,因为我的表包含数百万条记录。那么有没有办法将显式声明的变量传递给游标呢? 为什么拥有数百万条记录意味着您需要循环?对数百万条记录的逐行处理将会非常缓慢!也许我不太明白您在这里还想达到什么目标。

以上是关于将变量传递给游标的主要内容,如果未能解决你的问题,请参考以下文章

为游标绑定变量参数化表名

如何在不使用游标的情况下一次将查询结果分配给多个变量?

在pl sql中的单个变量中传递两个或多个参数[重复]

oracle 游标的值如何赋给变量

REF CURSOR 总结

Mysql将存储过程执行后的值赋值给变量