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

时间:2008-09-16 13:27:54

标签: sql oracle ora-00933

我正在使用OLEDB提供程序将ADO.Net连接到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

我做错了什么?

11 个答案:

答案 0 :(得分:12)

在.net中,当我们尝试在末尾执行带分号的单个Oracle SQL语句时。结果将是oracle错误:ora-00911:无效字符。好的,你认为一个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:无效字符。

此问题的解决方案是使用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

答案 1 :(得分:5)

在Oracle中,分号&#39 ;;'仅用于sqlplus。当您使用ODBC / JDBC,OLEDB等时,不要在语句的末尾加上分号。在上面的例子中,你实际上正在执行2个不同的语句,所以处理问题的最好方法是使用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)
;
尝试添加;并告诉我们。

答案 3 :(得分:2)

第一次插入后

半结肠?

答案 4 :(得分:2)

Oracle SQL使用分号;作为陈述标记的结尾。

你需要添加;在插入陈述之后。

注意:这也假设ADODB将在一次通话中允许2次插入。

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

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

答案 5 :(得分:1)

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

谢谢你的帮助!!

答案 6 :(得分:0)

这是一个很长的镜头,但在第一个插入中,sql日期格式对uk / us都有效,如果Oracle DB设置为UK日期格式,则第二个插入无效,我意识到你已经使用了TO_DATE函数但是我什么都看不到......

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

除分号问题外,我强烈建议您查看绑定变量。未能使用它们可能会导致数据库性能问题。代码也趋于清晰。

答案 10 :(得分:0)

问题可能是您有一个插入查询的null参数变量。这就是我的问题所在。一旦我给参数一个默认的空字符串值,就可以了。