执行 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: 缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章