Plsql 重复插入记录程序
我对在表中插入重复的最后一条记录的mu过程有问题 当我插入时的示例…'AAA'我找到了表'AAA'和'AAA'中的行 当我放置DBMS()时,已就位。。。密码里有两张记录 我在HistoriaDismissDate中对列ID使用触发器和序列,但它们状态良好。我检查我是否掉了触发器和序列,情况是否相同 我也使用viewDate,但此视图只获得一条记录,而不是两条记录 我的代码Plsql 重复插入记录程序,plsql,insert,duplicates,procedure,Plsql,Insert,Duplicates,Procedure,我对在表中插入重复的最后一条记录的mu过程有问题 当我插入时的示例…'AAA'我找到了表'AAA'和'AAA'中的行 当我放置DBMS()时,已就位。。。密码里有两张记录 我在HistoriaDismissDate中对列ID使用触发器和序列,但它们状态良好。我检查我是否掉了触发器和序列,情况是否相同 我也使用viewDate,但此视图只获得一条记录,而不是两条记录 我的代码 CREATE OR REPLACE PROCEDURE ChangeDismissDate IS v
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个提示: 1) 游标是PL/SQL上非常古老的编程技术。更喜欢用于。。。循环构造。它更干净,更不容易出错!看看它是如何工作的:
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) 决不,我的意思是决不在过程中放入提交。提交应该在调用程序块或客户端应用程序上完成。当您在过程中放入提交时,您将错过在运行它之后回滚的机会,如果其他过程想要控制事务流,则无法调用它 未找到cur%时放入
退出代码>紧跟在将cur提取到