【bat】Oracleサービスとリスナー起動停止

Oracleサービスとリスナーをbatファイルで起動する。
起動順序としてはリスナー起動、サービス起動となる。
停止順序は逆順となる。

Oracleリスナー起動
@echo off
setlocal
REM Oracleリスナー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleリスナー起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE FslDBServer /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleリスナー起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleリスナー起動失敗>>%LOG_FILE%
exit

endlocal
Oracleサービス起動
@echo off
setlocal
REM Oracleサービスー起動
set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log
 
echo [ INFO ] %DATE% %TIME% Oracleサービス起動開始>>%LOG_FILE%
cd D:/Product/Ofs41_1\FailSafe\Client
FSCMD ONLINERESORCE IFSDB /CLUSTER=DBServer>>%LOG_FILE%

if NOT %ERRORLEVEL%==0 goto ERR_END

timeout /t 120 /nobreak

echo [ INFO ] %DATE% %TIME% Oracleサービス起動終了>>%LOG_FILE%
exit /b

:ERROR_END
echo [ ERROR ] %DATE% %TIME% Oracleサービス起動失敗>>%LOG_FILE%
exit

endlocal

【bat】サーバ再起動

batファイルでサーバを再起動させます。

@echo off
setlocal

set ROOT_DIR=D:/batch
set BIN_DIR=%ROOT_DIR%/bin
set LOG_FILE=%ROOT_DIR%log/%~n0.log

echo [ INFO ] %DATE% %TIME% サーバ再起動開始>>%LOG_FILE%
SHUTDOWN /r /f /c "batファイルによるリブート"
if NOT %ERRORLEVEL%==0 goto ERR_END
echo [ INFO ] %DATE% %TIME% サーバ再起動終了>>%LOG_FILE%
exit /b

:ERR_END
echo [ ERROR ] %DATE% %TIME% サーバ再起動失敗>>%LOG_FILE%
exit /b

endlocal

【bat】共有フォルダへの接続

共有フォルダへの接続をbatファイルで自動化する。
[bat]
@echo off
rem 接続解除
net use /delete \\server\dir$ /yes

rem 接続
net use /presistent:yes “\\server\dir” /user:testuser@testdom.local password
[/bat]

上記のbatファイルをタスクスケジューラでSYSTEMユーザ実行などで登録する。
起動するとSYSTEMユーザが「\\server\dir」に接続できるようになる。
net useの「/user」はあくまでも共有フォルダへ接続するための
ユーザIDとパスワードになる。

上記の例でいうと「testuser」が共有フォルダに接続できるようになるわけではない点に注意。
(元々、ログインするためのユーザなので勘違いしやすい)

【bat】サービス起動バッチ

サービスの状態を確認し、「STATE」になっている場合、
サービスを起動します。

前提
サービス名は「TES_SER」とします。

FOR /f "usebackq tokens=1,2,3,4,5 delims=: " %%A IN (`sc query "TES_SER" ^| findstr -i "STATE"`) DO if "%%A"=="STATE" if "%%C"=="STOPPED" sc start TES_SER TES_SERの起動引数(任意)

【PowerShell】ファイルサイズが大きいファイルの分割

ファイルサイズが2GBを超えるファイルは開けないため、ファイルを分割します。
Linuxではsplitがありますが、windowsでは存在しないコマンドのため、
他の方法でファイルを分割します。

前提
ファイルが「C:/log/test.log」にあるとし、
このファイルを10万行ごとのファイルに分割する。

cd C:/log
$i=0; cat ./test.log -ReadCount 100000 | % {$_ > test$i.log; $i++;

【Oracle】PLSQLでBLOBデータを出力

PLSQLでBLOBデータを出力します。

CREATE OR REPLACE PROCEDURE testBlobOut (kanriNo IN VARHCAR) AS
CURSOR C_CONTROL IS
  SELECT
    TB1.IMAGE_NAME, 
    TB1.IMAGE
  FROM
    SAMPLE TB1
  WHERE
    TB1.KANRI_NO = kanriNo;

v_blob_locater BLOB;
v_offset INTEGER := 1;
v_buffer LONG RAW;
v_file_buffer_size INTEGER := 32000;
v_amount INTEGER := 32000;
v_totalsize INTEGER;
v_filetype UTL_FILE.FILE_TYPE;
v_filename VARCHAR2(1000) := '';
v_openmode VARHCAR2(2) := 'wb';
v_dir VARCHAR2(1000) := 'C/temp';

BEGIN
  OPEN C_CONTROL;
  LOOP
    FETCH C_CONTROL INTO v_blob_locater, v_filename;
    EXIT WHEN C_CONTROL%NOTFOUND;
    DBMS_OUTPUT.PUTLINE('fileName:' || v_filename);
    v_totalsize := DBMS_LOB.GETLENGTH(v_blob_locater);
    v_filetype := UTL_FILE.FOPEN(
      v_dir,
      v_filename,
      v_openmode,
      v_file_buffer_size
    );
    while v_offset < v_totalsize loop
      if v_offset + v_amount > v_totalsize then
        v_amount := v_totalsize - v_offset + 1;
      end if;
      DBMS_LOB.READ(
        v_blob_locater,
        v_amount,
        v_offset,
        v_buffer
      );
      UTL_FILE.PUT_RAW(
        v_filetype,
        v_buffer,
        true
      );
      v_offset := v_offset + v_amount;
      DBMS_OUTPUT.PUT_LINE('Offset :' || v_offset);
    end loop;
    UTL_FILE.FFLUSH(v_filetype);
    UTL_FILE.FCLOSE(v_filetype);

    DBMS_OUTPUT.PUT_LINE('fileSize :' || v_totalsize);
  END LOOP;
  CLOSE C_CONTROL;
EXCEPTION WHEN OTHERS THEN
  UTL_FILE.FCLOSE_ALL;
  RAISE;
END;
/

PLSQLの実行方法

set serveroutput ON
execute testBlobOut('000010');