您的位置:首页 > 数据库

PL/SQL编程3

2014-03-23 20:46 483 查看
--需求:创建存储过程,完成添加新雇员信息,包括编号、名称、薪水、工种和部门编号信息。
--(1)如果输入雇员部门编号为空,则会抛出非空的异常。非预定义异常,错误编号:-1400
--(2)如果输入雇员部门编号不在部门表中,则会抛出违背外键约束的异常。非预定义异常,错误编号:-2291
--(3)如果在雇员表中已经存在输入的雇员编号,则会抛出主键重复的异常。预定义异常DUP_VAL_ON_INDEX
CREATE OR REPLACE PROCEDURE proc_add_emp(
eno NUMBER,                                         --输入参数,雇员编号
NAME VARCHAR2,                                      --输入参数,雇员名称
salary NUMBER,                                      --输入参数,雇员薪水
job VARCHAR2 DEFAULT 'CLERK',                       --输入参数,雇员工种默认'CLERK'
dno NUMBER                                          --输入参数,雇员部门编号
)
IS
dept_null_error EXCEPTION;                          --声明异常变量
PRAGMA EXCEPTION_INIT(dept_null_error,-1400);
emp_no_deptno EXCEPTION;                            --声明异常变量
PRAGMA EXCEPTION_INIT(emp_no_deptno,-2291);
BEGIN
INSERT INTO emp(empno,ename,sal,job,deptno) VALUES(eno,NAME,salary,job,dno);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
RAISE_APPLICATION_ERROR(-20000,'该雇员已存在');
WHEN dept_null_error THEN
RAISE_APPLICATION_ERROR(-20001,'部门编号不能为空');
WHEN emp_no_deptno THEN
RAISE_APPLICATION_ERROR(-20002,'不存在该部门编号');
END;

调用存储过程:

1)命令调用

用命令在SQL提示符下调用,使用EXECUTE语句来执行过程。

(1)执行存储过程。

执行存储过程的语法:

EXEC[UTE] procedure_name(parameters_list);
(2)参数的传递方式。

参数的传递方式可分为以下3种。

1、按位置传递参数

例如:

EXEC add_employee(1111,'MARY',2000,'MANAGER',10);
2、按名称传递参数

例如:

EXEC add_employee(dno=>10,name=>'MARY',salary=>2000,eno=>1112,job=>'MANAGER');
3、混合方式传递参数。

注意:使用位置表示法所传递的参数必须放在名称表示法所传递的参数前面。

(3)默认值的调用方法。

创建具有默认值的存储过程后,在存储过程调用时,如果没有为具有默认值的参数提供实际参数值,存储过程将使用参数的默认值。但当调用者为默认参数提供实际参数时,存储过程将使用实际参数值。

2)在PL/SQL块中调用

--方法一:用PL/SQL按位置调用添加雇员存储过程
DECLARE
emp_20000 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20000,-20000);
emp_20001 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20001,-20001);
emp_20002 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20002,-20002);
BEGIN
--异常,部门不存在
proc_add_emp(2111,'MARY',2000,'MANAGER',66);
--异常,部门为空
proc_add_emp(2111,'MARY',2000,'MANAGER',NULL);
--正确
proc_add_emp(2111,'MARY',2000,'MANAGER',10);
--异常,雇员编号重复
proc_add_emp(2111,'MARY',2000,'MANAGER',10);
EXCEPTION
WHEN emp_20000 THEN
dbms_output.put_line('emp_20000雇员编码不能重复');
WHEN emp_20001 THEN
dbms_output.put_line('emp_20001部门编码不能为空');
WHEN emp_20002 THEN
dbms_output.put_line('emp_20002不存在该部门编号');
END;
--方法二:用PL/SQL按名字调用添加雇存储过程
DECLARE
emp_20000 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20000,-20000);
emp_20001 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20001,-20001);
emp_20002 EXCEPTION;
PRAGMA EXCEPTION_INIT(emp_20002,-20002);
BEGIN
--异常,部门不存在
proc_add_emp(dno => 66,NAME => 'MARY2',salary => 2000,eno => 2112,job => 'MANAGER');
--异常,部门为空
proc_add_emp(dno => NULL,NAME => 'MARY2',salary => 2000,eno => 2112,job => 'MANAGER');
--正确
proc_add_emp(dno => 10,NAME => 'MARY2',salary => 2000,eno => 2112,job => 'MANAGER');
--异常,雇员编号重复
proc_add_emp(dno => 10,NAME => 'MARY2',salary => 2000,eno => 2112,job => 'MANAGER');
EXCEPTION
WHEN emp_20000 THEN
dbms_output.put_line('emp_20000雇员编码不能重复');
WHEN emp_20001 THEN
dbms_output.put_line('emp_20001部门编码不能为空');
WHEN emp_20002 THEN
dbms_output.put_line('emp_20002不存在该部门编号');
END;


存储过程的访问权限

存储过程创建之后,只有创建该存储过程的用户和管理员才有权调用它。其他用户如果要调用该存储过程,需要得到存储过程的EXECUTE权限。

--授予user1执行swap的权限

GRANT EXECUTE ON swap TO user1;
--授予user1执行swap的权限,同时user1也可以将该权限授予其他用户
GRANT EXECUTE ON swap TO user1 with grant option;
--撤销权限
REVOKE EXECUTE ON swap FROM user1;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: