执行 Oracle Ad Hoc 查询时绑定参数出错; ORA-00907: 缺少右括号

Posted

技术标签:

【中文标题】执行 Oracle Ad Hoc 查询时绑定参数出错; ORA-00907: 缺少右括号【英文标题】:Execution of Oracle Ad Hoc query with Bind Parameters Erroring Out; ORA-00907: missing right parenthesis 【发布时间】:2014-07-14 23:33:28 【问题描述】:

我正在尝试使用 Visual Studio 2010 (.NET 4.0) 和 ODP 4.112.3.0、Oracle11g 执行带有参数(绑定变量)的临时查询。它在 ASP.NET 下的 32 位应用程序池中运行。我有以下代码:

Public Shared Function LookupUpc(ByVal upc As Long) As DataTable
    Dim upcLookup As New DataTable
    Dim sql As String = "OPEN :outCursor FOR SELECT * FROM IMPROD.UPC_ID_XREF " + _
                        "INNER JOIN IMPROD.UPC_ID_DESCRIPTIONS ON IMPROD.UPC_ID_XREF.UPC_ID = IMPROD.UPC_ID_DESCRIPTIONS.UPC_ID " + _
                        "INNER JOIN IMPROD.UPC_ID_ATTRIBUTES ON IMPROD.UPC_ID_XREF.UPC_ID = IMPROD.UPC_ID_ATTRIBUTES.UPC_ID " + _
                        "WHERE IMPROD.UPC_ID_XREF.UPC = :inUPC"

    Using dbConn As New OracleConnection(DataAccess.ConnectionString)
        dbConn.Open()

        Using dbCommand As New OracleCommand(sql, dbConn)
            dbCommand.CommandType = CommandType.StoredProcedure
            dbCommand.BindByName = True
            dbCommand.Parameters.Add("inUPC", OracleDbType.Int64).Value = upc
            dbCommand.Parameters.Add("outCursor", OracleDbType.RefCursor, DBNull.Value, ParameterDirection.Output)

            Using dbAdapter As New OracleDataAdapter(dbCommand)
                dbAdapter.Fill(upcLookup)
            End Using

            dbCommand.DisposeOfAllParameters()
        End Using
    End Using

    Return upcLookup
End Function

当我执行代码时,dbAdapter.Fill(upcLookup) 抛出一个关于缺少右括号的异常。

SQL 在 Toad 中执行良好。

添加了 outCursor 引用以尝试解决该问题。无论是否使用游标来检索结果,都会出现此问题。

我修改了 SQL 并尝试使用关于绑定和 ODP 和 ANSI 语法连接问题的 KB 注释使用 Oracle 的语法:

SELECT * FROM IMPROD.UPC_ID_XREF, IMPROD.UPC_ID_DESCRIPTIONS, 
IMPROD.UPC_ID_ATTRIBUTES WHERE IMPROD.UPC_ID_XREF.UPC = :inUPC
AND IMPROD.UPC_ID_XREF.UPC_ID = IMPROD.UPC_ID_DESCRIPTIONS.UPC_ID
AND IMPROD.UPC_ID_XREF.UPC_ID = IMPROD.UPC_ID_ATTRIBUTES.UPC_ID

这导致了相同的错误(以及一连串其他错误,包括在未预期的地方发现了“>”、发现了一个额外的分号等。括号错误是第一个列出的。)

我将 SQL 简化为:

 SELECT * FROM IMPROD.UPC_ID_XREF WHERE IMPROD.UPC_ID_XREF.UPC = :inUPC

但缺少括号的错误仍在继续。所以我更进一步,使用了这个 SQL:

 SELECT IMPROD.UPC_ID_XREF.UPC FROM IMPROD.UPC_ID_XREF;

这会从语句、变量和 JOIN 中删除多选 (*)。然而它仍然抛出一个错误:

 ORA-06550: line 1, column 68:
 PLS-00103: Encountered the symbol ">" when expecting one of the following:

 . ( * @ % & = - + < / > at in is mod remainder not rem
 <an exponent (**)> <> or != or ~= >= <= <> and or like like2
 like4 likec as between || multiset member submultiset
 The symbol "( was inserted before ">" to continue.
 ORA-06550: line 1, column 90:
 PLS-00103: Encountered the symbol ";" when expecting one of the following:

 . ( * % & = - + < / > at in is mod remainder not rem
 <an exponent (**)> <> or != or ~= >= <= <> and or like like2
 like4 likec as between || multiset memb

哪个是……大啊?

我尝试使用常量代替 :inUPC,但这没有帮助,所以我认为我的绑定没问题。

说到绑定,如果我关闭 BindByName,我会收到错误 ORA-01008: not all variables bound。我知道这与我上面的陈述相矛盾,但最初只有一个变量可以绑定。

我已经用 Google 搜索并阅读了 SO 上关于相同错误的大量帖子,但似乎没有任何内容符合要求。

我可以在我的手指周围环绕 SQL Server,但我是 Oracle 领域的新手。请帮助我欧比旺克诺比,你是我唯一的希望。 拍打莱娅公主的面包和装束;你必须把彼得格里芬想象成莱娅才能获得完整的效果

我知道这最终会是一些非常简单的修复。 感谢您的时间和帮助。

【问题讨论】:

在最后一次查询中,您只选择了一列,您的列拼写是否正确?也就是说,你的列名真的是 IMPROD.UPC_ID_XREF.UPC 吗? 是的,它包含一个数字 UPC 代码。 (我在一家零售连锁店工作。)我今天通过将代码移动到包和过程中解决了这个问题(没有问题);但是,我真的很想知道为什么使用 Oracle 的临时查询如此困难。 【参考方案1】:

这已经很晚了,但它咬了我。

您已明确声明 SQL 命令是存储过程,但它应该是文本。变化:

dbCommand.CommandType = CommandType.StoredProcedure

到:

dbCommand.CommandType = CommandType.Text

我怀疑它会像魔术一样发挥作用。无论如何,它对我有用。

【讨论】:

有点晚了,但是是的——它奏效了。剪切和粘贴编码的简单弊端又回来了。感谢您的澄清!【参考方案2】:

我通过使用过程而不是尝试临时执行查询来解决问题。 (所以问题并没有真正解决,而是解决了。)我一直试图避免这种情况,因为应用程序没有与之关联的其他数据库依赖项。

【讨论】:

以上是关于执行 Oracle Ad Hoc 查询时绑定参数出错; ORA-00907: 缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

ansible的两种命令执行方式 : ad-hoc / playbook以及通过setup模块获取系统参数

Ansible4:Ad-hoc与命令执行模块

Ansible4:Ad-hoc与命令执行模块

Ansible4:Ad-hoc与命令执行模块

ad-hoc sql 的列名

Ansible-Ad_Hoc临时命令的使用