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