Oracle12cR2之函数、存储过程、Job及序列与重置序列综合案例
1. 创建表、序列、存储过程
1. 创建业务表
create table TB_TEST
(
id number primary key ,
name varchar2( 100 ) ,
product_no varchar2( 50 )
)
/
comment on table TB_TEST is '测试表'
/
comment on column TB_TEST. id is '主键'
/
comment on column TB_TEST. name is '名称'
/
comment on column TB_TEST. product_no is '产品编号'
/
2. 创建序列
create sequence SEQ_TEST_ID
start with 1
increment by 1
minvalue 1
maxvalue 99999
cache 100
cycle ;
create sequence SEQ_TEST_NO
start with 1
increment by 1
minvalue 1
maxvalue 99999
cache 100
cycle ;
3. 创建存储过程
创建一个名称为PRO_MY_DEMO
的存储过程,用来向TB_TEST
表中插入数据;
注意:在存储过程中执行sql语句时必须使用execute immediate your_sql
来执行,否则编译都无法通过
create or replace procedure PRO_MY_DEMO is
-- 定义执行的sql语句变量
exec_sql varchar2(200);
begin
exec_sql := 'insert into TB_TEST(id, name, product_no)
values (SEQ_TEST_ID.nextval, ''名称'' || SEQ_TEST_ID.currval, ''产品-'' || SEQ_TEST_NO.nextval)';
-- 执行sql
execute immediate exec_sql;
-- 提交事务
commit;
end;
2. 使用案例
1. 创建Job执行存储过程
declare
JOB_PRODUCT_TEST number;
begin
DBMS_JOB. SUBMIT( JOB = > JOB_PRODUCT_TEST,
WHAT = > 'PRO_MY_DEMO;' ,
NEXT_DATE = > sysdate,
interval = > 'trunc(sysdate,''mi'')+1/(24*60)' ) ;
commit ;
end ;
2. 创建重置序列的函数
create or replace function FUN_RESET_SEQUENCE( SEQUENCE_NAME in varchar2)
return integer is
FUNCTION_RESULT integer ;
RESET_SQL varchar2( 200 ) ;
CURRENT_VAL integer ;
begin
execute immediate 'select ' || SEQUENCE_NAME || '.nextval from dual'
into CURRENT_VAL;
CURRENT_VAL := - ( CURRENT_VAL - 1 ) ;
RESET_SQL := 'alter sequence ' || SEQUENCE_NAME || ' increment by ' ||
CURRENT_VAL;
execute immediate RESET_SQL;
execute immediate 'select ' || SEQUENCE_NAME || '.nextval from dual'
into CURRENT_VAL;
RESET_SQL := 'alter sequence ' || SEQUENCE_NAME || ' increment by 1' ;
execute immediate RESET_SQL;
FUNCTION_RESULT := 1 ;
return ( FUNCTION_RESULT) ;
exception
when others then
return null ;
end FUN_RESET_SEQUENCE;
3. 输入序列名称来重置序列
select fun_reset_sequence( 'SEQ_TEST_NO' ) from dual;
4. 通过Job定时重置给定的序列
1. 定义重置序列测存储过程
create or replace procedure PRO_RESET_SEQUENCE( SEQUENCE_NAME in varchar2) is
begin
execute immediate 'select FUN_RESET_SEQUENCE(SEQUENCE_NAME) from dual' ;
end ;
2. 创建Job定时调用存储过程来重置序列
TRUNC(sysdate+1)+1/24
: 表示每一天凌晨一点执行Job
declare
JOB_RESET_SEQUENCE number;
begin
DBMS_JOB. SUBMIT( JOB = > JOB_RESET_SEQUENCE,
WHAT = > 'PRO_RESET_SEQUENCE(''SEQ_TEST_NO'');' ,
NEXT_DATE = > sysdate,
interval = > 'TRUNC(sysdate+1)+1/24' ) ;
commit ;
end ;
declare
JOB_RESET_SEQUENCE number;
begin
DBMS_JOB. SUBMIT( JOB = > JOB_RESET_SEQUENCE,
WHAT = > 'PRO_RESET_SEQUENCE(''SEQ_TEST_NO'');' ,
NEXT_DATE = > sysdate,
interval = > 'trunc(sysdate,''mi'')+1/(24*60)' ) ;
commit ;
end ;