ORA-00911事件

今天在用C#执行Oracle语句的时候出现了一个很奇怪的问题,查询字符串在PLSQL这样的Oracle工具中是可以执行的,但是在用ODP.NET(Oracle Data Provider for .NET)来进行查询的时候却出现ORA-00911错误,ORA-00911事件解释如下:

无效字符

起因: 标志符只能心数字和ASCII码字母开头,后续中也可以包含$#_。双引号内可以包含除了双引号外的所有字符,另外单引号中不能有空格,制表符或其他分隔符,违反以上规则都有可能引发无效字符错误。

 呵呵,上面的本来是英文,自己翻译的,不好请见谅。最后在网上查了一些资料,算是解决了,那就是查询语句最的“;”问题。如果去掉最后的一个“;”则可以正常的执行。自己测试了一个,在用ODP.NET执行语句是这个现象是普遍存在的。但是用ADO.NET进行SQL Server查询时这个现象是不存在的,只能说这是ODP.NET的问题了。

自己试了一下在Oracle工具中如果在一个语句末尾加两个“;”,则也会出现同样的问题,所以设想如下:在ODP.NET中在进行查询向数据库提交时会自动在末尾添加分号,所以如果在字符串中有分号就会出现错误。但ADO.NET中用于连接SQL Server的进行了智能化的处理,如果末尾有分号则不加分号,如果没有分号则添加分号。所以无论有没有分号都可以正常的执行。

### ORA-00911: invalid character 错误解决方案 ORA-00911 错误通常表示在 SQL 语句中存在无效字符,这可能是由于多余的换行符、空格、特殊字符或其他语法问题引起的[^2]。以下是详细的分析与解决方法。 #### 1. 检查 SQL 语句中的多余字符 无效字符可能隐藏在 SQL 语句的末尾或中间。例如,在语句结束后的分号后添加了多余的空格或换行符,可能导致此错误。以下是一个示例: ```sql SELECT * FROM my_table; -- 多余的空格或换行符可能引发 ORA-00911 错误 ``` 确保 SQL 语句格式正确且无多余字符。正确的写法应为: ```sql SELECT * FROM my_table; ``` #### 2. 避免使用不支持的特殊字符 对象名称或 SQL 语句中包含特殊字符(如 `$`, `#`, `@` 等)可能会导致 ORA-00911 错误。如果必须使用这些字符,需用双引号括起来。例如: ```sql CREATE TABLE "my-table" ( id NUMBER ); ``` 尽管此语句合法,但建议避免使用特殊字符以减少潜在问题[^3]。 #### 3. 检查 MyBatis 或其他框架中的 SQL 构建逻辑 在使用 MyBatis 等框架时,动态生成的 SQL 语句可能因拼接错误而包含无效字符。例如,在 `<foreach>` 标签中未正确处理分隔符可能导致此问题。以下是一个常见错误示例: ```xml <update> UPDATE my_table SET column = CASE id <foreach collection="list" item="item" separator=","> WHEN #{item.id} THEN #{item.value} </foreach> END WHERE id IN <foreach collection="list" item="item" open="(" close=")" separator=","> #{item.id} </foreach> </update> ``` 上述代码中,若 `separator` 使用不当,可能导致多余的逗号或其他无效字符。确保生成的 SQL 语句结构正确。 #### 4. 汉化 PL/SQL Developer 的影响 汉化 PL/SQL Developer 可能导致编码问题,从而引发 ORA-00911 错误。为避免此问题,建议在汉化前关闭 PL/SQL Developer,并确保未配置可能导致编码冲突的 Windows 系统环境变量[^1]。 #### 5. 示例代码修复 以下是一个修复 ORA-00911 错误的示例: ```sql -- 错误示例 SELECT * FROM my_table; -- 正确示例 SELECT * FROM my_table; ``` #### 6. 其他注意事项 - 确保数据库客户端和服务器之间的字符集一致。 - 在编写复杂查询时,使用工具(如 PL/SQL Developer 或 SQL Developer)进行语法检查。 - 定期清理不再使用的对象以减少命名冲突的可能性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值