2015-10-22 34 views
-2

我想創建一個PL/SQL過程,需要通過遊標執行循環。我已經在oracle論壇上讀過,PL/SQL 8i不支持子標量查詢。我該如何解決在使用子標量查詢的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版本中使用subscalar查詢?

+3

Oracle 8i?真?這已經過時了十多年了 - 我很確定即使支持標量子查詢。你的問題到底是什麼?你得到的錯誤是什麼?你爲什麼首先使用遊標循環?大多數情況下,這樣一個遊標可以被一個更加高效的基於集合的解決方案替代,只需一個語句。 –

+0

我的客戶是一家大公司,所以建議數據庫升級只是爲了讓我的生活更輕鬆,這是不可能的(即使我認爲他們應該升級他們的系統)。 Oracle 8i附帶的PL/SQL版本缺少數據庫支持的一些功能,其中一個是子標量查詢。我想要做的是循環選擇的行來解析一個巨大的clob字段,並用該數據創建一個新表。巨大的CLOB是每行有數據的txt文件,即:字段X:值Y.我只需要恢復其中的一些字段。 – Negashion

+0

根據Tom Kyte的文章:「你也可以(因爲Oracle8i數據庫版本8.1.5,無論如何)包含一個標量子查詢」。 –

回答

1

PLS-00103告訴你問題在哪裏;第6列第49列。在這部分查詢中:

where eo.fecha_ins_tab > sysdate - and 

...某物在減號後缺少;大概你試圖從今天減去一些天數,但是你沒有提供這個數字。我沒有8i數據庫(可能並不令人意外),但我不記得曾經需要引用遊標查詢;如果你這樣做,我很確定分號需要在結束報價之外。但那也是導致早期第4行第5列錯誤的原因,它指向了開頭引用。

您還將嘗試插入最後一個值兩次;您需要在INSERT之前測試C1%NOTFOUND,之後FETCH(除非您正在使用批量收集)。當然,你插入一個虛擬值,但你會得到一個太多的行;與你真正的CLOB你會處理最後一次提取值兩次。

+0

Thanks Alex,you一直很有幫助用我的代碼的最新版本編輯帖子。 PL/SQL正在完成其執行,但它不插入任何行,而遊標基於返回的查詢。任何線索可能會發生的原因? – Negashion

+0

您確定查詢本身在同一會話中查找行,並且您提交了任何插入的數據?或者至少在找到它之前不會回滾它。您可以使用'dbms_output'來調試它是否查找數據以及它循環多少次。 –

+0

是的,我正在執行相同的查詢。我的理解是,斜槓/行爲提交,這是正確的嗎?我不應該在整個當前會話中查詢未提交的數據嗎?我添加了DBMS_OUTPUT.PUT_LINE('Loop');在插入和TOAD的DBMS輸出窗口下,即使輸出爲ON也不顯示任何內容。 – Negashion

相關問題