子程序与程序包

本文探讨了PL/SQL中的子程序,重点介绍了存储过程,将其比喻为JAVA中的方法,并详细阐述了存储过程的调用方式,此外还涉及了程序包的概念。
摘要由CSDN通过智能技术生成

子程序

PL/SQL命名程序块的定义在PL/SQL程序块的声明部分,用户称之为子程序。
子程序=过程+函数
存储过程(命名的PL/SQL块,相当于JAVA里面的方法)
创建存储过程的语法:
create [ or replace]  procedure<procedure_name>
(<arg1 [mode]  datatype>,…………)
is|as
[declaration]
begin
[exception]
end[procedure_name];

三种调用方式

   第一种    通用
  call   proc1();  

  第二种  pl/sql       sql 窗口
  begin
       proc1();
  end;

  第三种
  exec proc1();   sql命令提示符


  传参。in(输入 default)   out(输出)    in out(输入输出)
        数据类型不能申明长度。
举例
--第一个
create or replace procedure proc1
as
begin
     dbms_output.put_line('hello!');
end;
--调用
call   proc1();

begin
proc1();
end;

exec proc1();

-- in   传值:  传入的是一个常量
create or replace procedure proc1(a in number,b varchar, c varchar)
as
begin
     a:=11;
     insert into dept values(a,b,c);
     commit;
end;


-- out   输出:  输入的值被忽略
create or replace procedure proc2(a number,b out number)
as
     v emp.sal%type;
begin
     select  sal into v from emp where empno=a;
     b:=v;
end;


declare
       b number(7,2);
begin
   b:=10;
   proc2(7369,b);
   dbms_output.put_line('工资:'||b);
end;


-- in out 传引用,传的是对象本身,  

create or replace procedure proc3(a in out integer ,b in out integer)
as
    temp int;
begin
    temp:=a;
    a:=b;
    b:=temp;
end;

declare
    a int;
    b int;
begin
     a:=10;
     b:=20;
     dbms_output.put_line('传入前a:  '||a);
     dbms_output.put_line('传入前b:  '||b);
     proc3(a,b);
     dbms_output.put_line('传入后a:  '||a);
     dbms_output.put_line('传入后b:  '||b);
end;

select * from emp;


--函数 function
-- 语法,一定两个return

create or replace function fun1(a int) return int
as
       v emp.sal%type;
begin
     select sal into v from emp where empno=a;
     return v;
end;

select fun1(7369) from dual;

总结:
      函数与过程不同
      返回不同:  过程 可以返回,可以不返回,可以返回多个
                  函数,一定要返回一个

      调用方式不同: 过程  单独调用     java   CallableStateMent接口   
                     函数  写在SQL里面     java   PrereparedStateMent接口


程序包

程序包是对相关类型、变量、常量、游标、异常、过程和函数的封装。
由包规范和包主体两部分组成
--包头: 对外声明作用,对外是可见的,声明我这个包里有什么东西
create or replace  package pack1
as
       procedure proc1(a number,b out number);
       function fun1(a number) return number;
end;   


--包体  对外是不可观的黑盒,实现包头的声明            
create or replace  package body pack1
is
       procedure proc1(a number,b out number)
       as
       begin
            select sal into b from emp where empno=a;
       end proc1;

       function fun1(a number) return number
       as
         v number(7,2);
       begin
            select sal into v from emp where empno=a;
            return v;
       end fun1;
end pack1;   

--调用
declare
       a int;
       b number(7,2);
begin
     a:=&工号;
     pack1.proc1(a,b);
     dbms_output.put_line('工资:'||b);

     select fun1(a) into b from dual;
     dbms_output.put_line('工资:'||b);

end;

  select pack1.fun1(7369),sal  from emp;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值