隨筆-124  評論-49  文章-56  trackbacks-0
          --例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)過程
          --
               建立過程時可以指定輸入?yún)?shù)(in),輸出參數(shù)(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;
          --     調(diào)用
          exec update_money('ywj123',100000);
          call update_money(
          'ywj123',100000);
          --     重新編譯
          alter procedure update_money compile;
          --     授權(quán)student用戶使用該過程
          grant execute on update_money to student;  
          --  (2)函數(shù)
          --
               創(chuàng)建
          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;
          --     調(diào)用
          var rs number
          call get_user_id(
          'ywj123'into :rs;
          --     刪除
          drop function get_user_id;
          --     重新編譯
          alter function get_user_id compile;
          --  (3)包
          --
               創(chuàng)建(包由包規(guī)范和包體兩部分組成)
          --
                 包規(guī)范
          create package emp_pkg is
            
          procedure update_money (uname varchar2,num number);
            
          function get_user_id(uname varchar2return 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;
          --     調(diào)用
          call emp_pkg.update_money('ywj123',100000);
          var rs number
          call emp_pkg.get_user_id(
          'ywj123'into :rs;

          --解發(fā)器

          存儲過程參數(shù)傳遞

          參數(shù)的作用是向存儲過程傳遞數(shù)據(jù),或從存儲過程獲得返回結(jié)果。正確的使用參數(shù)可以大大增加存儲過程的靈活性和通用性。
          參數(shù)的類型有三種,如下所示。

          參數(shù)的定義形式和作用如下:
          參數(shù)名 IN 數(shù)據(jù)類型 DEFAULT 值;
          定義一個輸入?yún)?shù)變量,用于傳遞參數(shù)給存儲過程。在調(diào)用存儲過程時,主程序的實際參數(shù)可以是常量、有值變量或表達(dá)式等。DEFAULT 關(guān)鍵字為可選項,用來設(shè)定參數(shù)的默認(rèn)值。如果在調(diào)用存儲過程時不指明參數(shù),則參數(shù)變量取默認(rèn)值。在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進(jìn)行賦值。
          參數(shù)名 OUT 數(shù)據(jù)類型;
          定義一個輸出參數(shù)變量,用于從存儲過程獲取數(shù)據(jù),即變量從存儲過程中返回值給主程序。
          在調(diào)用存儲過程時,主程序的實際參數(shù)只能是一個變量,而不能是常量或表達(dá)式。在存儲過程中,參數(shù)變量只能被賦值而不能將其用于賦值,在存儲過程中必須給輸出變量至少賦值一次。
          參數(shù)名 IN OUT 數(shù)據(jù)類型 DEFAULT 值;
          定義一個輸入、輸出參數(shù)變量,兼有以上兩者的功能。在調(diào)用存儲過程時,主程序的實際參數(shù)只能是一個變量,而不能是常量或表達(dá)式。DEFAULT 關(guān)鍵字為可選項,用來設(shè)定參數(shù)的默認(rèn)值。在存儲過程中,變量接收主程序傳遞的值,同時可以參加賦值運(yùn)算,也可以對其進(jìn)行賦值。在存儲過程中必須給變量至少賦值一次。
          如果省略IN、OUT或IN OUT,則默認(rèn)模式是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(
          '發(fā)生錯誤,修改失敗!');
                   
          ROLLBACK;
                  
          END;
          參數(shù)的值由調(diào)用者傳遞,傳遞的參數(shù)的個數(shù)、類型和順序應(yīng)該和定義的一致。如果順序不一致,可以采用以下調(diào)用方法。如上例,執(zhí)行語句可以改為:
           EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
            可以看出傳遞參數(shù)的順序發(fā)生了變化,并且明確指出了參數(shù)名和要傳遞的值,=>運(yùn)算符左側(cè)是參數(shù)名,右側(cè)是參數(shù)表達(dá)式,這種賦值方法的意義較清楚。
          posted on 2010-07-26 18:20 junly 閱讀(735) 評論(0)  編輯  收藏 所屬分類: oracle/mysql/sql
          主站蜘蛛池模板: 甘洛县| 襄垣县| 彰化县| 钟祥市| 桂平市| 榕江县| 寿光市| 邮箱| 汪清县| 富平县| 斗六市| 铁岭市| 乳山市| 揭阳市| 岚皋县| 英吉沙县| 光泽县| 平和县| 武宣县| 三台县| 江油市| 临泉县| 顺昌县| 建昌县| 美姑县| 古田县| 海兴县| 临桂县| 舒兰市| 青河县| 贵阳市| 丹江口市| 达拉特旗| 墨竹工卡县| 拉萨市| 汉沽区| 柘城县| 泾源县| 林西县| 黎川县| 浦城县|