--例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可选参数
可选参数: BYMONTH、BYWEEKNO、BYYEARDAY、BYMONTHDAY
BYDAY、BYHOUR、BYMINUTE、BYSECOND
可选参数
BYDAY:周几的意思
BYMONTHDAY:一个月的几号
BYYEARDAY:一年的第几天
以下给出部分repeat_interval的写法实例,以供参考
每两个小时运行一次:
'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));
}
}