为了测试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 + 表名;----命令行下显示表结构;