Невозможно выполнить / передать блок кода SQL в Oracle через Excel-VBA - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь передать блок SQL (Oracle), чтобы получить результаты и сохранить их в Excel, используя VBA.Соединение установлено успешно и может получить результаты простого запроса.Но при замене простого запроса блоком SQL возвращается ошибка.

Примечание: Из-за ограниченного доступа к БД я не могу создать функцию.Таким образом, пытаясь передать один и тот же блок кода во время выполнения.

Пытаясь достичь - Извлечение количества строк каждой таблицы из БД и сохранение в Excel путем обработки исключения тоже

cnn_meta.Open (.....)
sqlQry = "DECLARE tmp_table VARCHAR2(125); table_does_not_exist EXCEPTION; PRAGMA EXCEPTION_INIT(table_does_not_exist, -00942); row_cnt integer; " & vbCrLf & _
            "BEGIN FOR cntr IN (SELECT owner,table_name FROM all_tables where owner='APPQOSSYS')" & vbCrLf & _
            "  LOOP BEGIN tmp_table := cntr.owner || '.' || cntr.table_name; EXECUTE IMMEDIATE 'SELECT count(1) FROM ' || tmp_table ||' where rownum =1' into row_cnt; dbms_output.put_line(tmp_table || ' - ' || row_cnt); " & vbCrLf & _
            "        EXCEPTION WHEN table_does_not_exist THEN dbms_output.put_line('table dose not exists - ' || tmp_table); " & vbCrLf & _
            "            WHEN OTHERS THEN IF (SQLCODE = -942) THEN DBMS_Output.Put_Line('in exception'); ELSE DBMS_Output.Put_Line(tmp_table || ' - Dont have access\didnt exist'); END IF; " & vbCrLf & _
            "END; END LOOP; END;"
res_meta.Open sqlQry, cnn_meta, adOpenStatic
For iCols = 0 To res_meta.Fields.Count - 1
            Worksheets("sheet1").Cells(1, iCols + 1).Value = res_meta.Fields(iCols).Name
Next

Worksheets("sheet1").Range("A2").CopyFromRecordset res_meta
res_meta.Close
cnn_meta.Close

Когда я выполняю приведенный выше код, возвращается ошибка ниже

Ошибка времени выполнения '3704':
Операция не разрешена, когда объект закрыт

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

Простой \ Пропущенный запрос-

sqlQry = "select owner,table_name, to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||owner ||'.'||table_name)),'/ROWSET/ROW/C')) Count " & _
    '         "from all_tables"

1 Ответ

0 голосов
/ 19 июня 2019

Я полагаю, что ошибка связана с res_meta.Close строкой

Невозможно закрыть набор записей, если набор записей не был возвращен. Ваш Select... запрос возвращает набор записей, но на первый взгляд кажется, что другой запрос создает временную таблицу и, следовательно, не возвращает набор записей. Удалите строку, которая должна закрыть набор записей, и код должен работать.

Следующий метод не возвращает ничего, если набор записей не был возвращен.

res_meta.Open sqlQry, cnn_meta, adOpenStatic
On Error Resume Next
    Debug.Print rs.EOF
On Error GoTo 0
If err.Number <> 0 Then
    MsgBox "No recordset was returned", vbCritical, "Error"
Else
    For iCols = 0 To res_meta.Fields.Count - 1
        Worksheets("sheet1").Cells(1, iCols + 1).Value = res_meta.Fields(iCols).Name
    Next

    Worksheets("sheet1").Range("A2").CopyFromRecordset res_meta
    res_meta.Close
End If
err.Clear
cnn_meta.Close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...