Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用子标量查询的Oracle PL/SQL 8i中,如何解决循环游标的问题?_Sql_Oracle_Plsql - Fatal编程技术网

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

在使用子标量查询的Oracle PL/SQL 8i中,如何解决循环游标的问题?,sql,oracle,plsql,Sql,Oracle,Plsql,我试图创建一个PL/SQL过程,它需要通过游标执行for循环。我在oracle论坛上读到PL/SQL8i不支持子标量查询 这就是我到目前为止所做的: 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_r

我试图创建一个PL/SQL过程,它需要通过游标执行for循环。我在oracle论坛上读到PL/SQL8i不支持子标量查询

这就是我到目前为止所做的:

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列错误的原因,该错误指向开头的引用


您还将尝试插入最后一个值两次;除非您使用的是批量收集,否则您需要在插入之前、提取之后立即测试C1%NOTFOUND。当然,您正在插入一个伪值,但您将得到一个太多的行;使用真正的CLOB,您可以处理最后一个获取值两次。

Oracle 8i?真正地这已经过时超过十年了——我很确定,甚至它也支持标量子查询。你到底有什么问题?你的错误是什么?为什么要首先使用光标循环?大多数情况下,这样一个游标可以被一个更高效的基于集合的解决方案所取代,只需一条语句。我的客户是一家大公司,因此建议升级数据库以简化我的生活是不可能的,尽管我认为他们应该升级他们的系统。Oracle8i附带的PL/SQL版本缺少DB支持的一些功能,其中之一就是子标量查询。我试图做的是遍历所选的行来解析一个巨大的clob字段,并用该数据创建一个新表。巨大的CLOB是一个每行都有数据的txt文件,即:字段X:值Y。我只需要恢复其中的一些字段。根据Tom Kyte的文章:从Oracle8i Database 8.1.5版开始,您还可以包含标量子查询。那么,您会遇到什么错误?那么派生表呢?select*from select A、B、C、row_number over partition by C order by desc rn from T1,其中rn=1如果我回想起来,Oracle 8i仅支持from和select子句中的子查询。因此,将查询重写为联接。我会这样做作为回答,但我讨厌from子句中的逗号,Oracle 8i不支持现代显式连接语法。谢谢Alex,你帮了我很大的忙。我用最新版本的代码编辑了这篇文章。PL/SQL正在完成它的执行,但它没有插入任何行,而游标的查询是基于返回的。有什么线索可以解释为什么会发生这种情况吗?您确定查询本身会在同一会话中找到行,并且您正在提交任何插入的数据吗?或者至少在寻找它之前,我们没有将它回滚。您可以使用dbms_输出来调试它是否正在查找数据以及它循环了多少次。是的,我正在执行相同的查询。我的理解是斜杠/用作提交,对吗?我是否应该能够在当前会话中查询未提交的数据?我添加了DBMS_输出;在insert和TOAD的DBMS输出窗口下,即使输出打开,也不会显示任何内容。斜杠不会提交。斜杠执行当前SQL缓冲区。如果在同一会话中进行查询,您仍将看到未提交的更改,但除非提交数据,否则其他会话将不会看到。但是在循环之前和之后都要进行调试,以确保其正常工作。不过,似乎在查询中找不到任何数据。干杯,老兄,问题解决了。看来我甚至不需要使用光标毕竟哈哈。我还是学到了很多,下次我会做对的。问题是我没有提交数据。我认为没有必要为了能够在自己的会话中查询数据而提交,而slash负责了这一点。