SQL%ROWCOUNT 产生 ORA-00911:无效字符
Posted
技术标签:
【中文标题】SQL%ROWCOUNT 产生 ORA-00911:无效字符【英文标题】:SQL%ROWCOUNT yielding ORA-00911: invalid character 【发布时间】:2018-02-28 01:08:44 【问题描述】:我正在尝试记录受 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 中使用该变量
【问题讨论】:
您是否在 pl/sql 块中运行它,因为如果不是,那将无法工作。 是的,在 TOAD 中,F5。[MyTotal]
列是整数类型。
Toad 不是 pl/sql 块。
Converting SQL Select Query to PL/SQL Anonymous Block (ORACLE)的可能重复
@JorgeCampos 过程是 PL/SQL 块吗?
【参考方案1】:
您可能正在尝试做这样的事情。请注意,即使在 PL/SQL 块(无论是存储过程还是匿名过程)中,您也不能像在 INSERT
语句中一样使用 SQL%ROWCOUNT
;您必须创建一个变量,为其分配计数,然后在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
!而且,我希望这是对您实际所做的事情的过度简化;日志表中的一行,只显示删除了多少行,没有其他信息(如时间戳),是没有用的。
【讨论】:
以上是关于SQL%ROWCOUNT 产生 ORA-00911:无效字符的主要内容,如果未能解决你的问题,请参考以下文章
插入错误:java.sql.SQLException:ORA-00911:无效字符
Mybatis 批量更新 ORA-00911: 无效字符的错误