ITPub博客

首页 > 数据库 > Oracle > PL/SQL 中 execute immediate,select 语句没有into 执行未报错

PL/SQL 中 execute immediate,select 语句没有into 执行未报错

原创 Oracle 作者:tolywang 时间:2014-10-08 17:59:30 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/35489/viewspace-1291993/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    14695370