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    必选参数

         时间间隔:interval范围1-999  可选参数

         可选参数: BYMONTHBYWEEKNOBYYEARDAYBYMONTHDAY

BYDAYBYHOURBYMINUTE BYSECOND

可选参数

BYDAY:周几的意思

                       BYMONTHDAY:一个月的几号

                       BYYEARDAY:一年的第几天

 

以下给出部分repeat_interval的写法实例,以供参考

每两个小时运行一次:

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

转载于:https://my.oschina.net/u/1413786/blog/180435

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值