繁体   English   中英

如何在使用子标量查询的 Oracle PL/SQL 8i 中循环游标?

[英]How can I workaround looping a cursor in Oracle PL/SQL 8i which uses a subscalar query?

我正在尝试创建一个需要通过游标执行 for 循环的 PL/SQL 过程。 我在 oracle 论坛中读到 PL/SQL 8i 不支持子标量查询。

这是我到目前为止:

DECLARE
   CURSOR C1
   IS
    SELECT texto,id_evento,clave_evento FROM gegf.eventos_omega_rima WHERE id_evento IN
        (select max(eo.id_evento)  from gegf.eventos_omega_rima eo, correctivo_rima.equipos b 
            where eo.fecha_ins_tab > sysdate - 25/24 and eo.fecha_ins_tab < sysdate - 1/24  and upper(eo.ORIGEN) = upper(b.nodo) and upper(b.red) = 'RIMA' group by eo.clave_evento);
    r_emp C1%ROWTYPE;

BEGIN

    OPEN C1;

    LOOP 
        FETCH c1 INTO r_emp;
        EXIT WHEN C1%NOTFOUND;        
        INSERT INTO CORRECTIVO_RIMA.T_CLOB VALUES (r_emp.TEXTO);
    END LOOP;
   CLOSE c1;
END;
/

我如何解决无法在我使用的 PL/SQL 版本中使用子标量查询的问题?

PLS-00103 告诉您问题出在哪里; 第 6 行第 49 列。在您查询的这一部分中:

where eo.fecha_ins_tab > sysdate -  and

... 减号后缺少某些内容; 大概你想从今天减去一些天数,但你没有提供那个数字。

我不再有 8i 数据库了(也许并不奇怪),但我不记得曾经需要引用游标查询; 如果你这样做,我很确定分号需要在结束语之外。 但这也是导致前面第 4 行第 5 列错误的原因,该错误指向那个开头引用。

您还将尝试两次插入最后一个值; 您需要在INSERT之前测试C1%NOTFOUND ,在FETCH之后立即测试(除非您使用批量收集)。 当然,您插入的是一个虚拟值,但是您会得到太多行; 使用您的真实 CLOB,您将处理最后一次提取值两次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM