我一直在阅读关于SO的一些问题,这些问题涉及如何使用批处理脚本(例如this one)查询Oracle数据库。
此命令似乎可以很好地获得单个查询的结果:
<query>; | sqlplus <username>/<password>@<database>
但是我可以这样修改吗:
与数据库的连接和查询是单独的命令
我可以循环使用此命令。 (此命令似乎无法在循环中很好地工作。我不断收到一个错误,提示无法识别|
字符。)
关于我要完成的工作的一些背景信息:
我有一个文本文件,其中包含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 ...
)
)