0

我对在表中插入重复的最后一条记录的 mu 过程有问题

例如,当我输入 INSERT .....'AAA' 我得到了表 'AAA' 和 'AAA' 中的行

当我将 DBMS()... 放入代码中时,我得到了两条记录,我在 HistoriaDismissDate 中使用触发器和序列作为列 ID,但它们状况良好。我检查我是否删除了触发器和序列以及它的相同情况

我也使用 viewDate 但这个视图得到 mi ONE 记录不是两个

我的代码

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;
/
4

1 回答 1

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)从不,我的意思是永远不要在你的程序中提交。提交应该在调用者块或您的客户端应用程序上完成。当你在你的过程中放置​​一个提交时,你错过了在运行它之后回滚的机会,并且如果其他过程想要控制事务流,它们就无法调用它。

于 2012-12-07T18:44:34.063 回答