pl/sql 处理重复
pl/sql handling duplicate
你好,当 table 中存在其他具有相同姓氏的工作人员时,我必须制作插入新行并执行回滚的程序。
我在网上和这里查过,但找不到具体信息。我必须使用异常 dup_val_on_index
create or replace PROCEDURE insert_date(
p_id IN WORKERS.ID%TYPE,
p_PESEL IN WORKERS.PESEL%TYPE,
p_name IN WORKERS.NAME%TYPE,
p_surname IN WORKERS.SURNAME%TYPE,
p_date_birth IN WORKERS.DATE_BIRTH%TYPE,
p_salary IN WORKERS.SALARY%TYPE)
IS
BEGIN
INSERT INTO WORKERS VALUES (p_id, p_PESEL,p_name,p_surname, p_date_birth,p_salary);
COMMIT;
EXCEPTION
when DUP_VAL_ON_INDEX then
dbms_output.put_line('DUP_VAL_ON_INDEX exception.');
ROLLBACK;
END;
BEGIN
insert_date(5,92060111111,'wikta','dss',TO_DATE('2003/07/10', 'yyyy/mm/dd'),100);
END;
您只需要检查 table 中是否已经存在 SURNAME。如果不存在,那么您可以插入并提交该行。试试这个:
create PROCEDURE insert_date(
p_id IN WORKERS.ID%TYPE,
p_PESEL IN WORKERS.PESEL%TYPE,
p_name IN WORKERS.NAME%TYPE,
p_surname IN WORKERS.SURNAME%TYPE,
p_date_birth IN WORKERS.DATE_BIRTH%TYPE,
p_salary IN WORKERS.SALARY%TYPE)
IS
varTmp NUMBER:=0;
BEGIN
-- check here whether the surname already exist or not
SELECT decode((select max(t.d) from (SELECT 1 d FROM WORKERS WHERE SURNAME = p_surname) t),1, 2) INTO varTmp FROM dual;
-- insert
IF (varTmp <> 2) THEN
INSERT INTO WORKERS VALUES (p_id, p_PESEL,p_name,p_surname, p_date_birth,p_salary);
ELSE
DBMS_OUTPUT.PUT_LINE('Row can not be inserted.');
END IF;
COMMIT;
EXCEPTION
when DUP_VAL_ON_INDEX then
dbms_output.put_line('DUP_VAL_ON_INDEX exception.');
ROLLBACK;
END;
我试过你的代码,没有问题,它按预期工作(执行两次时属于 dup_val_on_index 异常)
我能想到的唯一错误是您没有定义主键或唯一键。
所以你的 table 定义应该是例如像这样
create table workers
( id number,
PESEL number,
name varchar2(20),
surname varchar2(20),
date_birth date,
salary number,
CONSTRAINT worker_pk PRIMARY KEY (id)
)
或者您可以将主键或唯一键添加到现有列
alter table workers
add constraint PK_workers primary key (ID);
你好,当 table 中存在其他具有相同姓氏的工作人员时,我必须制作插入新行并执行回滚的程序。
我在网上和这里查过,但找不到具体信息。我必须使用异常 dup_val_on_index
create or replace PROCEDURE insert_date(
p_id IN WORKERS.ID%TYPE,
p_PESEL IN WORKERS.PESEL%TYPE,
p_name IN WORKERS.NAME%TYPE,
p_surname IN WORKERS.SURNAME%TYPE,
p_date_birth IN WORKERS.DATE_BIRTH%TYPE,
p_salary IN WORKERS.SALARY%TYPE)
IS
BEGIN
INSERT INTO WORKERS VALUES (p_id, p_PESEL,p_name,p_surname, p_date_birth,p_salary);
COMMIT;
EXCEPTION
when DUP_VAL_ON_INDEX then
dbms_output.put_line('DUP_VAL_ON_INDEX exception.');
ROLLBACK;
END;
BEGIN
insert_date(5,92060111111,'wikta','dss',TO_DATE('2003/07/10', 'yyyy/mm/dd'),100);
END;
您只需要检查 table 中是否已经存在 SURNAME。如果不存在,那么您可以插入并提交该行。试试这个:
create PROCEDURE insert_date(
p_id IN WORKERS.ID%TYPE,
p_PESEL IN WORKERS.PESEL%TYPE,
p_name IN WORKERS.NAME%TYPE,
p_surname IN WORKERS.SURNAME%TYPE,
p_date_birth IN WORKERS.DATE_BIRTH%TYPE,
p_salary IN WORKERS.SALARY%TYPE)
IS
varTmp NUMBER:=0;
BEGIN
-- check here whether the surname already exist or not
SELECT decode((select max(t.d) from (SELECT 1 d FROM WORKERS WHERE SURNAME = p_surname) t),1, 2) INTO varTmp FROM dual;
-- insert
IF (varTmp <> 2) THEN
INSERT INTO WORKERS VALUES (p_id, p_PESEL,p_name,p_surname, p_date_birth,p_salary);
ELSE
DBMS_OUTPUT.PUT_LINE('Row can not be inserted.');
END IF;
COMMIT;
EXCEPTION
when DUP_VAL_ON_INDEX then
dbms_output.put_line('DUP_VAL_ON_INDEX exception.');
ROLLBACK;
END;
我试过你的代码,没有问题,它按预期工作(执行两次时属于 dup_val_on_index 异常)
我能想到的唯一错误是您没有定义主键或唯一键。 所以你的 table 定义应该是例如像这样
create table workers
( id number,
PESEL number,
name varchar2(20),
surname varchar2(20),
date_birth date,
salary number,
CONSTRAINT worker_pk PRIMARY KEY (id)
)
或者您可以将主键或唯一键添加到现有列
alter table workers
add constraint PK_workers primary key (ID);