oracle 存储过程实例-4

--错误处理部分。
--自定义异常处理
CREATE OR REPLACE PROCEDURE stu_proc
(
  --多个用逗号隔开
  v_id IN NUMBER
) IS
  --多个用分号隔开
  v_max_id NUMBER;
  v_name VARCHAR2(20);
  myerror EXCEPTION; 
BEGIN
  SELECT MAX(a.id) INTO v_max_id FROM student a;
  IF v_id>v_max_id THEN
    RAISE myerror;
  END IF;
  SELECT o.sname INTO v_name FROM student o WHERE o.id=v_id;
  dbms_output.put_line('学生名称为:'||v_name);
EXCEPTION
  WHEN myerror THEN 
    RAISE_APPLICATION_ERROR(-20010, 'v_id not exists!');
  WHEN NO_DATA_FOUND THEN 
    RAISE_APPLICATION_ERROR(-20011, 'ERROR:不存在!');
END stu_proc;
--自定义异常处理
CREATE OR REPLACE PROCEDURE stu_proc
(
  --多个用逗号隔开
  v_id IN NUMBER
) IS
  --多个用分号隔开
  v_max_id NUMBER;
  v_name VARCHAR2(20);
  v_raise EXCEPTION; 
BEGIN
  SELECT MAX(a.id) INTO v_max_id FROM student a;
  IF v_id>v_max_id THEN
    RAISE v_raise;
  END IF;
  SELECT o.sname INTO v_name FROM student o WHERE o.id=v_id;
  dbms_output.put_line('学生名称为:'||v_name);
EXCEPTION
  WHEN v_raise THEN 
    RAISE_APPLICATION_ERROR(-20010, 'v_id not exists!');
  WHEN NO_DATA_FOUND THEN 
    RAISE_APPLICATION_ERROR(-20011, 'ERROR:不存在!');
END stu_proc;


OTHERS表示除了声明外的任意错误。 SQLERRM是系统内置变量保存了当前错误的详细信息


EXCEPTION


   WHEN OTHERS THEN
      vs_msg := 'ERROR IN xxxxxxxxxxx_p('||is_ym||'):'||SUBSTR(SQLERRM,1,500);


   ROLLBACK;


   --把当前错误记录进日志表。


   INSERT INTO LOG_INFO(proc_name,error_info,op_date)
   VALUES('xxxxxxxxxxx_p',vs_msg,SYSDATE);
   COMMIT;
   RETURN;


你可能感兴趣的:(oracle)