Я пытаюсь передать блок 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"