返回 table 多个 select UNION 放入数组

Returning table fro multiple select UNION put in an array

我想使用来自 sql 脚本的过滤数据,并将其用于 运行 在使用过滤列表进行升级的数据库中进行升级。

1) 我有一个每天都在变化的 SQL 文件,它看起来像下面这样:

select 
'OBJECT1' object_name, 
'PACKAGE BODY' object_type, 
'999999' target_vers, 
(Select statement which finds current version),
Decode (decode which comperes target version and current version) status 
from DUAL union

select (相同的5列) .. ... ..

可以达到100+ selects

2) 我只想使用目标版本>当前版本的 table 个条目(有时目标版本可能是 <当前版本)

3)对象名对应.code目录,对应sql,view,pks所在目录。

4) 在过滤步骤之后,我想 运行 这些 sql 数据库服务器中的文件(看起来需要在循环中完成)。

5) 因为我是新手 cmd/batch 不知道该怎么做。

for /f  %%k in ('sqlplus -s %LOGIN%/%LOGIN%@%DBSERVER% @%SCRIPTPATH%\CHECK_CODE.sql') do (
set theValue=%%k
)      

上面的代码运行是上面提到的sql文件,

spool new.txt 
select ...... 
spool off 
/ 
exit 

这个returns下面的txt文件

OBJECT_NAME                 OBJECT_TYPE  TARGE                                  
--------------------------- ------------ -----                                  
INSTALLED_VERS                                                                  
--------------------------------------------------------------------------------
STATUS                                                                          
-------------------------                                                       
OBJECT_NAME              PACKAGE BODY 72021                                  
72021                                                                           
--- INSTALLED ---                                                               

现在我只想循环更新数据库所需的对象。

for /f  %%a in ('List of entries which need upgrade') 
do (
sqlplus -s %LOGIN%/%LOGIN%@%DBSERVER% @%%a.[object_name].[object extension]
)        

问题是如何从第一个 SQL 脚本中将过滤后的数据放入 CMD 中的数组中,然后将这些数据用于 运行 SQL 文件(它们是与 object_name)

相同

最后做了类似的事情:

DEL UPGRADE_LOG.TXT

set SCRIPTPATH=%CD%
set BAKNAME=LGH_670
set SCHEMAPATH=X:\HF\QA\Builds\Build Area\LGH\Linedata Global Hedge 6.7.0\QA1\LGH\Oracle_Objects
set LOGIN=LGH_670
set APPSERVER=LN1QAAPP11
set DBSERVER=LN1QADB11_FM.WORLD
set num=0

ECHO ********************************* Loging is starting before services being stopped *************************************** >> UPGRADE_LOG.TXT

ECHO *** Stopping services >> UPGRADE_LOG.TXT

NET STOP %LOGIN% >> UPGRADE_LOG.TXT

ECHO *** Checking V_MQ >> UPGRADE_LOG.TXT

for /f  %%k in ('sqlplus -s %LOGIN%/%LOGIN%@%DBSERVER% @%SCRIPTPATH%\help_scripts\MESSEGE_QUEUE.sql') do (set theValue=%%k)    

cat V_MQ.txt | sed 's/[[:space:]]//g' >> V_MQ_2.txt

find /c "norowsselected" V_MQ_2.txt
    if %errorlevel% equ 1 goto queufull
    goto queueempty
    :queueempty

del V_MQ_2.txt
del V_MQ.txt

for /f  %%k in ('sqlplus -s %LOGIN%/%LOGIN%@%DBSERVER% @%SCRIPTPATH%\help_scripts\USER_OBJECTS.sql') do (set theValue=%%k)


cat USER_OBJECTS.txt | sed 's/[[:space:]]//g' >> USER_OBJECTS_2.txt

find /c "norowsselected" USER_OBJECTS_2.txt
    if %errorlevel% equ 1 goto queufull
    goto validobjects
    :validobjects

del USER_OBJECTS_2.txt
del USER_OBJECTS.txt


ECHO ***Coppying data from "%SCHEMAPATH%" >> UPGRADE_LOG.TXT

xcopy /s "%SCHEMAPATH%\*.*" *.* /Y

ECHO *** Creating Upgrade scripts and cleaning up the folder >> UPGRADE_LOG.TXT

call %SCRIPTPATH%\replace_string.bat V_WHAT V_WHAT_BAK CHECK_CODE.sql

REM ################### Here CHECK_CODE would be checked ##############################

echo select Object_name, object_type from ( > CHECK_CODE.sql.new
type CHECK_CODE.sql >> CHECK_CODE.sql.new
type CHECK_CODE.sql.new > CHECK_CODE.sql

del CHECK_CODE.sql.new

echo spool CODE_CHECK.txt > CHECK_CODE.sql.new
type CHECK_CODE.sql >>CHECK_CODE.sql.new
type CHECK_CODE.sql.new > CHECK_CODE.sql

del CHECK_CODE.sql.new


echo set headsep off > CHECK_CODE.sql.new
type CHECK_CODE.sql >>CHECK_CODE.sql.new
type CHECK_CODE.sql.new > CHECK_CODE.sql

del CHECK_CODE.sql.new

echo set pagesize 0 > CHECK_CODE.sql.new
type CHECK_CODE.sql >>CHECK_CODE.sql.new
type CHECK_CODE.sql.new > CHECK_CODE.sql

del CHECK_CODE.sql.new


echo create table V_WHAT_BAK as select * from V_WHAT; > CHECK_CODE.sql.new
type CHECK_CODE.sql >>CHECK_CODE.sql.new
type CHECK_CODE.sql.new > CHECK_CODE.sql

del CHECK_CODE.sql.new

REM Adding last lines in the system

echo  ) where status='### NEEDS UPGRADE ###'; >> CHECK_CODE.sql
echo spool off >> CHECK_CODE.sql
echo DROP TABLE v_what_bak; >> CHECK_CODE.sql
echo / >> CHECK_CODE.sql
echo exit >> CHECK_CODE.sql

REM Here We need to run in the script for alternative check.

for /f  %%k in ('sqlplus -s %LOGIN%/%LOGIN%@%DBSERVER% @%SCRIPTPATH%\CHECK_CODE.sql') do (set theValue=%%k)