子程序的概述:
—— 子程序是一个被命名的PL/SQL块,被编译好并存储在了数据库当中。
笔者在学习的过程中发现:在掌握了PL/SQL块以及Cursor之后,便能够解决一些较为复杂的业务逻辑了,但是同时也发觉这样的一段代码块只是“一次性产物”,如何能够让代码块体现出复用性? 无疑,子程序就能很好的解决这样问题。子程序不仅实现了复用性,同时还具备安全性、可维护性的优点,当提起子程序,引出的其一便是【过程】。
过程:用于完成某种任务的子程序;创建一个过程大大简化了程序的开发。(但是众所周知,越是在底层的地方解决业务逻辑,就越是难以维护)
如何创建过程[创建过程的语法]:
1 create [or replace] procedure <procedure_name>[(parameter list)] 2 as|is 3 <local variable declaration> 4 begin 5 <executable statements> 6 [exception <exception handlers>] 7 end; 8 9 --需要注意的是过程体内不可以select不可用于查询,而只做赋值作用 select ... into param form ...
首先尝试,创建过程来实现一个功能:查询出emp表中最高薪资以及最低薪资分别是多少;
/* create or replace procedure 过程名[(参数列表)] as|is 申明变量 begin 可执行部分 exception 例外处理 end; */ --创建"查询出emp表中最高薪资自己最低薪资分别是多少"的过程 create or replace procedure proc_max_min as v_max emp.sal%type; v_min emp.sal%type; begin select max(sal),min(sal) into v_max,v_min from emp; dbms_output.put_line('最高薪资:'||v_max); dbms_output.put_line('最低薪资:'||v_min); end;
非常的简单,并没有什么难度。接下来再写几个较为简单,但是带有参数的过程。
/*过程中的参数有三种类型:in , out , in out in : 默认的参数类型,作输入 out : 作输出 in out : 可输入,可输出 */ --根据传入的薪资范围,统计在这个范围内的有多少人; create or replace procedure proc_checksal( v_start emp.sal%type, v_end emp.sal%type ) as v_count numer; begin select count(*) into v_count from emp where sal between v_start and v_end; dbms_output.put_line('在指定薪资范围内的人数统计为:'||v_count); end; /* 请查询出员工待遇最高的员工姓名(out参数) */ create or replace procedure proc_checkname( v_name out emp.ename%type ) as begin select ename into v_name from emp where sal=( select max(sal) from emp ); end; -----调用----- declare v_name emp.ename%type; begin proc_checkname(v_name); dbms_output.put_line('最高工资员工姓名是:'||v_name); end;
需要注意的是,过程创建之后,只属于当前创建用户,而其他非DBA用户想要调用这个过程是不具备权限的。必须由DBA或过程创建角色授予其他角色过程的execute权限才可以调用,具体的授权方法如下:
grant execute on procedure_name to user_name
过程创建之后,还可以通过user_objects查看,如果想要查看源码可以通过user_source查看;
select * from user_objects; select name,line,text from user_source where name = 'PROCEDURE_NAME'
如果要删除一个过程可以使用drop
drop procedure procedure_name;