Exception PL/SQL异常不会引发

Exception PL/SQL异常不会引发,exception,plsql,Exception,Plsql,我是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_numbe

我是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;
  • 我想使用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;
  • 即使我输入了无效数据,也不会引发异常

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

我的代码:

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;
声明
empno编号;
艾娜瓦查尔2(30);
job Varchar2(30);
经理编号;
雇佣日期;
sal数;
通信号码;
deptno编号;
确认VARCHAR2(3);
负数异常;
无效的_日期异常;
开始
插入emp
价值观(&empno,&ename,&job,&mgr,&hiredate,&sal,&comm,&deptno);
如果empno<0或mgr<0或sal<0或comm<0或deptno<0,则
提高负数;
ELSIF hiredate>SYSDATE然后
提出失效日期;
如果结束;
如果“&确认”=“是”,则提交;
否则回滚;
如果结束;
例外情况
什么时候是负数呢
dbms_output.put_行('数字不能为负数');
什么时候开始
dbms_output.put_line('不能是未来日期');
结束;

只需对当前代码稍作修改:

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;
声明
empno编号:=&empno;
ename Varchar2(30):='&ename';
job Varchar2(30):='&job';
经理编号:=&经理;
雇佣日期:=截止日期(“&hiredate”,“mm/dd/yyyy”);
sal编号:=&sal;
通信号码:=&comm;
部门编号:=&deptno;
确认VARCHAR2(3);
开始
插入emp
价值观(empno、ename、job、mgr、hiredate、sal、comm、deptno);
如果empno<0或mgr<0或sal<0或comm<0或deptno<0,则
RAISE_应用程序_错误('-20001','数字不能为负!');
ELSIF hiredate>SYSDATE然后
RAISE_应用程序_错误('-20002','不能是未来日期!');
如果结束;
确认:='&确认';
如果在(‘是’、‘y’)中降低(确认),则
犯罪
其他的
回降;
如果结束;
结束;
最后一部分-
确认
不可能使用纯PL/SQL。代码所做的是在执行开始时获取
confirm
的值以及其他变量。为此,您应该构建一个前端,在发出DML之前控制程序流。

DECLARE
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;
empno编号:=10; ename Varchar2(30):=“sinha”; job Varchar2(30):=“ITTTT”; 经理编号:=100; 雇佣日期:=截止日期(“2014年9月9日”、“年月日”); sal编号:=2000; 通信号:=50; 部门编号:=10; 无效的_emp异常; 无效的_日期异常; 开始 插入模板 价值观(empno、ename、job、mgr、hiredate、sal、comm、deptno); 如果empno<0或mgr<0或sal<0或comm<0或deptno<0,则 提出无效的环境管理计划; ELSIF hiredate>SYSDATE然后 提出失效日期; 如果结束; 例外 什么时候无效 dbms_output.put_行('数字不能为负数'); 什么时候开始 dbms_output.put_line('不能是未来日期'); 结束;

这就是如何根据需要使用用户定义的异常

异常
块中清除异常。如果您希望将它们提升到调用方,则需要重新提升them@a_horse_with_no_nameswalling是什么意思?我该如何重新饲养它们?对不起,我的意思是“吞咽”。有关引发异常的详细信息,请参阅手册:我不明白,我完全按照它所说的做:1。宣布2.3。handle您是从-sqlplus运行此操作的?您是否打开了serveroutput?您再次吃掉了所有异常。很抱歉,如果您为此定义了异常,那么即使您将confirm设置为“Y”,它也会被异常缓存,并且不会被提交,因此我没有使用confirm。在您的
exception
块中,在引发
invalid_emp
invalid_date
之后,您所做的只是显示一条错误消息。您没有停止程序继续执行
插入操作
。只需使用
RAISE在您的异常块中。您使用的是pragma exception init,即使此行为保持不变,我也不会停止任何要执行的dml。此外,如果您希望块中的commit and rollback语句在“successful”之后DML然后您可以使用确认部分。问题是要使用用户定义的异常,所以我使用了它。