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

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

ORA-00933: SQL command not properly ended

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

1
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)

第一个插入成功,但是第二个插入错误:

1
ORA-00933: SQL command NOT properly ended

我究竟做错了什么?


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

1
2
3
4
5
6
7
8
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:无效字符。

解决此问题的方法是使用BEGINEND;语法包装您的2条Oracle SQL语句,例如:

1
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+statement


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


对我来说,您似乎在两个语句之间缺少了;
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)
;
尝试添加;并告诉我们。


第一次插入后的半结肠?


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

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

注意:这还假定ADODB在一次调用中将允许2次插入。

另一种选择是将两个调用都包装在一个块中,

1
2
3
4
BEGIN
      INSERT (...) INTO (...);
      INSERT (...) INTO (...);
END;

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

还是要谢谢你的帮助!!


问题可能是您有一个参数变量,该变量为null插入查询中。那就是我的问题。一旦为参数指定了空字符串的默认值,它就会起作用。


除了分号问题,我强烈建议您研究绑定变量。未能使用它们可能会导致数据库性能问题。该代码也倾向于更简洁。


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


OLE_DB是否需要分号?大多数API都不需要它吗?


这是一个远景,但是在第一个插入中,sql日期格式对英国和美国均有效,如果Oracle DB设置为英国日期格式,则第二个插入无效,我意识到您已经使用了TO_DATE函数,但我没有看到其他...


推荐阅读