1

私は最近、多くのレガシーplsqlコードを使用しています。コード全体に以下のようなデバッグステートメントが表示されます。デバッグモードがオフの場合のプロシージャ呼び出しのオーバーヘッドを回避するために、「if」チェックが追加されました。

IF (Debug mode is on) THEN
  Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING);
END IF;

デバッグステートメントを1行で書く方法はありますか?Cには、手続き上のオーバーヘッドを回避するのに役立つマクロがあります。plsqlコードで同様のことを行うことはできますか?

編集:

私の質問がいくつかを混乱させたかもしれないので、もう少し詳細を追加します。私が避けようとしているのは、1つのデバッグステートメントを出力するために3行を書き込むことです。マクロを使用してデバッグステートメントを1行で記述できますか?私がこれをやろうとしている理由。そのようなステートメントがいたるところに追加されると、混乱が生じ、読みやすさが低下します。1行であるはずだったのに、デバッグステートメントごとに3行が表示されます。

2番目の編集:

以下に私の答えを追加しました。

4

2 に答える 2

3

使用している Oracle のバージョンによっては、PL/SQL で条件付きコンパイルを使用できます。何かのようなもの

$IF $$debug_mode
$THEN
  Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING);
$END

$debug_modeセッションの設定で設定されている場所PLSQL_CCFLAGSまたは

$IF package_name.debug_mode = 1
$THEN
  Debug_pkg.logmsg(l_module_name,'Unexpected error : '|| SQLERRM, FND_LOG.LEVEL_WARNING);
$END

wherepackage_name.debug_modeは、コードをデバッグ モードでコンパイルする必要があるかどうかを示すパッケージ レベルの変数です。

繰り返しますが、使用している Oracle のバージョンによっては、デバッグ モード チェックを入れてdebug_pkg.logmsg、コンパイラに依存して、呼び出しをインライン化することが有益であると自動的に判断する (プロシージャ呼び出しのオーバーヘッドを排除する) ことができる場合があります。INLINEプラグマを使用して呼び出しをインライン化するようにコンパイラに指示します。PL/SQLでのインライン化について詳しく説明している記事を次に示します。

于 2013-02-26T21:56:05.670 に答える
0

Justin Caveのリンクhttp://www.oracle-developer.net/display.php?id=502に感謝します。とりあえずこれにしましたが、

  PROCEDURE debug_msg(txt VARCHAR2) 
  IS 
  BEGIN  
      IF (debug mode is on) THEN
        debug_pkg.logmsg('Module', txt , LEVEL_WARNING);
      END IF;
  END;

上記の手順をインライン化するには、これを行う必要があります。

PRAGMA INLINE(debug_msg, 'YES');     

ただし、インラインはコンパイラへの単なる要求であり、インライン化される場合とされない場合があります。また、インライン化されるプロシージャは、同じパッケージで定義する必要があります。

于 2013-02-27T19:12:46.973 に答える