ORA-00933: SQL 命令未正确结束

Posted

技术标签:

【中文标题】ORA-00933: SQL 命令未正确结束【英文标题】:ORA-00933: SQL command not properly ended 【发布时间】:2010-09-09 11:39:38 【问题描述】:

我正在使用用于 ADO.Net 的 OLEDB 提供程序连接到 Oracle 数据库。在我的循环中,我正在插入:

insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000)insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000)

第一次插入成功,但第二次出错:

ORA-00933: SQL command not properly ended

我做错了什么?

【问题讨论】:

您是否要同时进行两个插入? 【参考方案1】:

在 .net 中,当我们尝试执行以分号结尾的单个 Oracle SQL 语句时。结果将是一个 oracle 错误:ora-00911: invalid character。好的,您认为一个 SQL 语句不需要分号,但是在一个字符串中执行 2 个 SQL 语句例如:

Dim db As Database = DatabaseFactory.CreateDatabase("db")
Dim cmd As System.Data.Common.DbCommand
Dim sql As String = ""

sql = "DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; "

cmd = db.GetSqlStringCommand(sql)
db.ExecuteNonQuery(cmd)

上面的代码会给你同样的 Oracle 错误:ora-00911: invalid character。

解决这个问题的方法是用BEGINEND; 语法包装你的2条Oracle SQL语句,例如:

sql = "BEGIN DELETE FROM iphone_applications WHERE appid = 1; DELETE FROM iphone_applications WHERE appid = 2; END;"

礼貌:http://www.lazyasscoder.com/Article.aspx?id=89&title=ora-00911%3A+invalid+character+when+executing+multiple+Oracle+SQL+statements

【讨论】:

当您在问题/答案中输入代码时,如果您将其格式化为代码,则更具可读性。 “”按钮为您执行此操作,或者您可以手动缩进代码。您还可以使用反引号标记句子中的代码。【参考方案2】:

在 Oracle 中,分号 ';'仅在 sqlplus 中使用。当您使用 ODBC/JDBC、OLEDB 等时,您不要在语句末尾添加分号。在上述情况下,您实际上是在执行 2 条不同的语句,因此处理该问题的最佳方法是使用 2 条语句,而不是尝试组合成一条语句,因为您不能使用分号。

【讨论】:

【参考方案3】:

在我看来,您似乎在两个语句之间缺少;insert into ps_tl_compleave_tbl values('2626899', 0, TO_DATE('01/01/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '52', TO_DATE('01/01/2002', 'MM/DD/YYYY'), 16.000000, 24.000);insert into ps_tl_compleave_tbl values('4327142', 0, TO_DATE('03/23/2002', 'MM/DD/YYYY'), 'LTKN', 'LTKN', '51', TO_DATE('03/23/2002', 'MM/DD/YYYY'), 0.000000, 0.000); 尝试添加; 并告诉我们。

【讨论】:

【参考方案4】:

第一次插入后的分号?

【讨论】:

在语句末尾添加分号会给我这个错误:ORA-00911: invalid character【参考方案5】:

Oracle SQL 使用分号;作为它的语句结束标记。

您需要添加 ;在打扰插入语句之后。

注意:这也假设 ADODB 允许在一次调用中进行 2 次插入。

替代方法可能是将两个调用包装在一个块中,

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;

【讨论】:

【参考方案6】:

在我的循环中,我没有重新初始化我的 StringBuilder ...因此我发布了多个插入语句。

还是谢谢你的帮助!!

【讨论】:

【参考方案7】:

这是一个很长的镜头,但在第一次插入时,sql 日期格式对英国/美国都有效,如果 Oracle DB 设置为英国日期格式,第二次插入无效,我知道你已经使用了 TO_DATE 函数,但我别的什么都看不到...

【讨论】:

【参考方案8】:

ADO.NET OLE DB 提供程序用于您没有特定数据库提供程序的通用数据访问。使用 OracleConnection 等优先于 OleDbConnection 进行 Oracle 数据库连接。

【讨论】:

【参考方案9】:

除了分号问题,我强烈建议您查看绑定变量。不使用它们可能会导致数据库性能问题。代码也更简洁。

【讨论】:

【参考方案10】:

问题可能是您在查询中插入了一个为空的参数变量。这就是我的问题所在。一旦我给参数一个空字符串的默认值,它就起作用了。

【讨论】:

以上是关于ORA-00933: SQL 命令未正确结束的主要内容,如果未能解决你的问题,请参考以下文章

“ORA-00933: SQL 命令未正确结束”

ORA-00933: 运行创建序列命令时 SQL 命令未正确结束

为啥会出现“ORA-00933:SQL 命令未正确结束”错误(立即执行)?

ora-00933:SQL 命令未正确结束

ORA-00933: UPDATE 命令的 SQL 命令未正确结束 [关闭]

ORA-00933: SQL 命令未正确结束异常