Oracle包和包體

--例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  可選參數 函數

         可選參數: BYMONTHBYWEEKNOBYYEARDAYBYMONTHDAY spa

BYDAYBYHOURBYMINUTE BYSECOND get

可選參數 io

BYDAY:周幾的意思 table

                       BYMONTHDAY:一個月的幾號 function

                       BYYEARDAY:一年的第幾天 變量

 

如下給出部分repeat_interval的寫法實例,以供參考 擴展

每兩個小時運行一次: date

         'FREQ=HOURLY;INTERVAL=2'

天天運行一次:

         'FREQ=DAILY'

指定每週135運行一次

         '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;'

指定每一年310號運行的日期:

'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));
}
}
相關文章
相關標籤/搜索