首页 > 解决方案 > 有没有办法使用 Excel 获取 Oracle 错误的行号?

问题描述

我使用 Microsoft Excel 进行了大量的 Oracle SQL 查询。通过 VBA 使用 ADODB.Connection 对象和 Provider=OraOLEDB.Oracle 的连接字符串与 Oracle 建立连接。它工作得很好。但是,有时在构建新查询时,我会出错。我想知道是否有办法从传递给 VBA 的 Oracle 错误消息中提取更多信息(例如行号)。

例子; 这是一个有效的查询,它给了我有效的结果:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE upper(column_name) LIKE  '%FRAME%'

现在,让我们通过忘记第 3 行中 UPPER() 函数的右括号来引入错误:

SELECT owner, table_name, column_name 
FROM all_tab_columns 
WHERE upper(column_name LIKE  '%FRAME%'

如果我在 Oracle SQL Developer 中运行此查询,我会收到以下错误消息:

ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:
Error at Line: 3 Column: 25

如果我在更基本的 Oracle SQL*Plus 终端中运行相同的查询,我还会得到行号和错误发生位置的可视指示器:

WHERE upper(column_name LIKE  '%FRAME%'
                        *
ERROR at line 3:
ORA-00907: missing right parenthesis

但是,在 Excel 中,我得到的只是基本的 Oracle 错误语句(ORA-00907:缺少右括号),而没有任何指示错误在我的查询中的位置。 (Excel VBA 运行时错误)

对于这个例子,很容易找到,但对于一些复杂的查询,找到错误的位置可能会很棘手。

有没有办法从 ADODB Open 方法或 OraOLEDB.Oracle 提供程序抛出的错误消息中获取附加信息,例如行号?

示例 VBA 代码:

Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cnStr As String
Dim qry As String

Set cn = New ADODB.Connection
Set rs = New ADODB.Recordset
cnStr = "Provider=OraOLEDB.Oracle;" _
      & "Data Source=(DESCRIPTION=(CID=GTU_APP)(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=redacted)(PORT=1234)))(CONNECT_DATA=(SID=redacted)(SERVER=DEDICATED)));" _
      & "User Id=redacted;" _
      & "Password=redacted;"
qry = "SELECT owner, table_name, column_name " _
    & "FROM all_tab_columns " _
    & "WHERE upper(column_name LIKE '%FRAME%'"
cn.Open cnStr
rs.Open qry, cn

(qry 语句实际上并没有在 VBA 中硬编码;我从工作表中读取它,但这会给出相同的结果。)

如果 SQL 查询语句出现错误,则在尝试打开 RecordSet 时会在最后一行出现运行时错误。

标签: sqlvbaoracleoledbadodb

解决方案


Te UPPER 函数需要右括号。所以...

WHERE upper(column_name) LIKE '%FRAME%'

推荐阅读