Posted by & filed under ORACLE.

リンク: OTN Japan – 掲示板.

>エラーが発生するときに、PL/SQLで戻る値をセットしましたが、起動バッチ
>(例えばA.BAT)に渡す方法を教えてもらいませんか?ちなみにSQL*PLUSを
>使って、PL/SQLを実行します。(別の方法がありますか?)
>よろしくお願いします。

こんばんは。
ちょうど似たような要件があったので、SCOTT.EMPを使って簡単なサンプルを作っ
てみました。
PL/SQLプロシジャからの戻り値をコマンドプロンプトで取得する方法です。
ご参考になれば幸いです。

<概略>
 1.SQLスクリプトにバインド変数を定義し、その変数プロシジャの戻り値として
実行します。

 2.プロシジャでは、戻り値に値をセットします。

 3.SQLスクリプトでは、プロシジャからの戻り値(バインド変数)をリターン・
コードとして
   OSに戻します。

 4.DOS(OS)では、ERRORLEVELでリターン・コードを取得します。

以下にサンプルを記述します。(Windows2003ServerSP1:Oracle10gSE
(10.1.0.4)にて動作確認)
※入力値チェックなどはしていません(^^;;)

●EMPsample.bat  <—— 起動するバッチファイル
:RUNSTART
SQLPLUS SCOTT/TIGER@xxxx @D:sampleempcount.sql
if %ERRORLEVEL% == 999999 goto RUNEND
echo ************************************
echo **  %ERRORLEVEL% 人在籍しています
echo ** (↑ がプロシジャでセットした戻り値です)
echo ************************************
echo off
pause
:RUNEND
rem exit 0

●EMPCOUNT.sql   <——  プロシジャを起動するSQLファイル

SET HEADING OFF
SET ECHO OFF
SET TERMOUT ON
SET SERVEROUTPUT ON
var intPara number
ACCEPT DEPTNO PROMPT “EMP表を参照します。部署コードを入力して下さい
(999999で終了): “
EXEC PRO_EMPCOUNT( &DEPTNO,:intPara ) ;
SET ECHO OFF
SET TERMOUT ON
SET SERVEROUTPUT ON
EXIT :intPara

●EMPCOUNTPRO.sql  <——  プロシジャ作成用SQLファイル

CREATE OR REPLACE PROCEDURE 
 SCOTT.PRO_EMPCOUNT( 
	intDEPTNO		 IN INTEGER DEFAULT 99, 
	intPara			 OUT INTEGER
) 
IS
	TYPE CUTYPE IS REF CURSOR;
	C1 CUTYPE;
	REC VARCHAR2(1000);
	TYPE RECORDSET IS RECORD(COUNT01 INTEGER);
	C1_REC RECORDSET;
	strSql VARCHAR(32767) DEFAULT NULL;
	intError	INTEGER ;
BEGIN
	IF  intDEPTNO = 999999  THEN
		intPara := intDEPTNO;
		RETURN;
	END IF;
	intError := 0;
	intPara := 0;
	strSql := strSql||’SELECT COUNT(ROWID) FROM SCOTT.EMP WHERE 
EMP.DEPTNO = ‘||intDEPTNO;
	OPEN C1 FOR strSql;
	FETCH C1 INTO C1_REC;
	IF C1%NOTFOUND THEN
		/* 抽出データ無し */
		intError := 999;
		GOTO PROC_END;
	ELSE
		intPara := C1_REC.COUNT01;
	END IF;
<<PROC_END>>
        CLOSE C1;
	RETURN;
EXCEPTION
	WHEN OTHERS THEN
		intError := SQLCODE;
END;
/

Comments are closed.