1

ストアドプロシージャを呼び出すためにOCIを使用してC++プログラムを作成しています。PL / SQLストアド・プロシージャのテストで、アウトバウンド変数を初期化しないと、barがNULLの場合、 「フェッチされた列の値がNULLです」というエラーが発生する可能性があります。foo != 0したがって、最初の行では、最初にバーを初期化します。これはアウトバウンド変数を処理する正しい方法ですか?

  FUNCTION function1(
    foo   IN  INTEGER,
    bar   OUT VARCHAR2
  ) RETURN INTEGER
  IS
    ret      INTEGER;
  BEGIN

    bar := ' '; -- do I need to initialize this variable?

    IF foo = 0 THEN
      ret := 0;
      bar := 'a';
    ELSE
      ret := 1;
    END IF;

    RETURN ret;

  END function1;
4

1 に答える 1

1

プログラムでBARを設定しない場合、変数はそのタイプのデフォルト値に初期化されます(この場合、NULL以外のデフォルト値を持つレコードタイプを除くすべてのタイプ)。これは基本的なロジックです。

したがって、選択肢は次のとおりです。

  1. 変数のタイプのデフォルト値を受け入れます。
  2. IFステートメントの各ブランチでBARを適切な値に設定します。

投稿されたコードは最初のオプションを使用します。あなたが提示する単純な論理では、それが私がとるアプローチです。内部がより複雑な場合(多くのブランチを持つIFまたはCASE)、コードの意図がより明確になる可能性があるため、すべてのブランチに明示的に値を設定させることを選択します。

于 2012-08-17T12:49:40.503 に答える