5

我正在使用用于 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

我究竟做错了什么?

4

10 回答 10

14

在 .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。

这个问题的解决方案是用BEGINandEND;语法包装你的 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

于 2011-05-19T10:03:04.247 回答
10

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

于 2013-06-19T14:25:22.847 回答
3

第一次插入后的半冒号?

于 2008-09-16T13:29:25.613 回答
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)
;
;

于 2008-09-16T13:30:55.970 回答
2

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

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

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

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

BEGIN
      insert (...) into (...);
      insert (...) into (...);
END;
于 2008-09-16T13:29:53.100 回答
1

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

还是要谢谢你的帮助!!

于 2008-09-16T14:33:08.767 回答
0

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

于 2008-09-16T13:35:16.427 回答
0

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

于 2008-09-16T13:54:27.037 回答
0

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

于 2008-09-17T00:12:46.800 回答
0

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

于 2018-02-01T19:03:45.577 回答