1. 程式人生 > >資料庫儲存過程及儲存函式

資料庫儲存過程及儲存函式

儲存過程

在java中經常用封裝的思想來提高程式碼的重用性,在java中為什麼要定義方法?原因是有一個功能是需要在不同的地方多次使用的,如果在每一個需要呼叫的地方都寫一遍會造成程式碼量很大,所以我們把他抽取成單獨的方法,在需要使用的時候呼叫這個方法。同樣的道理,如果同一個資料庫操作需要被多次使用,這個時候可以考慮將他抽取出來,這樣被抽取出來的這個類似與方法的東西就是儲存過程。所以,簡單的說,儲存過程實際就是封裝在伺服器上的一段PL/SQL程式碼片段,已經編譯好了的程式碼片段。可見,由於已經編譯好了,所以,客戶端呼叫儲存過程的執行效率比直接執行sql語句的效率會快。

語法結構:
    create [or replace] procedure  儲存過程的名稱(引數名 in|out 引數型別)
    is |  as
        --宣告部分
    begin
        --業務邏輯
    end;

例項:給指定員工漲工資,並且列印漲薪前和漲薪後的工資。

create or replace procedure  pro_test1(vempno in number,vnum in number)
        is
            --宣告變數
            vsal number;
        begin

            --業務邏輯
            --查詢當前的工資
            select sal into vsal  from emp where empno=vempno;
                dbms_output.put_line('漲薪前'||vsal);
            --更新工資
            update emp set sal=vsal+vnum where empno=vempno;
                dbms_output.put_line('漲薪後'||(vsal+vnum));
            --提交,更新操作,提交的是事務
            commit;
        end;    

呼叫上面的儲存過程:

call pro_test1(給定一個員工編號,漲工資錢數);

儲存函式

儲存函式的其實和儲存過程差不多。

語法:

create[or replace] function 儲存函式的名字(引數名 in|out 引數型別...) return 引數型別

 is|as
 begin
 end;

例項:查詢指定員工的年薪sal*12+nvl(comm,0)

create or replace function fun_test1(vempno number ) return number
            is
                --宣告變數
                vtotalsal number;
            begin
                select sal*12+nvl(comm,0) into vtotalsal from emp where empno=vempno;
                return vtotalsal;
 end;

呼叫儲存函式:

declare
                vsal number;
            begin
                vsal :=fun_test1(7369);
                dbms_output.put_line(vsal);
end;


JDBC呼叫儲存過程:

        //1、匯入驅動包
        //2、註冊驅動
        Class.forName("oracle.jdbc.OracleDriver");

        //3、獲取連線
        Connection conn = DriverManager.getConnection
                ("jdbc:oracle:thin:@localhost:1521:ORCL", "wsh", "wsh");
 
        //4、獲取執行sql的statement物件,封裝引數,執行sql
        String sql="{call proc_gettotalsal(?,?)}";
        CallableStatement statement = conn.prepareCall(sql);

        //設定輸入引數
        statement.setInt(1, 7788);

        //註冊輸出引數
        statement.registerOutParameter(2, OracleTypes.NUMBER);

        //執行statement物件
        statement.execute();

        //5、獲取結果,輸出引數是幾,獲取的就是幾
        int totalsal = statement.getInt(2);

        //輸出結果:工資前和工資後
        System.out.println("工資"+totalsal);
        //6、釋放資源
        statement.close();
        conn.close();



JDBC呼叫儲存函式:

            //1、匯入驅動包
			//2、註冊驅動
				Class.forName("oracle.jdbc.OracleDriver");

			//3、獲取連線
				Connection conn = DriverManager.getConnection
						("jdbc:oracle:thin:@localhost:1521:ORCL", 
								"wsh", "wsh");

			//4、獲取執行sql的statement物件,封裝引數,執行sql
				String sql="{?= call func_getsal(?)}";
				CallableStatement statement = conn.prepareCall(sql);

			//5、獲取結果
				//設定輸出引數
				statement.registerOutParameter(1, OracleTypes.NUMBER);
				//設定輸入引數
				statement.setInt(2, 7788);
				//執行sql
				statement.execute();
				int totalsal = statement.getInt(1);
				System.out.println("年薪工資:"+totalsal);

			//6、關閉資源
				statement.close();
				conn.close();