declare
v_str_sql varchar2(500);
v_max_incident_id number;
v_seq_val number ;
v_seq_val2 number ;
v_diff number ;
v_offset number ;
begin
select incident_number into v_max_incident_id from cs.cs_incidents_all_b sr
where sr.incident_id =(select max(incident_id) from cs.cs_incidents_all_b);
select CS.CS_INCIDENTS_NUMBER_S.nextval into v_seq_val from dual;
if v_seq_val < v_max_incident_id then
v_diff:= v_max_incident_id - v_seq_val ;
v_offset:= v_diff + 101 ;
v_str_sql:='alter sequence CS.CS_INCIDENTS_NUMBER_S increment by '||v_offset||' nocache' ;
execute immediate v_str_sql;
end if ;
v_str_sql:='select CS.CS_INCIDENTS_NUMBER_S.nextval from dual';
execute immediate v_str_sqlinto v_seq_val2;
v_str_sql:='alter sequence CS.CS_INCIDENTS_NUMBER_S increment by 1 cache 100 ' ;
execute immediate v_str_sql;
end;
如上的pl/sql 是将某个sequence 修改为某个max值, 其中 execute immediate v_str_sql into v_seq_val2部分, 如果忘记写
后面的 into v_seq_val2 ,运行过程中也不会报错, 好像很顺利,但是实际上这个对于sequence至关重要的 select nextval 语句
没有被执行,导致sequence 没有修改为正确的值。 如果在这两句红色的语句被替换为等价的“select CS.CS_INCIDENTS_NUMBER_S.nextval from dual” 在PL/SQL中运行,而不使用 execute immediate , 那么就会报错:PLS-00428 。 所以使用execute immediate 的时候
需要特别注意。