我在过程里使用了动态执行DDL语句,删除一个序列再重建,以生成一个可以跟据年份生成的一个主键编号,代码如下:
if v_YYYY <> to_char(sysdate, 'yyyy') or (v_YYYY = ' ' or v_YYYY is null) then
v_strSQL := 'drop sequence ds2002.SEQUENCE_GSMXB_CB_LS';
execute immediate v_strSQL;
v_strSQL := 'create sequence ds2002.SEQUENCE_GSMXB_CB_LS
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 100
cycle';
execute immediate v_strSQL;
--replace procedure p_gsmxb_cb_ls;
commit;
select sequence_GSMXB_CB_LS.nextval into v_num from dual;
v_YYYY := to_char(sysdate, 'yyyy');
update gsmxb_idnumber
set id_year = v_YYYY, xgrq = sysdate
where id_bh = 1;
dbms_output.put_line('NO!');
else
select sequence_GSMXB_CB_LS.nextval into v_num from dual;
v_YYYY := to_char(sysdate, 'yyyy');
dbms_output.put_line('YES!');
end if;
过程编辑绝对通过,并且通过command测试都没有问题,但是我前端程序(PB)调就有问题,如我前面的年份是2006,现在跨年为2007,过程会删除序更重新创建一个新序列,这一步是成功的,但第二再调就报“无效的描术对象”(过程无效了),郁闷呀!
我在想是不是重建了序列后过程所关联的对象发生了改变,要重庆编辑才行。可这个重新编辑能在能通SQL语句来执行吗,就是把它写要那个过程里,当我删除了序列后,再执行重新编辑的SQL。有这种方式吗,SQL怎么实现呢。各位大哥哥们,救救我吧!
if v_YYYY <> to_char(sysdate, 'yyyy') or (v_YYYY = ' ' or v_YYYY is null) then
v_strSQL := 'drop sequence ds2002.SEQUENCE_GSMXB_CB_LS';
execute immediate v_strSQL;
v_strSQL := 'create sequence ds2002.SEQUENCE_GSMXB_CB_LS
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
cache 100
cycle';
execute immediate v_strSQL;
--replace procedure p_gsmxb_cb_ls;
commit;
select sequence_GSMXB_CB_LS.nextval into v_num from dual;
v_YYYY := to_char(sysdate, 'yyyy');
update gsmxb_idnumber
set id_year = v_YYYY, xgrq = sysdate
where id_bh = 1;
dbms_output.put_line('NO!');
else
select sequence_GSMXB_CB_LS.nextval into v_num from dual;
v_YYYY := to_char(sysdate, 'yyyy');
dbms_output.put_line('YES!');
end if;
过程编辑绝对通过,并且通过command测试都没有问题,但是我前端程序(PB)调就有问题,如我前面的年份是2006,现在跨年为2007,过程会删除序更重新创建一个新序列,这一步是成功的,但第二再调就报“无效的描术对象”(过程无效了),郁闷呀!
我在想是不是重建了序列后过程所关联的对象发生了改变,要重庆编辑才行。可这个重新编辑能在能通SQL语句来执行吗,就是把它写要那个过程里,当我删除了序列后,再执行重新编辑的SQL。有这种方式吗,SQL怎么实现呢。各位大哥哥们,救救我吧!
这句也用动态语句 execute immediate 'select sequence_GSMXB_CB_LS.nextval from dual' into v_num;