VBA: Oracle SQL-запрос вставки не вставляет данные - PullRequest
1 голос
/ 26 марта 2019

Извиняюсь, если это слишком много информации, но я хотел быть тщательным при публикации.

У меня возникла проблема с заполнением моей временной таблицы данными из запроса вставки.

  • Эти данные извлекаются из таблиц Oracle SQL

  • Этот запрос создает временную таблицу, вставляет данные и без проблем запрашивает временную таблицу в программном обеспечении Oracle SQL Developer

  • Мой код успешно выполнитсясоздать временную таблицу (я проверил ее существование в программном обеспечении Oracle)

  • Я могу использовать Select Queries с моей настройкой (поэтому я не верю, что проблема в соединении)

  • Запуск моего кода не вызывает ошибок (по крайней мере, ничего, что останавливает выполнение)

Что я заметил, так это то, что если яиспользуйте «Набор записей» при выполнении моего запроса на вставку, он показывает, что имеется ожидаемое количество строк, на которые влияют, но когда я выбираю все (из программного обеспечения Oracle) из временной таблицы, он ничего не показывает.

Я былоглядываясь по сторонам, но я не совсем понял, чего мне не хватает.Из того, что я читал, могло быть то, что я не включил NOCOUNT (или не выключил FEEDBACK), но я не могу найти, как на самом деле сделать это в своем коде VBA.Первоначально я попытался вставить данные в существующую таблицу, поэтому попытался создать временную таблицу для перемещения данных в нее.

Параметр Явный

Sub oracleQuery ()

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Set ws1 = ActiveWorkbook.Worksheets("Query Output")
Set ws2 = ActiveWorkbook.Worksheets("Main Page")

Очищает рабочий лист запроса

ws1.Cells.Clear

Назначает переменные

Dim cnn As New ADODB.Connection
Dim rst As New ADODB.RecordSet
Dim ConnectionString As String
Dim StrQuery As String
Dim StrQuery2 As String
Dim StrQuery3 As String
Dim StrQuery4 As String

Этот запрос создает пустую таблицу Global Temp (с заголовками столбцов)

StrQuery = "XXXXXX"

Этоmy insert Query

StrQuery2 = "INSERT INTO temp_1 (Field1,Field2,Field3,..etc) Select From 
      Where UNION ALL Select From Where UNION ALL..Etc

Этот запрос выбирает данные из временной таблицы и объединяет некоторые дополнительные поля с подробной информацией

StrQuery3 = "Select temp_1. Etc....

Этот запрос используется для удаления временной таблицы, когдаЯ закончил с этим

StrQuery4 = "DROP TABLE temp_1"

Это моя строка подключения

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(XXX)(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"

Открывает соединение с базой данных, также устанавливает таймер таймаута

cnn.Open ConnectionString
cnn.CommandTimeout = 60

Выполняет Tempзапрос таблицы

cnn.Execute StrQuery

Выполнение запроса вставки

cnn.BeginTrans
cnn.Execute StrQuery2
cnn.CommitTrans

Выполнение запроса выбора для временной таблицы, использование набора записей

rst.Open StrQuery3, cnn

Удаление временной таблицы

cnn.Execute StrQuery4

Сбрасывает все результаты из установленной записи вячейка A2 первого листа в активной рабочей книге

ws1.Range("A2").CopyFromRecordset rst

Строка подключения пустой тары

ConnectionString = ""

Закрывает и очищает набор записей

rst.Close
Set rst = Nothing

End Sub

Было бы здорово определить, что на самом деле заставляет мой запрос вставки не вставлять данные.Я был бы очень признателен за понимание этой проблемы, поскольку у меня заканчиваются идеи для проверки.

ОБНОВЛЕНИЕ Я упростил свой код, чтобы отточить свою проблему.Моя проблема в том, что INSERT INTO Query фактически не вставляет какие-либо данные в таблицу.Выбрать запрос Я пытаюсь вставить результаты в 3 столбца и строки данных.

Запрос временной таблицы

StrQuery = "CREATE GLOBAL TEMPORARY TABLE temp_1( GALOTIDX Number(9, 0), LOTID VARCHAR2(12 BYTE), LOTDESCR VARCHAR2(40 BYTE))"

INSERT INTO Строка запроса

StrQuery2 = "Insert INTO temp_1 (GALOTIDX, LOTID, LOTDESCR)"
StrQuery2 = StrQuery2 + " Select LotIdx, ID1, Descr1 From DataTable1"

Запрос дляОкончательный выбор

StrQuery3 = "Select * From temp_1"

Запрос на удаление временной таблицы

StrQuery4 = "DROP TABLE temp_1"

Создание строки подключения

ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=XXX)(Port=XXX))(CONNECT_DATA=(SERVICE_NAME=XXX)));User ID=XXX;Password=XXX"

Открытие подключения к базе данных, а также установка таймера тайм-аута

cnn.Open ConnectionString
cnn.CommandTimeout = 60

Создает временную таблицу

cnn.Execute StrQuery

Выполняет вставку в запрос

Dim recordsAffected As Integer

cnn.BeginTrans
cnn.Execute StrQuery2, recordsAffected
cnn.CommitTrans

Выбирает данные из временной таблицы и создает дамп в листе

rst.Open StrQuery3, cnn
ws1.Range("A2").CopyFromRecordset rst

Таблица временных падений

cnn.Execute StrQuery4

Строка подключения пустой тары

ConnectionString = ""
cnn.Close

1 Ответ

0 голосов
/ 26 марта 2019

Похоже, что commit может удалять ваши строки.

From: https://docs.oracle.com/javadb/10.8.3.0/ref/rrefdeclaretemptable.html

ON COMMIT Указывает действие, выполняемое с глобальной временной таблицей при выполнении операции COMMIT.

УДАЛИТЬ СТРОКИ Все строки таблицы будут удалены, если на столе не будет удерживаемого курсора. Это значение по умолчанию для ON COMMIT .Если вы укажете ON ROLLBACK DELETE ROWS, это приведет к удалению всех строк в таблице, только если использовалась временная таблица.ON COMMIT DELETE ROWS удалит строки в таблице, даже если таблица не использовалась (если в таблице нет открытых удерживаемых курсоров).

PRESERVE ROWS Строки таблицы будут сохранены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...