我试图记录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中使用该变量
答案 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
!并且,我希望这对你实际做的事情有一个显着的过度简化;日志表中的一行,只显示删除了多少行,没有其他信息(例如时间戳),是没用的。