1. 程式人生 > >Oracle儲存過程,函式,觸發器

Oracle儲存過程,函式,觸發器

一:儲存過程的定義
    1>過程(多次編譯 多次執行):
       --過程實現計算器
       declare p1 number:=1;
       p2 number:=2;
       sign varchar2(3):='-';
       begin
         if sign='+' then
            syso(p1+p2);
         elsif(sign='-' ) then
            syso(p1-p2);
         elsif(sign='*' ) then
            syso(p1*p2);
         elsif(sign='/' ) then
            syso(p1/p2);
         end if;
       end;
    2>儲存過程(一次編譯 多次執行)
       --儲存過程的定義  
       --儲存過程執行只是編譯的過程  如果需要執行儲存過程的程式碼 需要在過程中呼叫
       create or replace procedure pro_arthirm(p1 number,p2 number,sign varchar2) 
       as
       --引數的定義
       begin
       --過程體
         if sign='+' then
            syso(p1+p2);
         elsif(sign='-' ) then
            syso(p1-p2)
         elsif(sign='*' ) then
            syso(p1*p2);
         elsif(sign='/' ) then
            syso(p1/p2);
         end if;
       end;
       --在plsql中呼叫儲存過程
       declare p1 number:=1;
       p2 number:=2;
       sign varchar2(3):='+';
       begin
            pro_arthirm(p1,p2,sign);
       end;
                 
       --在command模式下  需要使用  
       call 過程名稱(引數。。。)
       execute(exec) 過程名稱(引數。。。)
       show errors 顯示儲存過程編譯之後的錯誤
      
       
   3>儲存過程引數
       /**    引數型別:
           IN 輸入引數。只能獲取它的值 不能修改他的值 呼叫設定的值 可以在儲存過程中檢視
           OUT 輸出引數。只能在過程體中賦值 不能檢視到傳入的值
           IN OUT 輸入輸出引數。可以取它的值,也可以給它賦值
           
           public int arthirm(int p1,int p2,String sign){
              int returnNum=5;
              if(...){
                 returnNum=p1+p2
              }
              return returnNum;
           }
           **/
           
           create or replace procedure pro_arthirmByReturn(p1 in number,p2 in number,sign in varchar2,returnNum in out number) 
               as
               --引數的定義
               rtnNum number;
               begin
               syso(returnNum);
               --過程體
                 if sign='+' then
                    returnNum:=(p1+p2);
                 elsif(sign='-' ) then
                    returnNum:=(p1-p2);
                 elsif(sign='*' ) then
                    returnNum:=(p1*p2);
                 elsif(sign='/' ) then
                    returnNum:=(p1/p2);
                 end if;
               end;
             
             declare p1 number:=1;
               p2 number:=2;
               sign varchar2(3):='+';
               returnNumber number:=10;
               begin
                    pro_arthirmByReturn(p1,p2,sign,returnNumber);
                  syso(returnNumber);
               end;
      4>查詢資料庫的物件的三中方式
      select count(*) from user_procedures;--當前使用者的儲存過程
      select count(*) from all_procedures; --相同許可權的使用者所有的儲存過程 許可權下有多少儲存過程就輸出多少 不會有編譯出錯
       select count(*) from dba_procedures; --系統所有的儲存 如果沒有dba的許可權會編譯出錯
      5>刪除儲存過程
       drop procedure 儲存過程名稱 
二:函式過程的定義  
      CREATE [OR REPLACE] FUNCTION 函式名
       [(引數名 [IN|OUT|IN OUT] 資料型別[, …])]
       RETURN 返回值型別
       {IS | AS}
       BEGIN
           函式的主體
       END [函式名];
         函式和儲存過程的區別在於
         1  函式可以返回值  儲存過程不行
         2  函式可以在sql中使用 儲存過程不行
         3  函式是一種特殊的儲存過程
        例子 
        create or replace function  fun_arthirmbyDeclare(p1 in number,p2 in number,sign in varchar2)
           return number
                   as
                          
           resultDNum number;
                   begin
                        
                     if sign='+' then
                        resultDNum:=(p1+p2);
                     elsif(sign='-' ) then
                        resultDNum:=(p1-p2);
                     elsif(sign='*' ) then
                        resultDNum:=(p1*p2);
                     elsif(sign='/' ) then
                        resultDNum:=(p1/p2);
                     end if;
             return resultDNum;
                   end;
           --呼叫函式    
          declare p1 number:=1;
                   p2 number:=2;
                   sign varchar2(3):='+';
                   returnNumber number;
                   begin
                        returnNumber:=fun_arthirmbyDeclare(p1,p2,sign);
                      syso(returnNumber);
                   end;
           --刪除函式:
           DROP FUNCTION 函式名;
                       
        區分儲存過程和函式在user_procedures
      select object_name,object_type from user_objects where object_name in(select object_name from user_procedures)        
三:觸發器的定義         
    CREATE [OR REPLACE] TRIGGER 觸發器名
       [BEFORE | AFTER] 啟用觸發器的事件(insert,update,delete)
       ON 表名
       [FOR EACH ROW]  -- 指定為行級觸發器
       [WHEN 觸發條件]
       BEGIN
           主體;
       END [觸發器名];
       /
      注意:
   多種啟用觸發器用or來連線:insert or update or delete
   在觸發器主體語句中可以用“inserting”、“updating”、“deleting”判斷啟用事件。
   在行級觸發器中,可以通過:old和:new別名訪問列的原值和新值。 
   舉例:
     create or replace trigger trg_grade_delete before
       delete on tb_grade
       FOR EACH ROW
       begin
          /**
             在dml操作中 資料的修改是存在新和舊的問題
             insert語句  只有新的資料
             delete語句  只有舊的資料
             update語句  有新和舊的問題
             oracle通過var變數的方式儲存新舊值
             :new
             :old 只能使用在行級觸發器上
          **/
          syso('我刪除了一行記錄 班級名稱是:'||:old.cname );
       
       end;   
      delete from tb_grade where cid=3;