sql >> データベース >  >> RDS >> Oracle

デフォルト値で引数のリストを取得する

    以下のコードサンプルのように、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;
    


    1. CSVファイルの値でOracleテーブルを更新します

    2. 会計年度に基づく日付分割

    3. Postgres UNIQUE制約はインデックスを意味しますか?

    4. MySQLビューは通常のクエリよりも高速ですか?