首页 > 解决方案 > 批处理文件 - 在 For 循环中调用动态 Oracle 查询

问题描述

我一直在阅读一些关于如何使用批处理脚本查询 Oracle 数据库的问题,例如这个

此命令似乎可以很好地获取单个查询的结果:

<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 ...
   )
)

标签: oraclebatch-filesqlplus

解决方案


推荐阅读