ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle存储过程创建及调用

2022-05-04 02:31:17  阅读:163  来源: 互联网

标签:存储 调用 end -- number put Oracle output


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

 

标签:存储,调用,end,--,number,put,Oracle,output
来源: https://www.cnblogs.com/mylove1104/p/16220204.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有