【问题标题】:ORA-00933: SQL command not properly endedORA-00933: SQL 命令未正确结束
【发布时间】: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

我做错了什么?

【问题讨论】:

  • 您是否要同时进行两个插入?

标签: sql oracle ora-00933


【解决方案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】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2010-11-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多