Пакетный файл - вызов динамического запроса Oracle в цикле For - PullRequest
0 голосов
/ 31 октября 2018

Я читал несколько вопросов по SO о том, как запросить базу данных Oracle с помощью пакетного скрипта, например this .

Эта команда, кажется, работает хорошо, чтобы получить результат одного запроса:

<query>; | sqlplus <username>/<password>@<database>

Но могу ли я изменить это так:

  1. Соединение с базой данных и запрос - это отдельные команды

  2. Я могу использовать эту команду в цикле. (Похоже, что эта команда плохо работает в циклах. Я получаю сообщение об ошибке, что символ | не был распознан.)

Немного контекста о том, чего я пытаюсь достичь:

У меня есть текстовый файл, который содержит список имен таблиц и столбцов в моей базе данных Oracle, например, содержимое этого файла будет:

table1, columnA
table1, columnB
table2, columnC
table2, columnD

Я хочу запросить базу данных, чтобы просмотреть каждую пару таблиц / столбцов в этом файле и вернуть тип данных и точность данных.

Мне не нужна помощь с фактическим запросом. Это запрос, который дает нужные мне результаты:

SELECT DATA_TYPE,DATA_PRECISION FROM ALL_TAB_COLUMNS
   WHERE TABLE_NAME='<tableName>' AND COLUMN_NAME='<columnName>';

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

Что-то вроде этого, похоже, то, чего я хочу достичь, но это не работает должным образом. Смотрите ниже мой текущий пакетный скрипт.

REM Required for dynamic values in for loop
setlocal enabledelayedexpansion

REM For all of the lines in my input text file
for /f "tokens=1,2 delims=, " %%i in (inputFile.txt) do (

   REM Store column name and table name
   set tableName=%%i
   set columnName=%%j

   REM Perform query
   for /f "tokens=1,2 skip=2" %%k in ('SELECT DATA_TYPE,DATA_PRECISION FROM ALL_TAB_COLUMNS WHERE TABLE_NAME=''!tableName!'' AND COLUMN_NAME=''!columnName!''; | sqlplus <username>/<password>@<database>') do (

      REM Only care about first result, since it will only return one row
      set dataType=%%k
      set dataPrecision=%%l

      REM Process dataType and dataPrecision as necessary
      REM ...
   )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...