数据库异常错误,函数和存储过程
----预定义异常情况的处理,只需在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;
浙公网安备 33010602011771号