bat 文件运行 sqlplus 然后根据结果执行命令?

Posted

技术标签:

【中文标题】bat 文件运行 sqlplus 然后根据结果执行命令?【英文标题】:bat file to run sqlplus and then execute command based on result? 【发布时间】:2013-04-19 14:12:12 【问题描述】:

我能否让一个 BAT 文件运行 SQLPlus 命令,然后根据结果执行 CMD 命令,然后再执行另一个 SQLPlus 命令?

我认为它看起来像这样

CheckRowCount.SQL 文件

SELECT COUNT(*) FROM dmsn.ds3r_1xrtt_voice_trigger

BAT 文件:

sqlplus %USER%/%PASSWORD%@ORACLE @CheckRowCount.SQL
if ROWCOUNT < 1 goto :EX
c:\Autobatch\Spotfire.Dxp.Automation.ClientJobSender.exe http://SERVER/spotfireautomation/JobExecutor.asmx c:\AutoBatch\backup\Trigger_Test.xml
:EX

但我认为这并不完全正确,ROWCOUNT 似乎不起作用,而且,我将如何在 CMD 之后执行另一个 SQLPlus 命令。

我对 BAT 文件和 SQLPlus 非常陌生

【问题讨论】:

我只知道批处理,所以我不能告诉你太多,但第二行应该更像if %ROWCOUNT% LSS 1 goto EX(前提是你设法在变量中获取行数) .批量中&lt;有特殊含义,所以必须使用LSS;另外goto后面不要加冒号,标签就够了。 【参考方案1】:

帮自己一个忙,学习 Powershell 或 python。我曾经构建疯狂的批处理文件来自动化流程,这很痛苦。

Powershell 在构建此类条件脚本方面要好得多,尤其是能够创建和监控子线程。 Python 在这方面也很棒。

这些带来的最大优势是您可以访问数据库(以及脚本中的返回结果以处理和响应数据。

缺点(?)是您需要学习其中一种语言,但我个人并不认为这些是缺点,因为它们比批处理文件要好得多。

否则,foxidrive 的答案应该适合你。


Powershell 示例(有点长,但代码可以重复使用):

function CreateConnection 

    param([string]$databaseHost 
      ,[string]$Port
      ,[string]$SID
      ,[string]$UserID
      ,[string]$Password
     )      
    process
       
    $ConnectString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=0)(PORT=1))(CONNECT_DATA=(SID=2)));User Id=3;Password=4;"`
    -f $databaseHost,$port,$SID,$UserID,$Password
    write-host $connectString
    sleep 10
    $connection = new-object system.data.oracleclient.oracleconnection( $ConnectString)             
    return $connection
    
   

$DBMSHost="somehost.somedomain.com"
$DBMSPort=1521
$SID="somesid"
$UserName="user"
$Password="password"

[System.Reflection.Assembly]::LoadWithPartialName('System.Data.OracleClient') | out-null

try 
        $Connection = CreateConnection $DBMSHost $DBMSPort $SID $UserName $Password
     
catch
    
        write-host ("Could not access Oracle database 0"  -f $_.Exception.ToString())
        exit
                   

    $Query = "SELECT COUNT(*) as rowcount FROM dmsn.ds3r_1xrtt_voice_trigger"      // Added name to column to make life easier

    $data_set = new-object system.data.dataset
$adapter = new-object system.data.oracleclient.oracledataadapter ($Query, $Connection)
    [void] $adapter.Fill($data_set)
    $table = new-object system.data.datatable
    $table = $data_set.Tables[0]    // We now have the actual resukts data

    foreach ($row in $table)
    
        if ($row.rowcount <1 )
        
            $Application = "C:\Autobatch\Spotfire.Dxp.Automation.ClientJobSender.exe"
            $Arguments  = "http://SERVER/spotfireautomation/JobExecutor.asmx c:\AutoBatch\backup\Trigger_Test.xml"
            $CommandLine = "0 1" -f $Application,$Arguments
            invoke-expression $CommandLine
           
           

【讨论】:

你能安排 powershell 脚本吗?我之所以选择 bat 文件路径是因为我想通过 Windows 任务调度程序安排它每小时运行一次。 好的......所以在几周不理解这个答案之后,终于努力学习 powershell 的基础......这是我见过的最好的解决方案【参考方案2】:

假设 sqlplus 命令返回一个简单的数字,那么这可能有效:

@echo off
for /f "delims=" %%a in ('sqlplus %USER%/%PASSWORD%@ORACLE @CheckRowCount.SQL') do set rowcount=%%a
echo.rowcount is set to "%ROWCOUNT%"
if %ROWCOUNT% GTR 0 (
c:\Autobatch\Spotfire.Dxp.Automation.ClientJobSender.exe http://SERVER/spotfireautomation/JobExecutor.asmx c:\AutoBatch\backup\Trigger_Test.xml
)
pause

【讨论】:

%ROWCOUNT% 是否正确?还是应该是 %CheckRowCount.SQL%?它怎么知道 %ROWCOUNT% 是什么? 好的...所以我将上面的内容保存为 .bat 和 .cmd 文件,运行它们,但我只看到一个空白的 CMD 控制台,似乎什么也没发生。奇怪的是我可以在它打开的 CMD 控制台中输入。 如果我取出@echo 行,CMD 窗口会在我启动脚本时显示:C:\AutoBatch\backup\bat triggers\>for /F "delims=" %a in 设置 rowcount=%a 抱歉没有早点回复。 %rowcount% 设置为 SQLplus 命令的输出,您已显示为 0 或正整数。当它不为零时,将启动下一行。我已经在代码中添加了一些调试,所以你可以尝试一下,看看是否出现任何错误消息。 @foxdrive 不得不稍微远离这一点。仍在尝试让它工作..我运行了这个........for /f "delims=" %%a in ('sqlplus user/pass@P1 @BLOCK.SQL') do set rowcount=%如果 %ROWCOUNT% GTR 0 (ECHO YES) 暂停,则 %a echo.rowcount 设置为“%ROWCOUNT%”......但是此时出现了意外错误

以上是关于bat 文件运行 sqlplus 然后根据结果执行命令?的主要内容,如果未能解决你的问题,请参考以下文章

获取 sqlplus 的结果并放入脚本 .bat 上的变量中

通过 .bat 执行 Sqlplus 总是返回 0

bat执行sqlplus语句,省去@xx.sql过程

怎么用批处理*.bat 执行文件目录下面的SQL语句脚本(批量的)

SQLPLUS BAT 文件

在.bat脚本中如何将一个命令的返回结果传给一个变量?