SQL%ROWCOUNT产生ORA-00911:无效字符

时间:2018-02-28 01:08:44

标签: oracle

我试图记录DELETE语句中受影响的行数,所以

delete MyTbl where MyCondition = 1;
insert into MyLog(MyTotal) values(SQL%ROWCOUNT);

得到这个:

  
    

删除了10行。

         

插入MyLog(MyTotal)值(SQL%ROWCOUNT)

         

第2行出错     ORA-00911:无效字符

  

原因:

  
    

与PL / SQL无关。 SQL%ROWCOUNT很特别。

         

即使在PL / SQL块中也无法在INSERT语句中使用SQL%ROWCOUNT(无论是存储过程还是匿名过程);你必须创建一个变量,为它分配计数,并在INSERT中使用该变量

  

1 个答案:

答案 0 :(得分:4)

你可能正在尝试做这样的事情。请注意,即使在PL / SQL块中(无论是存储过程还是匿名过程),您都不能在SQL%ROWCOUNT语句中使用INSERT;您必须创建一个变量,为其分配计数,并在INSERT中使用该变量。

create table mytbl (id number, mycondition number);

insert into mytbl
  select 101, 1 from dual union all
  select 102, 2 from dual union all
  select 105, 1 from dual union all
  select 110, 9 from dual
;

commit;

create table mylog(mytotal number);

匿名阻止(我们没有命名的程序,所以我们只能使用它一次;否则给它一个名字,它就变成了一个"存储过程"):

declare
  cnt number;
begin
  delete mytbl where mycondition = 1;
  cnt := sql%rowcount;
  insert into mylog(mytotal) values (cnt);
end;
/

执行它(选择并按F5?我不使用Toad,但这就是它在SQL Developer中的工作方式)。

然后检查结果:

select * from mytbl;

 ID MYCONDITION
--- -----------
102           2
110           9

select * from mylog;

MYTOTAL
-------
      2

完成后别忘了COMMIT!并且,我希望这对你实际做的事情有一个显着的过度简化;日志表中的一行,只显示删除了多少行,没有其他信息(例如时间戳),是没用的。