数据库异常错误,函数和存储过程

----预定义异常情况的处理,只需在PL/SQL块的异常处理部分,直接引用相应的异常情况名,并对其完成相应的异常错误处理即可。
DECLARE
   v_mgr emp.mgr%TYPE :=7698;
   v_sal    emp.sal%TYPE;
BEGIN
   SELECT sal INTO v_sal FROM emp WHERE mgr=v_mgr;
   IF v_sal<=1500 THEN
        UPDATE emp SET sal=sal-200 WHERE empno=v_mgr;
        DBMS_OUTPUT.PUT_LINE('编码为'||v_mgr||'员工工资已更新!');     
   ELSE
        DBMS_OUTPUT.PUT_LINE('编码为'||v_mgr||'员工工资已经超过规定值!');
   END IF;
 EXCEPTION
   WHEN NO_DATA_FOUND THEN  
     DBMS_OUTPUT.PUT_LINE('数据库中没有编码为'||v_mgr||'的员工');
   WHEN TOO_MANY_ROWS THEN
     DBMS_OUTPUT.PUT_LINE('程序运行错误!请使用游标');
   WHEN OTHERS THEN
     DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;
select * from emp;

-----非预定义的异常处理
DECLARE
   v_deptno dept.deptno%TYPE :=&deptno;
   deptno_remaining EXCEPTION;
   PRAGMA EXCEPTION_INIT(deptno_remaining, -2292);
   /* -2292 是违反一致性约束的错误代码 */
BEGIN
   DELETE FROM dept WHERE deptno=v_deptno;
EXCEPTION
   WHEN deptno_remaining THEN
      DBMS_OUTPUT.PUT_LINE('违反数据完整性约束!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;  

---用户自定义的异常处理
DECLARE
   v_empno emp.empno%TYPE :=&empno;
   no_result  EXCEPTION;
BEGIN
   UPDATE emp SET sal=sal-100 WHERE empno=v_empno;
   IF SQL%NOTFOUND THEN
      RAISE no_result;
   END IF;
EXCEPTION
   WHEN no_result THEN
      DBMS_OUTPUT.PUT_LINE('你的数据更新语句失败了!');
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END;

---RAISE_APPLICATION_ERROR函数
declare
      v_deptid  departments.department_id%type := &no;
       v_dname departments.department_name%type;
  begin
      select department_name into v_dname from departments
       where department_id = v_deptid;
      dbms_output.put_line(v_dname);
 exception
      when others then
         raise_application_error(-20001 , 'department'||v_deptid||'does not exists');
 end;
select * from dept;
  --------创建函数的语法
 

CREATE OR REPLACE FUNCTION get_salary(
    Dept_no NUMBER, Emp_count OUT NUMBER)
    RETURN NUMBER
IS
            V_sum NUMBER;
BEGIN
    SELECT SUM(sal), count(*) INTO V_sum, emp_count
        FROM emp WHERE deptno=dept_no;
    RETURN v_sum;
EXCEPTION
     WHEN NO_DATA_FOUND THEN
        DBMS_OUTPUT.PUT_LINE('你需要的数据不存在!');
     WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);
END get_salary;

----位置表示法
DECLARE
    V_num NUMBER;
    V_sum NUMBER;
BEGIN
    V_sum :=get_salary(30, v_num);
    DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人            数:'||v_num);
END;
--------
create or replace function get_comm(
Dept_no NUMBER);
is
 b number;
BEGIN
    SELECT SUM(comm) INTO b
        FROM emp WHERE deptno=dept_no;
    RETURN b;
END get_comm;
------------
DECLARE
    a number;
  b number;
BEGIN
    b :=get_comm(30,a);
  DBMS_OUTPUT.PUT_LINE('30号部门奖金总和:'||b||',人数:'||a);
END;
----名称表示法
DECLARE
    V_num NUMBER;
    V_sum NUMBER;
BEGIN
    V_sum :=get_salary(emp_count => v_num, dept_no => 30);
    DBMS_OUTPUT.PUT_LINE('30号部门工资总和:'||v_sum||',人数:'||v_num);
END;

posted on 2017-07-25 16:12  杨朋超  阅读(239)  评论(0)    收藏  举报

导航