为啥 OraOLEDB.Oracle GetRecordSet() 会抛出“ORA-00907:缺少右括号”错误?

Posted

技术标签:

【中文标题】为啥 OraOLEDB.Oracle GetRecordSet() 会抛出“ORA-00907:缺少右括号”错误?【英文标题】:Why would OraOLEDB.Oracle GetRecordSet() throw "ORA-00907: missing right parenthesis" error?为什么 OraOLEDB.Oracle GetRecordSet() 会抛出“ORA-00907:缺少右括号”错误? 【发布时间】:2011-02-02 20:49:59 【问题描述】:

不幸的是,我正在开发一个旧的 VB6 应用程序,该应用程序正在构建一个巨大的(11902 个字符)即席 SQL 语句,然后将其传递给我的 DBConnection 的 GetRecordSet() 方法。该应用程序正在使用 OraOLEDB.Oracle 提供程序。但是,当执行 GetRecordSet() 方法时,出现以下错误:

ORA-00907:缺少右括号

现在我已经获取了传递给 GetRecordSet() 函数的字符串的内容,并对其进行了彻底的检查,并且没有遗漏括号。此外,我能够在 Oracle SQL Developer 和 SQL*Plus 中毫无困难地执行 select 语句。所以我确信这个字符串在语法上是正确的。

我开始怀疑提供程序中发生了一些可疑的事情 - 也许字符串太长并且在某处被截断?

有谁能帮帮我吗?

谢谢, 史蒂夫

【问题讨论】:

【参考方案1】:

检查 oracle 跟踪文件。 首先将会话设置为跟踪模式: 更改会话集 sql_trace = true;

并在同一会话中运行您的查询。您可以在user_dump_dest指向的目录中找到数据库服务器上的跟踪文件。

如果查询完全在跟踪文件中,则它已完全被数据库接收。

【讨论】:

感谢您的回复。谈到甲骨文,我是一个完整的新手。确切地说,我应该去哪里“将我的会话设置为跟踪模式”?我假设这是我在 SQLPlus 中会做的事情。但如果我在 SQLPlus 中执行此操作,那与我的 VB6 应用程序执行的会话不是不同的会话吗?该查询似乎在 SQL*Plus 中运行良好。只有在我的应用程序中尝试通过 GetRecordSet() 函数执行查询时才会出现此问题。 另外,我是绝对的 Oracle 初学者,我在哪里可以找到“user_dump_dest”设置?再次感谢您的帮助 从 v$parameter 中选择值,其中 name = 'user_dump_dest';您还可以用户从 v$parameter 中选择名称、值来列出所有实例参数。 史蒂夫,调整应用程序以在执行您的具有挑战性的查询之前为您执行“alter session set sql_trace = true”。这是调试程序 oracle 行为的一种非常有用的方法,因此在应用程序的调试模式中赋予它一个角色是有意义的。 谢谢!这在两个方面都有帮助。现在,在查看跟踪之后,似乎整个查询都通过了。奇怪的是,有几个块中的所有空白都被删除了。因此,Oracle 实际上接收的不是“SELECT ndel.PlantId, ndel.UnitId FROM InspectionData ndel”,而是“SELECTndel.PlantId,ndel.UnitIdFROMInspectionDatandel”。这真的很奇怪。 VB 代码似乎在所有正确的地方都用空格正确地组装了字符串,但提供者似乎出于某种原因将它们剥离了。有什么想法吗?

以上是关于为啥 OraOLEDB.Oracle GetRecordSet() 会抛出“ORA-00907:缺少右括号”错误?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle11g链接提示未“在本地计算机注册“OraOLEDB.Oracle”解决方法

OraOLEDB.Oracle 提供程序未在本地计算机上注册 [关闭]

未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序--问题的处理

Oracle数据库连接中Provider=OraOleDb.Oracle.1与Provider=MSDAORA啥区别?

链接服务器“FDMEE_SIMPHONY”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“ORA-00903:无效表名”

oracle oledb 驱动找不到怎么办