我使用Microsoft Excel执行许多Oracle SQL查询。与Oracle的连接是通过VBA使用一个ADODB.Connection对象和一个带有Provider=OraOLEDB.Oracle的连接字符串建立的。它工作得很好。但是,有时在构造新查询时,我会出错。我想知道是否有一种方法可以从传递给VBA的Oracle错误消息中提取更多信息(比如行号)。
例如,这是一个有效的查询,它给出了有效的结果:
SELECT owner, table_name, column_name
FROM all_tab_columns
WHERE upper(column_name) LIKE '%FRAME%'现在,让我们通过忘记第3行上()函数的闭括号来引入一个错误:
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 query语句中存在错误,则在尝试打开RecordSet时,运行时错误将出现在最后一行。
发布于 2020-04-09 16:12:59
Te上部函数需要右括号。所以..。
WHERE upper(column_name) LIKE '%FRAME%'https://stackoverflow.com/questions/60833728
复制相似问题