PL / SQL异常不会引发

时间:2013-12-11 16:47:12

标签: exception plsql

我是PL / SQL的新手,我一直在努力解决这个问题太久了所以我想我会在这里问:

我想要实现的目标:

  • 我想使用pl / sql将新员工插入到我的'emp'表中 块。
  • 我希望从键盘输入数据。
  • 然后使用例外检查数据是否正确。
  • 之后,我希望用户确认写“是”或“否”。

什么行不通:

  • 即使我输入了无效数据,也不会引发异常。

  • 现在它要求用户在询问数据的同时进行确认。我希望它在输入后和检查后询问 正确性

我的代码:

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;

2 个答案:

答案 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;

这是您可以根据需要使用用户定义的异常的方法