4

Oracle 10g で ALL_ARGUMENTS を使用して引数のリストを取得しましたが、引数のデフォルト値がわかりません。どうすればできますか?

4

3 に答える 3

0

以下のコードサンプルのように、10gのplsqlプログラミングに頼る必要があるかもしれません。基本的に、非常に低レベルのプリミティブを使用して関数/プロシージャ宣言パーサーの一部を作成するため、このソリューションはある意味でブルートフォースです。ただし、正規表現関数は10gでも使用できません...

コードの要点は次のとおりです。

  • プロシージャ/関数宣言のソースコード行を繰り返し処理します
  • 最近宣言されたルーチンの名前に注意してください
  • キーワード「DEFAULT」を含むすべての行を分析し、引数名とデフォルト値の仕様を取得します(これはコードサンプルでは詳しく説明されていません)。

落とし穴に注意してください:

  • 複数行の宣言
  • Cスタイルのコメント開始文字列を含むCスタイルのコメント(a la / * blah blah /何とか何とか**/)
  • キーワードを含む文字列リテラル

とにかく、それがお役に立てば幸いです。よろしくお願いします。

コード:

DECLARE
   l_arg_and_more    VARCHAR2(400);
   l_current_unit    VARCHAR2(400);
   l_default_spec    VARCHAR2(400);
   l_offset_default  BINARY_INTEGER;
   l_offset_eoname   BINARY_INTEGER;
BEGIN
   FOR i IN (
        select text
         from all_source
        where owner = '<name of owner>'
          and name = '<object name>'
          and type in ( 'PACKAGE', 'PROCEDURE', 'FUNCTION')
          and text not like '--%'
     order by line
   ) LOOP
      IF i.text LIKE '%FUNCTION%' OR i.text LIKE '%PROCEDURE%' THEN
         IF i.text LIKE '%FUNCTION%' THEN
            l_current_unit    := LTRIM(SUBSTR(i.text, INSTR(i.text, 'FUNCTION') + LENGTH('FUNCTION')), ' ');
            l_offset_eoname   := INSTR(l_current_unit, ' ');              
            IF l_offset_eoname = 0 OR l_offset_eoname > INSTR(l_current_unit, '(') THEN
               l_offset_eoname   := INSTR(l_current_unit, '(');
            END IF;
            IF l_offset_eoname <> 0 THEN
               l_current_unit := SUBSTR(l_current_unit, 1, l_offset_eoname-1);
            ELSE
               l_current_unit := 'unidentified';
            END IF;
         END IF;
      END IF;
      --
      IF i.text LIKE '%DEFAULT%' THEN
         l_offset_default  := INSTR (i.text, 'DEFAULT');
         l_arg_and_more    := SUBSTR(i.text, 1, l_offset_default - 1);
         l_default_spec    := SUBSTR(i.text, l_offset_default + LENGTH('DEFAULT') + 1);
         --
         -- process l_arg_and_more to get the arg name, l_default_spec for the default value
         --
      END IF;
   END LOOP;              
END;
于 2013-01-15T18:21:30.843 に答える
0

ビューSYS.ALL_ARGUMENTSには という名前の列がありますがDEFAULT_VALUE、11g でもその型はLONGであり、回避して CLOB に変換するのは頭痛の種です。

「最も簡単な」(最善ではない) 方法は、このビューからテーブルを作成し、 を使用TO_LOBしてこのフィールドを に変換し、それを操作CLOBすることです。

于 2015-07-01T14:26:56.827 に答える