--例1:包
create or replace package my_pac
is
--包內定義的全部數據 都是公有數據類型
--能夠聲明變量/常量,能夠定義類型(cursor,table,record) 能夠聲明方法和過程 不寫方法體和過程體
v_num number :=100;
v_v constant varchar2(20) :='aaaa';
type tab_type is table of varchar2(20) index by binary_integer;
type tab_type2 is table of varchar2(20);
type record_type is record(
v_ename emp.ename%type,
v_date date :=sysdate
);
--通常不放靜態遊標
cursor c_emp is select * from emp e;
--return emp%rowtype 可擴展性 很差
type cursor_type is ref cursor ;
--聲明方法和過程
function f_two_num(l_num1 number,l_num2 number) return number;
function f_two_num(l_str1 varchar2,l_str2 varchar2) return varchar2;
procedure p_pac_pro(l_empno in number,l_sal out number);
end;
例2:--包體
--包體 與包頭對應 名字一致
create or replace package body my_pac
is
--聲明變量、常量 其餘類型(curosr table,record) 可是都屬於私有數據 補充 方法體 和過程體
v_num_body number :=100;
--模擬重載 實現 f_two_num 兩個函數
function f_two_num(l_num1 number,l_num2 number) return number
is
begin
return l_num1+l_num2;
end f_two_num;
function f_two_num(l_str1 varchar2,l_str2 varchar2) return varchar2
is
begin
return l_str1||l_str2;
end f_two_num;
procedure p_pac_pro(l_empno in number,l_sal out number)
is
begin
select e.sal into l_sal from emp e where e.empno = l_empno;
end p_pac_pro;
--能夠寫begin 通常沒啥意思
begin
dbms_output.put_line('--');
end;
--參考材料:
日曆表達式:
頻率:FREQ 必選參數 java
時間間隔:interval範圍1-999 可選參數 函數
可選參數: BYMONTH、BYWEEKNO、BYYEARDAY、BYMONTHDAY spa
BYDAY、BYHOUR、BYMINUTE 、BYSECOND get
可選參數 io
BYDAY:周幾的意思 table
BYMONTHDAY:一個月的幾號 function
BYYEARDAY:一年的第幾天 變量
如下給出部分repeat_interval的寫法實例,以供參考 擴展
每兩個小時運行一次: date
'FREQ=HOURLY;INTERVAL=2'
天天運行一次:
'FREQ=DAILY'
指定每週1、3、5運行一次
'FREQ=WEEKLY;BYDAY=MON,WED,FRI;'
指定每一年3,6,9,12月的2號運行一次:
'FREQ=YEARLY;BYMONTH=MAR,JUN,SEP,DEC;BYMONTHDAY=2'
指定每隔週週五運行一次:
'FREQ=WEEKLY;INTERVAl=2;BYDAY=FRI;'
指定每個月最後一天運行:
'FREQ=MONTHLY;BYMONTHDAY=-1;'
指定每一年3月10號運行的日期:
'FREQ=YEARLY;BYMONTH=MAR,JUN,SEP,DEC;BYMONTHDAY=10;'
或者
'FREQ=YEARLY;BYDATE=0310;'
指定天天下午4點,5點和6點運行:
'FREQ=DAILY;BYHOUR=16,17,18;'
指定每個月第2個星期三運行的日期表達式:
'FREQ=MONTHLY;BYDAY=2WED;'
指定每一年最後一個星期五運行的日期表達式:
'FREQ=YEARLY;BYDAY=-1FRI;’
指定每一個月前3天每小時運行一次的日期表達式:
'FREQ=HOURLY;BYMONTHDAY=1,2,3'
指定每分鐘運行一次的日期表達式:
'FREQ=MINUTELY;INTERVAL=1'
指定每隔四個小時運行一次的日期表達式:
'FREQ=HOURLY;INTERVAL=4;BYMINUTE=0;BYSECOND=0'
指定每週1,2,3,4,5 的7點到下午三點 運行一次的日期表達式:
'FREQ=DAILY;BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15;BYMINUTE=0;BYSECOND=0'
--例3:java調用存儲過程
public static void main(String[] args) throws Exception{
Connection conn = DBUtil.getConn();
//PreparedStatement--->Statement
CallableStatement cs = conn.prepareCall("{call p_emp_sal (?,?)}");
cs.setInt(1, 7369); //傳入參數
cs.registerOutParameter(2, Types.NUMERIC); //傳出參數須要註冊
cs.execute(); //執行存儲過程
int result = cs.getInt(2); //獲取傳出參數的值 必定是執行存儲過程以後
System.out.println(result);
}
--例3:獲得遊標參數
public static void main(String[] args) throws Exception{
Connection conn = DBUtil.getConn();
//PreparedStatement--->Statement
CallableStatement cs = conn.prepareCall("{call p_curosr (?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.execute();
ResultSet rs = ((OracleCallableStatement)cs).getCursor(1);
while(rs.next()){
System.out.println(rs.getInt(1)+"====="+rs.getString(2));
}
}