PL/SQL编程3

--需求:创建存储过程,完成添加新雇员信息,包括编号、名称、薪水、工种和部门编号信息。
--(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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值