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;
相关文章推荐
- sql关于group by的问题
- window7安装mysql出错
- 两种闪回查询的使用实验
- mysql的常用命令和增删改查语句
- Oracle锁
- SQL中的where条件,在数据库中提取与应用浅析
- OCM_Session7_11_安装oracle软件
- mysqli获取与释放的几种方法
- [SQL]sql介绍
- PL/SQL之DBMS_SQL程序包使用1
- MySQL数据库使用命令行备份|MySQL数据库备份命令
- 解决数据库乱码的问题
- rails mysql 日期格式问题
- sql语句收集
- 非关系型数据库——Mongodb
- sql语句收集
- mysql 查找结果中自动加序号列
- memcache简单介绍
- mysql 变量简介
- SQL--使用With As 解决查询嵌套的问题