Oracle存储过程创建及调用

为了测试Oracle存储过程,我分别在window和Linux上都装了数据库的服务端,但刚开始我并不知道我装的是啥,也不知道服务端,客户端,客户端工具都分别是干啥的。刚开始,我在Linux系统上折腾了两天,把Oracle的服务端装好了,但我发现我没Scott用户,于是上网找教程,但奇怪的是运行脚本也没用,翻了好多个博客,偶然发现是因为我在安装时选择了装成容器型数据库,其实我感觉也没啥影响,但碍于网上容易找到的资料都是有Scott用户的,于是我删了数据库,开始重装,我只删了示例,然后装好之后,就碰到了各种问题,因为和原来的实例名不一样,我刚开始连不上数据库,然后折腾了半天,我连上了一个idle实例,运行脚本时报错,提示我没log on 还是啥的,我又查了资料,要start up,但我start up 是总提示不能创建某个文件,我找了半天,看网上资料显示要查询当前控制文件目录,我找了目录,然后按给出的路径去找,好家伙,俩控制文件都丢了,我又搜控制文件丢了咋整,然后按网上给的方法,去找,然而找到一半我发现,我好像删的时间过长,以至于找不到记录,然后又开始搜其他的方法,偶然看到可以用备份,于是我按照路径,找了一个备份,然后将它改名,复制到数据库里给出的控制文件的路径上,重新登陆数据库,好家伙,提示我容器数据库安装有错误。然后我把Oracle数据库完全从我Linux上卸载了。然后又上网找了分安装指南,这次我换成了rpm安装包,和我第一次安装的时候用的一样,这是我第四次装Oracle了,然后我按照说明把它给装完了,但说明后面还有一段是用Navicate连接数据库的,我不知道是不是属于安装的一部分,暂时没管。

转回我windows系统上,由于我用命令行创建存储过程时漏了一个“/“,导致我认为不能通过命令行直接创建存储过程,应该要借助一个有界面的工具,开始上网搜,于是我先后整了PL/SQL,sql server,Navicate,然后我发现,这三个好像与用途都是一样的,作为客户端工具连接数据库,问题来了,我就是连不上我的数据库,但在我不断上网瞎搜的情况下,我终于发现命令行是可以直接创建存储过程的,只需要在最后一行加一个”/“。

下面是一些存储过程示例:

语法:

************************************************************************************************************************

create or replace procedure <procedure_name>

[(<parameter list>)]

as|is

<local variable statements> --创建过程,可指定运行过程需传递的参数

begin

<executable statements> --包括在过程中要执行的语句

[exception

<exception handlers>] --处理异常

end;
****************************************************************************************************************************

 

创建无参存储过程:  create or replace procedure first_proc is begin   dbms_output.put_line('我是存储过程');   dbms_output.put_line('hello everyone!'); end;  调用无参存储过程:  begin   first_proc; end;

或者:
exec first_proc;
创建带输入参数存储过程:  create or replace procedure second_proc (   v_empno in empnew.empno%type ) is begin   --根据员工号删除指定的员工信息   delete from empnew where empno = v_empno;      --判断是否删除成功   if sql%notfound then     --创建我们自己的异常条件,当Oracle不会抛出它们时 -2000至20999之间     raise_application_error(-20008,'指定删除的员工不存在!');   else     dbms_output.put_line('删除成功!');   end if;    end;  调用带输入参数存储过程:  begin   second_proc(131854); end;
创建带输出参数存储过程:  create or replace procedure third_proc (    v_deptno in number,    v_avgsal out number,    v_cnt out number ) is begin   select avg(sal),count(1)    into v_avgsal,v_cnt   from emp   where deptno = v_deptno;      exception     when no_data_found then       dbms_output.put_line('没有此部门!');     when others then       dbms_output.put_line(sqlerrm);--打印异常信息      end;  调用带输出参数存储过程:  declare   v_avgsal number;   v_cnt number;   begin    third_proc(10,v_avgsal,v_cnt);   --打印结果   dbms_output.put_line(v_avgsal);   dbms_output.put_line(v_cnt); end;
创建带输入输出参数的存储过程: create or replace procedure four_proc (     v_num1 in out number,     v_num2 in out number ) as     --定义变量     v_temp number :=0; begin   v_temp := v_num1;   v_num1 := v_num2;   v_num2 := v_temp; end;  调用带有输入输出参数的存储过程:   declare   v_num1 number:=10;   v_num2 number:=20; begin   four_proc(v_num1,v_num2);   --打印结果   dbms_output.put_line(v_num1);   dbms_output.put_line(v_num2); end;
其他命令: drop procedure 存储过程名称; ----删除存储过程 create table table_name_new as select * from table_name_old;-----复制表结构及其数据: desc + 表名;----命令行下显示表结构;