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。
解决这个问题的方法是用BEGIN
和END;
语法包装你的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 命令未正确结束”错误(立即执行)?