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

cfprocparamを使用してOracleに配列またはリストする

    PL / SQLは、Oracle8.0以降でアレイをサポートしています。以前はPL/SQLテーブルと呼ばれていたため、誰もが混乱していました。現在はコレクションと呼ばれています。 詳細

    問題は、それらがユーザー定義タイプ(つまりオブジェクト)として実装されていることです。 ColdFusionドキュメント を読んだ cfprocparamが 「プリミティブ」データ型(number、varchar2など)のみをサポートします。したがって、UDTはサポートされていません。

    これが何を意味するのかわかりません:

    カンマ区切りの値の文字列を渡したい場合は....

    "Fox in socks, Mr Knox, Sam-I-Am, The Lorax"
    

    その後、私はあなたのための回避策があります。 Oracleは、組み込みのTokenizerを提供していません。しかし、ずっと前に、John Spencerは、OTNフォーラムでOracle9iで機能する手動ソリューションを公開しました。 ここで見つけてください。

    編集

    絶望するな。 Johnが投稿してからOTNフォーラムは数回アップグレードされており、フォーマットによってコードが破損しているようです。以前は使用していなかったコンパイルエラーがいくつかありました。

    新しい関数を含めて、ジョンのコードを書き直しました。主な違いは、ネストされた表がPL/SQL型ではなくSQL型として宣言されていることです。

    create or replace type tok_tbl as table of varchar2(225) 
    /
    
    create or replace package parser is
    
        function my_parse(
              p_str_to_search in varchar2
                , p_delimiter in varchar2 default ',')
              return tok_tbl;
    
        procedure my_parse(
              p_str_to_search in varchar2
              , p_delimiter in varchar2 default ','
              , p_parsed_table out tok_tbl);
    
    end parser;
    /
    

    ご覧のとおり、この関数はプロシージャの単なるラッパーです。

    create or replace package body parser is
    
        procedure my_parse ( p_str_to_search in varchar2
                              , p_delimiter in varchar2 default ','
                              , p_parsed_table out tok_tbl)
        is
            l_token_count binary_integer := 0;
            l_token_tbl tok_tbl := tok_tbl();
            i pls_integer;
            l_start_pos integer := 1;
            l_end_pos integer :=1;   
        begin
    
            while l_end_pos != 0
            loop
                l_end_pos := instr(p_str_to_search,p_delimiter,l_start_pos);
    
                if l_end_pos  != 0 then
                    l_token_count := l_token_count + 1;
                    l_token_tbl.extend();
                    l_token_tbl(l_token_count ) :=
                        substr(p_str_to_search,l_start_pos,l_end_pos - l_start_pos);
                    l_start_pos := l_end_pos + 1;
                end if;
            end loop;
    
            l_token_tbl.extend();
            if l_token_count = 0 then /* we haven't parsed anything so */
                l_token_count := 1;
                l_token_tbl(l_token_count) := p_str_to_search;
            else /* we need to get the last token */
                l_token_count := l_token_count + 1;
                l_token_tbl(l_token_count) := substr(p_str_to_search,l_start_pos);
            end if;
            p_parsed_table := l_token_tbl;
        end my_parse;
    
        function my_parse ( p_str_to_search in varchar2
                                , p_delimiter in varchar2 default ',')
                              return tok_tbl
        is
            rv tok_tbl;
        begin
            my_parse(p_str_to_search, p_delimiter, rv);
            return rv;
        end my_parse;
    
    end parser;
    /
    

    SQLで型を宣言する利点は、次のようにFROM句で使用できることです。

    SQL> insert into t23
      2  select trim(column_value)
      3  from table(parser.my_parse('Fox in socks, Mr Knox, Sam-I-Am, The Lorax'))
      4  /
    
    4 rows created.
    
    SQL> select * from t23
      2  /
    
    TXT
    ------------------------------------------------------------------------------
    Fox in socks
    Mr Knox
    Sam-I-Am
    The Lorax
    
    SQL> 
    



    1. MySQL ORDER BY IN()

    2. SQLServer2005カスケード削除

    3. PHPMYSQLクエリアルゴリズムヘルプ

    4. Laravelの移行(errno:150外部キー制約が正しく形成されていません)