oracle存储过程,函数,包

-- 例1
declare
v_name 
varchar2 ( 10 );
begin  
 
select   user_name   into  v_name  from  tb_rd_user_info  where   user_name = ' ywj12 ' ;
 dbms_output.put_line(
' name: ' || v_name);
exception
 
when  no_data_found  then
 dbms_output.put_line(
' error name ' );
end ;

-- 匿名块
--
  没有名称的pl/sql块,如例1
--
命名块
--
子程序
--
  (1)过程
--
     建立过程时可以指定输入参数(in),输出参数(out)
create   or   replace   procedure  update_money(uname  varchar2 ,num  number )
is
begin
update  tb_rd_user_info  set  game_money  =  num 
where   user_name   =  uname;
end  update_money;
--      删除
drop     procedure    update_money;
--      调用
exec  update_money( ' ywj123 ' , 100000 );
call update_money(
' ywj123 ' , 100000 );
--      重新编译
alter   procedure  update_money compile;
--      授权student用户使用该过程
grant   execute   on  update_money  to  student;  
--   (2)函数
--
     创建
create   or   replace   function  get_user_id(uname  varchar2 )
return   number   is
  uid 
number ;
begin
 
select   user_id   into  uid  from  tb_rd_user_info 
 
where   user_name = uname;
 
return  uid;
end ;
--      调用
var  rs  number
call get_user_id(
' ywj123 ' into  :rs;
--      删除
drop   function  get_user_id;
--      重新编译
alter   function  get_user_id compile;
--   (3)包
--
     创建(包由包规范和包体两部分组成)
--
       包规范
create  package emp_pkg  is
  
procedure  update_money (uname  varchar2 ,num  number );
  
function  get_user_id(uname  varchar2 return   number ;
end ;
--        包体
create  package body emp_pkg  is
  
procedure  update_money(uname  varchar2 ,num  number )
  
is
  
begin
    
update  tb_rd_user_info  set  game_money  =  num 
    
where   user_name   =  uname;
  
end  update_money;
  
  
function  get_user_id(uname  varchar2 )
  
return   number   is
    uid 
number ;
  
begin
    
select   user_id   into  uid  from  tb_rd_user_info 
    
where   user_name = uname;
    
return  uid;
  
end ;
end ;
--      调用
call emp_pkg.update_money( ' ywj123 ' , 100000 );
var  rs  number
call emp_pkg.get_user_id(
' ywj123 ' into  :rs;

-- 解发器

存储过程参数传递

参数的作用是向存储过程传递数据,或从存储过程获得返回结果。正确的使用参数可以大大增加存储过程的灵活性和通用性。
参数的类型有三种,如下所示。

IN  定义一个输入参数变量,用于传递参数给存储过程    OUT  定义一个输出参数变量,用于从存储过程获取数据    IN   OUT   定义一个输入、输出参数变量,兼有以上两者的功能 
参数的定义形式和作用如下:
参数名 IN 数据类型 DEFAULT 值;
定义一个输入参数变量,用于传递参数给存储过程。在调用存储过程时,主程序的实际参数可以是常量、有值变量或表达式等。DEFAULT 关键字为可选项,用来设定参数的默认值。如果在调用存储过程时不指明参数,则参数变量取默认值。在存储过程中,输入变量接收主程序传递的值,但不能对其进行赋值。
参数名 OUT 数据类型;
定义一个输出参数变量,用于从存储过程获取数据,即变量从存储过程中返回值给主程序。
在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。在存储过程中,参数变量只能被赋值而不能将其用于赋值,在存储过程中必须给输出变量至少赋值一次。
参数名 IN OUT 数据类型 DEFAULT 值;
定义一个输入、输出参数变量,兼有以上两者的功能。在调用存储过程时,主程序的实际参数只能是一个变量,而不能是常量或表达式。DEFAULT 关键字为可选项,用来设定参数的默认值。在存储过程中,变量接收主程序传递的值,同时可以参加赋值运算,也可以对其进行赋值。在存储过程中必须给变量至少赋值一次。
如果省略IN、OUT或IN OUT,则默认模式是IN。 
CREATE   OR   REPLACE   PROCEDURE  CHANGE_SALARY(P_EMPNO  IN   NUMBER   DEFAULT   7788 ,P_RAISE  NUMBER   DEFAULT   10 )
        
AS
         V_ENAME 
VARCHAR2 ( 10 );
V_SAL 
NUMBER ( 5 );
        
BEGIN
         
SELECT  ENAME,SAL  INTO  V_ENAME,V_SAL  FROM  EMP  WHERE  EMPNO = P_EMPNO;
         
UPDATE  EMP  SET  SAL = SAL + P_RAISE  WHERE  EMPNO = P_EMPNO;
         DBMS_OUTPUT.PUT_LINE(
' 雇员 ' || V_ENAME || ' 的工资被改为 ' || TO_CHAR(V_SAL + P_RAISE));
COMMIT ;
        EXCEPTION
         
WHEN  OTHERS  THEN
         DBMS_OUTPUT.PUT_LINE(
' 发生错误,修改失败! ' );
         
ROLLBACK ;
        
END ;
参数的值由调用者传递,传递的参数的个数、类型和顺序应该和定义的一致。如果顺序不一致,可以采用以下调用方法。如上例,执行语句可以改为:
 EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
  可以看出传递参数的顺序发生了变化,并且明确指出了参数名和要传递的值,=>运算符左侧是参数名,右侧是参数表达式,这种赋值方法的意义较清楚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值