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

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 的时候

需要特别注意。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值