详细问题:
序列,job和存储过程,利用job做时间控制,每天时间到00:00点,序列重置为1开始
代码如下:
--序列,初始为一,自增为一
create sequence mysequence increment by 1 start with 1 cache 10;
--oracle存储过程代码
create or replace procedure seq_reset(v_seqname varchar2) as
n number(10);
tsql varchar2(100);
begin
execute immediate 'select '||v_seqname||'.nextval from dual' into n;
n:=-(n-1);
tsql:='alter sequence '||v_seqname||' increment by '|| n;--让序列一次递增-N,实现归0
execute immediate tsql;
execute immediate 'select '||v_seqname||'.nextval from dual' into n;
tsql:='alter sequence '||v_seqname||' increment by 1 ';
execute immediate tsql;
end seq_reset; --调用如下代码就可以让序列重置
call seq_Reset('mysequence')
问题:
1.但是我想用job来控制每天00:00时刻让序列自动重置,但是job里面是不是只能调用无参数的存储过程?
2.不知道为什么,我写job的时候,只要一运行,pl/sql就报出:无效的sql语句,但是sql都没错,网上copy下来的,请高手解答。
在线等....
序列,job和存储过程,利用job做时间控制,每天时间到00:00点,序列重置为1开始
代码如下:
--序列,初始为一,自增为一
create sequence mysequence increment by 1 start with 1 cache 10;
--oracle存储过程代码
create or replace procedure seq_reset(v_seqname varchar2) as
n number(10);
tsql varchar2(100);
begin
execute immediate 'select '||v_seqname||'.nextval from dual' into n;
n:=-(n-1);
tsql:='alter sequence '||v_seqname||' increment by '|| n;--让序列一次递增-N,实现归0
execute immediate tsql;
execute immediate 'select '||v_seqname||'.nextval from dual' into n;
tsql:='alter sequence '||v_seqname||' increment by 1 ';
execute immediate tsql;
end seq_reset; --调用如下代码就可以让序列重置
call seq_Reset('mysequence')
问题:
1.但是我想用job来控制每天00:00时刻让序列自动重置,但是job里面是不是只能调用无参数的存储过程?
2.不知道为什么,我写job的时候,只要一运行,pl/sql就报出:无效的sql语句,但是sql都没错,网上copy下来的,请高手解答。
在线等....
解决方案 »
- 使用oracle把csv文件打成zip包作为附件使用utl_smtp发送邮件的问题
- Oracle中保存长字符串用什么数据类型?
- 请教个很菜的问题
- 请问VS2010(C#)连接Oracle11g的字符串是什么?
- 由讨论下这个sql语句 引起
- oracle 专用的pl/sql 技巧,语句收集,大家帮帮忙
- toad to oracle里的function
- 数据库导入导出的问题(紧急!!!),高分奉送
- 提供一个好的oracle数据库备份工具好吗(除了imp80\exp80)?
- 请教!!!如何查看Oracle 数据库启动历史记录!!!
- oracle空间占用率的问题
- ORACLE触发器简单问题,新手在线求解
2、job的what参数设置:seq_Reset('mysequence');
3、如果使用cache的话,重置后cache里的序号未用完而取到昨日的编号,为了避免这种情况,可以在创建序列时使用nocache关键字
比如说:
--创建一张表
create table a(
mydate date
);
--创建存储过程,每隔一分钟,插入到数据库里面一条记录
create or replace procedure test as
begin
insert into a values(sysdate);
end;
--job,问题就在这,只要执行下面的语句,就说:无效的sql语句!
variable job1 number;
begin
sys.dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
commit;
end;求救!!
把出错的地方改成下面的就行了:
declare
job1 number;
begin
dbms_job.submit(job1,'test;',sysdate,'sysdate+1/1440'); --每天1440分钟,即一分钟运行test过程一次
dbms_job.run(job1);
commit;
end;
存储过程需要放在begin 和and之间。
把你的job贴出来,呵呵。
begin
sys.dbms_job.submit(job => :job,
what => '
begin
seq_reset('mysequence');
end;',
next_date => to_date('09-07-2010 01:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'trunc(sysdate)+2/24+1');
commit;
end;
还有像“TRUNC(sysdate,'mi')+1/(24*60)”这种格式的在job中怎么用,我看大多数多是用的“sysdate,'sysdate+1/1440'”这种的,不是说这种时间会漂移吗?