【Oracle数据库】存储过程

本文详细介绍了Oracle数据库中存储过程的使用,包括无参、输入参数、输出参数、输入输出参数的创建和调用方法,以及如何删除存储过程。同时,讲解了存储过程如何实现批量插入数据的操作。

  • 语法
create [or replace<] procedure < procedure name> 

            
[(<parameter list>)]

      
is|as 

      
<localvariable declaration>

      
begin

           
<executable statements>

          
[exception  <exceptionhandlers>]

      
end;
  • 方法
             方法1exec +存储名      
                        注:这个是sqlpluse 中的调用方式

              方法2begin
                   存储名
              end;
  • IN 定义一个输入参数变量,用于传递参数给存储过程。

  • OUT 定义一个输出参数变量,用于从存储过程获取数据。

  • IN OUT 定义一个输入、输出参数变量,兼有以上2者的功能

  • DEFAULT 关键字为可选项,用来设定参数的默认值
    -例如:v_empno in number default 7777;

无参

  • 创建无参存储过程
CREATE or replace PROCEDURE proc6
as
BEGIN
  DBMS_OUTPUT.PUT_LINE('我是存储过程!!!!!');
  DBMS_OUTPUT.PUT_LINE('Hello Everyone!');
END;

create or replace PROCEDURE pro111
as
BEGIN
  dbms_output.put_line('存储过程!');
  dbms_output.put_line('hello world');
end;
  • 调用无参的存储过程
begin
proc6;
end;

drop procedure proc6

begin
  pro111;
end;

drop procedure pro111

输入参数

  • 创建带输入参数的存储过程
create or replace procedure proc2
(v_empno in emp.empno%type)  --存储过程名字后(入参名字 in 约束入参的数据类型,既可以用%type,也可以直接用number,char)
--多个入参:(入参一 in 数据类型,入参二 in 数据类型)
is

begin
      --根据员工编号,删除指定员工信息
      delete from emp where emp.empno=v_empno;
      
      --判断是否删除成功
      if (sql%notfound) then   
         --错误编号 -20000   ——————   -29999 之间
         --reise_application_error 内置的   指定错误的存储过程
         raise_application_error(-20008,'删除失败,员工不存在!');
      else
         dbms_output.put_line('删除成功');      
      end if ;         
end;

注:创建存储过程时,即使存储过程代码有误,也会被创建成功,
但是procedures文件夹下存储过程名字会有叉叉,可以打开sql窗口中的program windows-procedures窗口写存储过程

  • 调用带有输入参数的存储过程
begin
proc2(7788);
end;

begin
pro123(7788);
end;

select * from emp02;

输出参数

  • 创建带输出参数的存储过程
create or replace procedure proc3
(v_deptno in number,v_sal out number,v_cnt out number)

as

begin
   select avg(sal),count(*) into v_sal,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;
  • 调用带有输出参数的存储过程
    注意,调用带有出参数据的存储过程要另外定义两个变量接收创建存储
    过程创建的出参,整体:创建存储过程时创建两个出参v_sal,v_cnt 接收emp表中查到的数据,调用proc3时,还要在定义两个变量v_avgsal,v_count来接收v_sal,v_cnt的数据
declare
       v_avgsal number;
       v_count number;
begin
       proc3(&a,v_avgsal,v_count);
       dbms_output.put_line(trunc(v_avgsal)||'====='||v_count);
end;
select * from user_procedures
declare
  e_avgsal number;
  e_count number;
begin
  pro111(&a,e_avgsal,e_count);
  dbms_output.put_line(trunc(e_avgsal)||'====='||e_count);
end;

输入输出参数

  • 创建输入输出参数的存储过程
create or replace procedure proc4
(v_num1 in out number,v_num2 in out number)
is 
        v_temp number:= 0;        
begin
        v_temp := v_num1;
        v_num1 := v_num2;
        v_num2 := v_temp;
end;
  • 调用输入输入参数的存储过程
declare
       v_n1 number:=1;
       v_n2 number:=4;
begin
       proc4(v_n1,v_n2);
       dbms_output.put_line(v_n1||'======'||v_n2);
end;

删除存储过程

  • 语法:drop procedures + 存储过程名
  • 存放存储过程的表为:user_source

存储过程时如何实现批量插入数据

create table emp_copy as select * from emp
select * from emp_copy for update
drop table emp_copy
  • 创建存储过程 背下
create or replace procedure ab
is 
begin
  /*循环*/
  for i in 1..100 loop
  /*操作*/
  insert into emp02 values (
  /*empno的值*/
  i+100,
  /*ename*/
  dbms_random.string('a',5),
  /*job*/
  'CLERK',
  /*mgr*/
  i,
  /*hiredate*/
  trunc(sysdate)-i,
  /*sal*/
  101+i,
  /*comm*/
  202,
  /*deptno*/
  21);
  end loop;
end;
  • 执行
begin
  ab;
end;
select * from emp02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值