存储过程例子

  1. 存储过程返回记录集:
    CREATE OR REPLACE PACKAGE pkg_test 
    AS 
        TYPE myrctype 
    IS REF CURSOR
      
        
    PROCEDURE get (p_id NUMBER, p_rc OUT myrctype); 
    END pkg_test; 
    / 
      
    CREATE OR REPLACE PACKAGE BODY pkg_test 
    AS 
        
    PROCEDURE get (p_id NUMBER, p_rc OUT myrctype) 
        
    IS 
           sqlstr   
    VARCHAR2 (500); 
        
    BEGIN 
           
    IF p_id = 0 THEN 
              
    OPEN p_rc FOR 
                 
    SELECT ID, NAME, sex, address, postcode, birthday 
                   
    FROM student; 
           
    ELSE 
              sqlstr :
    = 
                 
    'select id,name,sex,address,postcode,birthday 
                from student where id=:w_id
    '
              
    OPEN p_rc FOR sqlstr USING p_id; 
           
    END IF
        
    END get; 
    END pkg_test; 
    / 
      
    函数返回记录集: 
    建立带ref cursor定义的包和包体及函数: 
    CREATE OR REPLACE 
    package pkg_test 
    as 
    /* 定义ref cursor类型 
        不加return类型,为弱类型,允许动态sql查询, 
        否则为强类型,无法使用动态sql查询; 
    */
     
       type myrctype 
    is ref cursor;  
       
    --函数申明 
       function get(intID numberreturn myrctype; 
    end pkg_test; 
    / 
       
    CREATE OR REPLACE 
    package body pkg_test 
    as 
    --函数体 
        function get(intID numberreturn myrctype is 
          rc myrctype;  
    --定义ref cursor变量 
          sqlstr varchar2(500); 
        
    begin 
          
    if intID=0 then 
             
    --静态测试,直接用select语句直接返回结果 
             open rc for select id,name,sex,address,postcode,birthday from student; 
          
    else 
             
    --动态sql赋值,用:w_id来申明该变量从外部获得 
             sqlstr := 'select id,name,sex,address,postcode,birthday from student where id=:w_id'
             
    --动态测试,用sqlstr字符串返回结果,用using关键词传递参数 
             open rc for sqlstr using intid; 
          
    end if
       
          
    return rc; 
        
    end get; 
       
    end pkg_test;

  2. 一个简单的应用,带参数的PROCEDURE,隐式的打开CURSOR.
--工资加500,OLD。SAL>2500 不加,NEW。SAL>2500 则改为2500;

SELECT * FROM EMP                                                                --加工资之前

CREATE OR REPLACE PROCEDURE SP_ADD (add IN numberis      --add参数接收传入的工资增幅

     
--DECLARE
     --CURSOR emp_cur IS SELECT * FROM emp;
     
BEGIN
     
     
FOR  sal_sum IN (SELECT * FROM emp) LOOP         --使用循环游标隐式打开游标emp_cur

                                                                                 
--(SELECT * FROM emp)(在FOR循环中不需要声明此游标)
                                                                                 --自动从活动集获取行,然后在处理完所有行时关闭游标     
          IF sal_sum.sal > 2500 THEN                                             --逐行进行比较赋值
                UPDATE emp SET sal = sal_sum.sal WHERE empno = sal_sum.empno;
                
          ELSIF (sal_sum.sal 
+ add> 2500 THEN
                
UPDATE emp SET sal = 2500 WHERE empno = sal_sum.empno;
                
          
ELSE              
                
UPDATE emp SET sal = sal_sum.sal + add  WHERE empno = sal_sum.empno;
          
END IF;
          
     
END LOOP;
     
END;


BEGIN
     SP_ADD(
500);                                                                 --输入增资的幅度                                                                                                                     
END;

SELECT * FROM EMP                                                         --加工资之后 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值