Есть ли способ получить номер строки для ошибки Oracle с помощью Excel? - PullRequest
1 голос
/ 24 марта 2020

Я делаю много Oracle SQL запросов, используя Microsoft Excel. Соединение с Oracle осуществляется через VBA с использованием объекта ADODB.Connection и строки соединения с Provider = OraOLEDB. Oracle. Это работает очень хорошо. Однако иногда при создании нового запроса я делаю ошибку. Мне интересно, есть ли способ извлечь дополнительную информацию (например, номер строки) из сообщения об ошибке Oracle, которое передается в VBA.

Пример; это рабочий запрос, который дает мне действительные результаты:

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

Теперь давайте введем ошибку, забыв закрывающую скобку для функции UPPER () в строке 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

Если я выполняю тот же запрос в более базовом c Oracle SQL* Кроме терминала, я также получаю номер строки и визуальный индикатор того, где произошла ошибка:

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

Однако в Excel все, что я получаю, это базовое c Oracle заявление об ошибке (ORA -00907: отсутствует правая скобка), без указания места ошибки в моем запросе. (Ошибка времени выполнения Excel VBA)

Для этого примера его достаточно легко найти, но для некоторых сложных запросов может быть сложно найти местоположение ошибки.

Есть ли способ получить дополнительную информацию, такую ​​как номер строки, из сообщения об ошибке, которое выдается методом ADODB Open или OraOLEDB. Oracle provider?

Пример кода 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; я прочитал его с рабочего листа, но это дало бы тот же результат.)

Если в * 1042 есть ошибка * оператор запроса, ошибка времени выполнения будет возникать в последней строке при попытке открыть RecordSet.

1 Ответ

0 голосов
/ 09 апреля 2020

Te UPPER Функция требует закрывающих скобок. Итак ...

WHERE upper(column_name) LIKE '%FRAME%'
...