存儲過程例子

  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                                                         --加工資之後 
發佈了6 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章