2016-11-08 18 views
-1
set serveroutput on; 
DECLARE 
    CURSOR 
    IS 
    SELECT SVL_ID 
     FROM SALES_VEHICLES 
    WHERE SVL_N = 'some value';--314653; 

    TYPE SVD_TA IS TABLE OF VSALES%ROWTYPE; 
    SV SVD_TA; 
BEGIN 
    OPEN VSALES; 
    FETCH VSALES BULK COLLECT INTO SV LIMIT 1000; 
    CLOSE VSALES; 

    IF SV.COUNT() <> 0 
    THEN 
    FOR I IN 1..SV.COUNT() 
    LOOP 
     UPDATE SALES_VEHICLES 
      SET SVL_M = 'some value', 
       SVL_M = SVL_C_N 
     WHERE SVL_ID = I.SVL_ID; 

     COMMIT; 
    END LOOP; 
    END IF; 
    EXIT WHEN VSALES%NOTFOUND; 
    END LOOP; 
    CLOSE VSALES; 
END; 

我在調試時遇到了麻煩。錯誤在第32行第5列。如果你能幫助我解決這個問題,我將非常感激。ORA-06550:遇到關閉符號

+1

您正在關閉光標兩次。一次檢索後,一次最後。但是你是否使用光標來完成此操作?整個過程可以用一個'update'語句取代 - 這也將是一個很快的**,然後慢慢的逐行方法。 –

+0

我被要求不使用單個更新語句。我嘗試關閉遊標只有一次,我仍然得到ORA 06550錯誤。(遇到符號結束) – ishan

+1

沒有冒犯,但這是一個愚蠢的要求。爲什麼要做一些緩慢和不可擴展的方式? –

回答

0

你有雙行密切同裏邊反光標15和32

也許你並不想關閉就去拿了。

BEGIN 
    OPEN VSALES; 
    LOOP 
    FETCH VSALES BULK COLLECT INTO SV LIMIT 1000; 

    IF SV.COUNT() <> 0 
    THEN 
    FOR I IN 1..SV.COUNT() 
    LOOP 
     UPDATE SALES_VEHICLES 
      SET SVL_M = 'some value', 
       SVL_M = SVL_C_N 
     WHERE SVL_ID = SV(I).SVL_ID;; 

     COMMIT; 
    END LOOP; 
    END IF; 
    EXIT WHEN VSALES%NOTFOUND; 
    END LOOP; 
    CLOSE VSALES; 
END; 
+0

我嘗試關閉遊標只有一次,我仍然得到ORA 06550錯誤(遇到符號結尾) – ishan

+0

因爲你也有兩個'結束循環;'和只有一個'循環'。可能你在打開遊標後錯過循環@ishan – Kacper

+0

我也試過。它不工作。我會繼續嘗試。謝謝!!!! – ishan

0

我找到了解決方案。我錯過了以下內容。這是我改變

從本:

WHERE SVL_ID = I.SVL_ID; 

這樣:

WHERE SVL_ID = SV(I).SVL_ID; 
0

這似乎有點複雜得多,它需要的。對於一個普通的遊標循環,你可能只是這樣做:

begin 
    for r in (
     select svl_id 
     from sales_vehicles 
     where svl_n = 'some value' --314653; 
    ) 
    loop 
     update sales_vehicles 
     set svl_m = 'some value', svl_m = svl_c_n 
     where svl_id = r.svl_id; 
    end loop; 

    commit; 
end; 

或者,如果你真的想用一個數組(並採取比你討價還價它會採取更多的內存的機會):

declare 
    type svid_tt is table of sales_vehicles.svl_id%type; 
    l_svids svid_tt; 
begin 
    select svl_id bulk collect into l_svids 
    from sales_vehicles 
    where svl_n = 'some value';--314653; 

    if l_svids.count > 0 then 
     forall i in 1..l_svids.count 
      update sales_vehicles 
      set svl_m = 'some value', svl_m = svl_c_n 
      where svl_id = l_svids(i); 
    end if; 

    commit; 
end; 

您可以通過添加限制子句和循環以及檢查批量異常等來使陣列版本更健壯。

相關問題