2014-03-06 85 views
0

創建如下面的過程的一個:PLS-00103:出現符號 「FETCH」 期待當followingg

錯誤(33,4):

create or replace 
    PROCEDURE TEST AS 
    BEGIN 
    DECLARE 
    c_service process_state.service%type; 
    c_tr_source process_state.tr_source%type; 

    CURSOR c_process_state is 
     SELECT service, tr_source FROM process_state; 

      OPEN c_process_state; 
      LOOP 
      FETCH c_process_state into c_service, c_tr_source; 
      insert into process_state_archive values (c_service, c_tr_source); 
      commit; 
      EXIT WHEN c_process_state%notfound; 
      END LOOP; 
    CLOSE c_process_state; 
    END TEST; 

編譯我跑進一些錯誤後:PLS-00103:期待以下某種情況時遇到符號「FETCH」:常量異常表long double ref char time timestamp間隔日期

錯誤(44,4):PLS-00103:遇到符號「CLOSE」當期待以下其中一種情況時:end not pragma final instantiable volgorde overridi ng靜態成員構造函數圖

任何人都可以請解釋一下這個問題嗎?我是初學者,學習SQL。

回答

1

1)你應該申報光標開始之前,而不是之後而存在時,應立即提取

create or replace 
    PROCEDURE TEST AS 

    c_service process_state.service%type; 
    c_tr_source process_state.tr_source%type; 
CURSOR c_process_state is 
     SELECT service, tr_source FROM process_state; 
    BEGIN 

      OPEN c_process_state; 
      LOOP 
      FETCH c_process_state into c_service, c_tr_source; 
      EXIT WHEN c_process_state%notfound; 
      insert into process_state_archive values (c_service, c_tr_source); 
      commit; 

      END LOOP; 
    CLOSE c_process_state; 
    END TEST; 

2後),您的任務似乎可以在一條語句,而不是大量的用遊標代碼來解決:

INSERT INTO process_state_archive select service, tr_source FROM process_state; 
+0

該死,遲到30秒。 –

+0

感謝您寶貴的建議..我在process_state表中有8百萬條記錄。我必須a)保存最近3個月的數據在process_state中。 b)將過去4到12個月的數據存檔在process_state_archival中 c)在12個月之前的所有數據都需要清除。我的問題是我們可以使用「insert into --- select * from - statement」來滿足上述情況嗎? – vkreddy

+0

是的,你可以添加WHERE過濾器來選擇語句,只獲取你需要的數據。 –

相關問題