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:无效字符的主要内容,如果未能解决你的问题,请参考以下文章

动态 SQL 和 ORA-00911

动态 sql 错误 ORA-00911

插入错误:java.sql.SQLException:ORA-00911:无效字符

Mybatis 批量更新 ORA-00911: 无效字符的错误

java.sql.SQLException: ORA-00911: 无效字符

java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符