1

BAT ファイルで SQLPlus コマンドを実行し、その結果に基づいて CMD コマンドを実行し、次に別の SQLPlus コマンドを実行することはできますか?

こんな感じになると思います

CheckRowCount.SQL ファイル

SELECT COUNT(*) FROM dmsn.ds3r_1xrtt_voice_trigger

バットファイル:

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を初めて使用します

4

2 に答える 2

2

Powershell や Python を学んでください。私はプロセスを自動化するためにクレイジーなバッチ ファイルを作成していましたが、それは苦痛でした。

Powershell は、特にサブスレッドを作成および監視する機能を備えているため、このような条件付きスクリプトを作成するのにはるかに優れています。Pythonはこれにも最適です。

これらがもたらす大きな利点は、データベースにアクセスできることです (そして、スクリプト内で結果を返し、データを処理して反応させることができます。

欠点 (?) は、これらの言語のいずれかを習得する必要があることですが、バッチ ファイルよりもはるかに優れているため、個人的にはこれらを欠点とはまったく考えていません。

それ以外の場合は、フォクシドライブの答えがうまくいくはずです。


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
        }   
    }       
于 2013-04-19T15:42:37.250 に答える
0

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
于 2013-04-19T14:24:40.643 に答える