【數據庫】Oralce存儲過程 [個人筆記]

1、定義

所謂存儲過程(Stored Procedure),就是一組用於完成特定數據庫功能的SQL語句集,該SQL語句集經過編譯後存儲在數據庫系統中。可以簡單理解爲:聲明一個方法,該方法中有個多sql 語句。

2、存儲過程的創建

Oracle存儲過程包含三部分:過程聲明執行過程部分存儲過程異常
無參存儲過程:

create or replace procedure NoParPro  
 as  //聲明  
 ;  
 begin // 執行  
 ;  
 exception//存儲過程異常  
 ;  
 end;

有參存儲過程:

create or replace procedure runbyparmeters    
    (isal in emp.sal%type,   
     sname out varchar,  
     sjob in out varchar)  
 as   
    icount number;  
 begin  
      select count(*) into icount 
      from emp where sal>isal and job=sjob;  
      
      if icount=1 then  
        .......sname  = "你好";
      else  
        ....  sname  = "大家好"
     end if;  
exception  
     when too_many_rows then  
     DBMS_OUTPUT.PUT_LINE('返回值多於1行'); //相當於java 中的system.out.print
     when others then  
     DBMS_OUTPUT.PUT_LINE('在RUNBYPARMETERS過程中出錯!');  
end;

注:其中參數IN表示輸入參數,是參數的默認模式。
OUT表示返回值參數,類型可以使用任意Oracle中的合法類型。
OUT模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞迴調用他的過程
IN OUT表示該參數可以向該過程中傳遞值,也可以將某個值傳出去。

3、遊標的定義(集合、數組)

個人理解: 遊標相當於數組、集合,一般用於查詢返回數據爲多條時,數據的遍歷;

--顯示cursor的處理
declare  							
cursor cursor_name is 				 ---聲明cursor,創建和命名一個sql工作區
    select real_name from t_test;
    v_realname varchar2(20);
begin 
    open cursor_name;					---打開cursor,執行sql語句產生的結果集
    fetch cursor_name into v_realname;	--提取cursor,提取結果集中的記錄
    dbms_output.put_line(v_realname);
    close cursor_name;					--關閉cursor
end;

4、存儲過程中游標定義使用

as 				//定義(遊標一個可以遍歷的結果集)   
CURSOR cur_1 IS   
  SELECT area_code,CMCODE,SUM(rmb_amt)/10000 rmb_amt_sn,  
         SUM(usd_amt)/10000 usd_amt_sn   
  FROM BGD_AREA_CM_M_BASE_T   
  WHERE ym >= vs_ym_sn_beg   
       AND ym <= vs_ym_sn_end   
  GROUP BY area_code,CMCODE;   
      
begin //執行(常用For語句遍歷遊標)       
FOR rec IN cur_1 LOOP   
  UPDATE xxxxxxxxxxx_T   
   SET rmb_amt_sn = rec.rmb_amt_sn,usd_amt_sn = rec.usd_amt_sn   
   WHERE area_code = rec.area_code   
   AND CMCODE = rec.CMCODE   
   AND ym = is_ym;   
END LOOP;

注:
AS 等同於declare 都是聲明的作用。
cur_1 就是集合名(數組名)
FOR 變量 IN 數組 LOOP

5、 存儲過程常用的調用方式

SQL> exec  proc_emp('參數1','參數2');//無返回值過程調用  
SQL> var vsal number  
SQL> exec proc_emp ('參數1',:vsal);// 有返回值過程調用  
或者:call proc_emp ('參數1',:vsal);// 有返回值過程調用 

6、Java的調用存儲過程【示例代碼】

import java.sql.*;
public class ProcedureTest 
{
	public static void main(String args[]) throws Exception
	{
	   //加載驅動
	   DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
	   //獲得連接
	   Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
	   CallableStatement c=conn.prepareCall("{call test_pro(?)}");
	   
	   //設置入參
	   c.setInt(1,1);
	   //設置出參類型,否則可能會無效索引異常
	   c.registerOutParameter(1,java.sql.Types.VARCHAR);
	   c.execute();//執行調用
	   
	   System.out.println (c.getString(1));
	   conn.close(); //記得關閉連接
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章