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(); //記得關閉連接
}
}