2012-11-21 122 views
0

我有萬畝程序問題,當我把插件,該插件插入重複的最後一個記錄表重複插入記錄程序

例子......「AAA」我得到了在表「AAA」與「AAA」行

當我把DBMS()...放在代碼中時,我得到了拖曳記錄 我在HistoriaDismissDate中使用觸發器和序列作爲列ID,但它們狀態良好。我檢查,如果我放棄了觸發和序列及其同樣的情況

我也用viewDate但這種觀點得到英里的一個記錄不是兩個

我的代碼對你的原始代碼

CREATE OR REPLACE PROCEDURE ChangeDismissDate 
IS 

      v_id VARCHAR2(11); 
      v_dateBhd DATE := TO_DATE('20491231','yyyymmdd'); 
      v_dateDismiss DATE := TO_DATE('20491231','yyyymmdd'); 
      v_login VARCHAR2(50); 
      last_id NUMBER :=0; 

     CURSOR cur IS 
       select EMP_NO, LOGIN, ODEJSCIE_BHD, ODEJSCIE_OLD FROM viewDate; 

     BEGIN 
         OPEN cur; 
          LOOP 
           FETCH cur INTO v_id,v_login,v_dateBhd,v_dateDismiss; 
            DBMS_OUTPUT.put_line(v_id || ' ' || v_login || ' ' || v_dateBhd || ' ' || v_dateDismiss); 
           UPDATE employee_tab SET DISMISS_DATE = v_dateBhd WHERE EMP_NO = v_id; 
           COMMIT; 

           INSERT INTO HistoriaDismissDate(CUSTOMER_ID,LOGIN, DATE_CHANGE, DATE_BHD, DATE_DISMISS) 
           VALUES(v_id,v_login, sysdate, v_dateBhd, v_dateDismiss); 
           COMMIT; 

          EXIT WHEN cur%NOTFOUND; 
          END LOOP; 
          CLOSE cur; 


    EXCEPTION 
    WHEN NO_DATA_FOUND 
    THEN 
     DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack); 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (DBMS_UTILITY.format_error_stack); 
    END; 
/
+2

把'退出當cur%NOTFOUND;'在'FETCH當前'後' –

+0

COOL :)非常感謝! – Przemek

回答

0

2提示:

1)光標是一個非常 PL/SQL的舊編程技術。傾向於使用FOR ... LOOP結構。它更乾淨,更不容易出錯!看看它是如何工作的:

CREATE OR REPLACE PROCEDURE ChangeDismissDate IS 
BEGIN 
    for cur in (select EMP_NO, LOGIN, ODEJSCIE_BHD, ODEJSCIE_OLD FROM viewDate) loop 

    DBMS_OUTPUT.put_line(cur.EMP_NO || ' ' || cur.login || ' ' || cur.ODEJSCIE_BHD || ' ' || cur.ODEJSCIE_OLD); 
    UPDATE employee_tab 
     SET DISMISS_DATE = cur.ODEJSCIE_BHD 
     WHERE EMP_NO = cur.EMP_NO; 

    INSERT INTO HistoriaDismissDate 
     (CUSTOMER_ID,LOGIN, DATE_CHANGE, DATE_BHD, DATE_DISMISS) 
    VALUES 
     (cur.EMP_NO, cur.LOGIN, sysdate, cur.ODEJSCIE_BHD, cur.ODEJSCIE_OLD,); 
    end loop; 
end; 
/

2)決不,我的意思是永遠不要把你的過程中提交。提交應該在調用程序塊或您的客戶端應用程序上完成。當你在你的過程中提交一個提交時,你會錯過運行後回滾的機會,如果他們想控制事務流,其他程序就不能調用它。