我是PL / SQL的新手,我一直在努力解决这个问题太久了所以我想我会在这里问:
我想要实现的目标:
什么行不通:
即使我输入了无效数据,也不会引发异常。
现在它要求用户在询问数据的同时进行确认。我希望它在输入后和检查后询问 正确性
我的代码:
DECLARE
empno NUMBER;
ename Varchar2(30);
job Varchar2(30);
mgr NUMBER;
hiredate DATE;
sal NUMBER;
comm NUMBER;
deptno NUMBER;
confirm VARCHAR2(3);
negative_number EXCEPTION;
invalid_date EXCEPTION;
BEGIN
INSERT INTO emp
VALUES (&empno, '&ename', '&job', &mgr, '&hiredate', &sal, &comm, &deptno);
IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN
RAISE negative_number;
ELSIF hiredate > SYSDATE THEN
RAISE invalid_date;
END IF;
IF '&confirm' = 'yes' THEN commit;
ELSE rollback;
END IF;
EXCEPTION
WHEN negative_number THEN
dbms_output.put_line('number cannot be negative');
WHEN invalid_date THEN
dbms_output.put_line('cannot be future date');
END;
答案 0 :(得分:2)
对您现有的代码进行一点修改:
DECLARE
empno NUMBER := &empno;
ename Varchar2(30) := '&ename';
job Varchar2(30) := '&job';
mgr NUMBER := &mgr;
hiredate DATE := TO_DATE('&hiredate', 'mm/dd/yyyy');
sal NUMBER := &sal;
comm NUMBER := &comm;
deptno NUMBER := &deptno;
confirm VARCHAR2(3);
BEGIN
INSERT INTO emp
VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno);
IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN
RAISE_APPLICATION_ERROR ('-20001', 'Number cannot be negative!');
ELSIF hiredate > SYSDATE THEN
RAISE_APPLICATION_ERROR ('-20002', 'Cannot be future date!');
END IF;
confirm := '&confirm';
IF lower(confirm) IN ('yes', 'y') THEN
commit;
ELSE
rollback;
END IF;
END;
最后一部分 - confirm
不可能使用纯PL / SQL。代码所做的是在执行开始时获取confirm
的值以及其他变量。你应该做的是建立一个前端,在发布DML之前控制程序的流程。
答案 1 :(得分:0)
DECLARE
empno NUMBER := 10;
ename Varchar2(30) := 'sinha';
job Varchar2(30) := 'ITTTT';
mgr NUMBER := 100;
hiredate DATE := TO_DATE('09/09/2014', 'mm/dd/yyyy');
sal NUMBER := 2000;
comm NUMBER := 50;
deptno NUMBER := 10;
invalid_emp exception;
invalid_date exception;
BEGIN
INSERT INTO empl
VALUES (empno, ename, job, mgr, hiredate, sal, comm, deptno);
IF empno < 0 OR mgr < 0 OR sal < 0 OR comm < 0 OR deptno < 0 THEN
RAISE invalid_emp;
ELSIF hiredate > SYSDATE THEN
RAISE invalid_date;
END IF;
exception
when invalid_emp then
dbms_output.put_line('number cannot be negative');
when invalid_date then
dbms_output.put_line('cannot be future date');
END;
这是您可以根据需要使用用户定义的异常的方法