コーディングメモ

忘れっぽい自分に

【Oracle】PL/SQL ファンクションを実行してリターンコードを返すwindowsバッチファイル

@echo off

set ORACLEUSR=oracle-userid/oracle-pass@oraclesid
set fname=sqlfile-path

sqlplus %ORACLEUSR% @%fname%

echo %errorlevel%

pause
  • ファンクションを実行するSQLファイル
variable num number;
variable p_file  varchar2(300);

execute  :p_file  :=  'test.tmp';

execute  :num  :=  FUNCTION_NAME(:p_file);

exit :num

1. Windowsバッチファイルの説明

1. SQLファイルを指定してSQLPLUSの呼び出し

sqlplus.exeの引数として、接続文字列と実行するSQLファイルを指定できます。 sqlplus %ORACLEUSR% @%fname%として実行できます。

2. ファンクションを実行するsqlファイルの説明

1. 変数の定義

variable <変数名> <データ型>で変数を定義します。 variable num number;で、numという変数名でnumber型の変数を定義しています。 使用可能なデータ型はPL/SQLで使用可能なデータ型と同じです。

2. 変数へ値を代入

executeコマンドでPL/SQLを実行します。 execute :p_file := 'test.tmp';で、p_fileという変数に test.tmp という文字列を代入しています。

3. ファンクションを実行してリターンコードを取得する。

同じくexecuteコマンドを使用します。 execute :num := FUNCTION_NAME(:p_file);で、ファンクション「FUNCTION_NAME」のリターンコードを 変数 num にセットしています。

4. リターンコードをwindowsバッチファイルに返却

exitコマンドを使用します。 exit <リターンコード>で、指定したリターンコードがwindowsバッチファイルへ返却されます。 これを、windowsバッチファイル側の「%errorlevel%」環境変数で取得します。

【Oracle】PLS-00328: サブプログラム本体が、xxxxxxxxxxの前方宣言に対して定義されなければなりません。

  • サブプログラム仕様部の記載はあるが、本体が定義されていない。
  • サブプログラム仕様部の記載が重複している。
  • サブプログラム仕様部の定義と、本体の定義が合っているか確認(名前、引数、返り値)。
  • サブプログラム仕様部の記載が異なるものが複数定義されていないか確認(名前、引数、返り値)。

【Oracle】PLS-00323:パッケージ仕様部で未定義のサブプログラムまたはカーソルxxxxxが宣言されています。

  • 仕様部(package)と本体(body)でサブプログラムの定義が異なる場合に発生する。
  • 例えば、仕様部と本体でサブプログラム名称は同じでも、引数が異なる場合など。

【Oracle】PLS-00306: xxxxxxxxxxの呼出しで、引数の数または型が正しくありません。

  • 呼び出し側に記載している引数の数や型が、サブプログラム本体に定義している引数の数や型が一致していない。
  • サブプログラムの呼び出し側と定義側で、引数の数や型が合っているか確認。

【Oracle】PLS-00221: 'xxxxxx' がプロシージャではないか、または未定義です。

  • プロシージャがそもそも定義されていない。名前が間違っている。
  • 戻り値を返すファンクションの場合、呼び出し側に定義されていない。
    FUNCTION P_FUNCTION(
         P_PRM1        CHAR(4)
    ) RETURN NUMBER;

の場合、

declare
   N  NUMBER;
begin
    N := P_FUNCTION('PRM1');
end;
/

このように、ファンクションの戻り値をNのように取得しないと、このエラーが発生する。

【Oracle】ORA-06503: ファンクションが値なしで戻されました

  • 返り値が設定されているファンクションで、return文が実行されていない。
  • RETURN文が存在しているかどうか、条件分岐によりRETURN文が実行されないケースが無いか確認。
  • 思ったより後続処理でエラー発生している可能性もある。

【Oracle】ORA-06502: 数値または値のエラー: 数値の精度が大きすぎます。が発生しました

  • 定義した数値の精度よりも大きな数値を入力しようとした。
  • 整数の桁数オーバーだけでなく、小数部桁数の精度も確認する。
  • ループを回して加算処理とかしている場合、ループの回りすぎで精度が超えていないか確認。
  • 想定していたよりも大きな値がきていないか?