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

値をループし、動的クエリを作成し、結果セットに追加します

    パイプライン化されたテーブル関数は、特にデータの取得だけを行っている場合は、必要なものに適しているようです。 http://www.oracle-base.com/を参照してください。 articles / misc / pipelined-table-functions.php

    あなたがすることはあなたの出力行のためのタイプを作成することです。したがって、あなたの場合、

    のようなオブジェクトを作成します。
    CREATE TYPE get_data_faster_row AS OBJECT(
        seq    NUMBER(15,2),
        value  VARCHAR2(10),
        item   VARCHAR2(10)
    );
    

    次に、上記の行タイプで構成されるテーブルであるテーブルタイプを作成します

    CREATE TYPE get_data_faster_data IS TABLE OF get_data_faster_row;
    

    次に、パイプライン方式でデータを返すテーブル関数を作成します。 Oracleでのパイプライン化は、.netでのyield returnに少し似ています(これに精通しているかどうかはわかりません)。必要なすべての行を見つけて、ループ内で一度に1つずつ「パイプ」します。関数が完了すると、返されるテーブルは、パイプアウトしたすべての行で構成されます。

    CREATE FUNCTION Get_Data_Faster(params) RETURN get_data_faster_data PIPELINED AS
    BEGIN
        -- Iterate through your parameters 
            --Iterate through the results of the select using
            -- the current parameters. You'll probably need a 
            -- cursor for this
            PIPE ROW(get_data_faster_row(seq, value, item));
            LOOP;
        LOOP;
    END;
    

    編集:以下のアレックスのコメントに続いて、あなたはこのようなものが必要です。私はこれをテストすることができませんでしたが、それはあなたが始めるはずです:

    CREATE FUNCTION Get_Data_Faster(in_seq_numbers IN seq_numbers_array, in_values IN text_array, in_items IN text_array, list IN VARCHAR2) RETURN get_data_faster_data PIPELINED AS
        TYPE r_cursor IS REF CURSOR;
        query_results r_cursor;
        results_out get_data_faster_row := get_data_faster_row(NULL, NULL, NULL);
    
        query_str VARCHAR2(4000);
    
        seq_number NUMBER;
        the_value VARCHAR2(10);
        the_item VARCHAR2(10);
    
    BEGIN
        FOR i IN 1..in_seq_number.COUNT
        LOOP
            seq_number := in_seq_numbers(i);
            the_value := trim(in_values(i));
            the_item := trim(in_items(i));
    
            query_str := 'SELECT distinct '||seq_number||' as seq, value, item
            FROM my_table ai';                    
    
            query_str := query_str || '
            WHERE ai.value = '''||the_value||''' AND ai.item = '''||the_item||'''
            AND ai.param = ''BOOK''
            AND ai.prod in (' || list || ');
    
            OPEN query_results FOR query_str;
    
            LOOP
                FETCH query_results INTO 
                    results_out.seq,
                    results_out.value,
                    results_out.item;
                EXIT WHEN query_results%NOTFOUND;
                PIPE ROW(results_out);
            END LOOP;
    
        CLOSE query_results;
    
        END LOOP;
    
    END;
    

    以下のアレックスのコメントからの追加情報は、答えに役立ちます:




    1. インデックスを使用不可にしてからインデックスに再構築する方法

    2. SQL構文のエラー..「キー」の近く

    3. PHPを使用してmysql値をJSONファイルにダンプします

    4. LEFTOUTERJOINを使用してMySQLクエリを最適化しようとしています