PL/SQL 中 execute immediate,select 語句沒有into 執行未報錯

tolywang發表於2014-10-08

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_sql into 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 的時候
需要特別注意。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/35489/viewspace-1291993/,如需轉載,請註明出處,否則將追究法律責任。

相關文章