資料庫儲存過程及儲存函式
儲存過程
在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();