【问题标题】:Is there a way to get a line number for an Oracle error using Excel?有没有办法使用 Excel 获取 Oracle 错误的行号?
【发布时间】:2020-03-24 15:06:33
【问题描述】:

我使用 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 Run-time Error)

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

有没有什么方法可以从 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时会在最后一行出现运行时错误。

【问题讨论】:

  • 可能有助于显示一些关于如何获取当前错误消息的实际代码。发现运行时错误后,您是否正在查看 Connections Errors 属性?我不知道这是否会给您提供比您已经获得的更多信息。
  • 现在我没有错误处理。我只是让 Excel 抛出运行时错误。我将按照建议查看 Errors 属性。
  • 我确信这种方法的一个限制是我的查询中实际上没有“行”(与 Oracle SQL Developer 或 SQL*Plus 应用程序不同)。 qry 语句只是一个长字符串。但是,在 Oracle 发现错误的字符串中显示 where 的一些指示仍然会有所帮助。
  • 如果您有 SQL Developer 和/或 SQL*Plus,为什么不先在那里创建查询,然后 - 一旦确定 - 将其复制到 Excel 中?或者,至少,去你写的任何“在线 SQL 格式化程序”和格式化查询?无效则格式化失败。
  • 我喜欢将 Excel 用于我的 SQL 查询,因为我通常希望 Excel 电子表格中的结果。如果不需要,我不想打开其他应用程序并添加其他步骤。我用于 SQL 查询的电子表格适用于比我更广泛的受众;他们中的许多人没有 SQL Developer 或不知道如何使用它,但他们知道如何使用 Excel。感谢在线 SQL 格式化程序的建议!试了好几个,有几个没抓住上例中缺少的括号。

标签: sql vba oracle oledb adodb


【解决方案1】:

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

WHERE upper(column_name) LIKE '%FRAME%'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2023-03-25
    • 2012-01-20
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多