PL/SQLでリストをチャンクに分割する方法


  1. プロシージャを使用した方法: 以下のプロシージャは、指定されたサイズでリストをチャンクに分割する方法を示しています。
CREATE OR REPLACE PROCEDURE split_list_into_chunks(
    p_list IN SYS.ODCIVARCHAR2LIST,
    p_chunk_size IN NUMBER,
    p_result OUT SYS.ODCIVARCHAR2LIST
)
IS
BEGIN
    FOR i IN 1..CEIL(p_list.COUNT / p_chunk_size) LOOP
        p_result(i) := p_list((i - 1) * p_chunk_size + 1);
        FOR j IN 2..p_chunk_size LOOP
            EXIT WHEN ((i - 1) * p_chunk_size + j) > p_list.COUNT;
            p_result(i) := p_result(i) || ',' || p_list((i - 1) * p_chunk_size + j);
        END LOOP;
    END LOOP;
END;
/

このプロシージャを使用するには、入力として分割したいリスト(p_list)、チャンクのサイズ(p_chunk_size)、および結果を格納するためのリスト(p_result)を指定します。

  1. SQLクエリを使用した方法: 次のSQLクエリは、リストを指定されたサイズでチャンクに分割する方法を示しています。
WITH t AS (
    SELECT COLUMN_VALUE AS value,
           ROW_NUMBER() OVER (ORDER BY ROWNUM) AS rn
    FROM TABLE(SYS.ODCIVARCHAR2LIST('item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10')) -- リストをここに入力
)
SELECT LISTAGG(value, ',') WITHIN GROUP (ORDER BY rn) AS chunk
FROM (
    SELECT value, TRUNC((rn - 1) / 3) AS chunk_number
    FROM t
)
GROUP BY chunk_number;

このクエリでは、リストを直接入力していますが、実際の使用時には適切なリストを指定する必要があります。上記の例では、チャンクのサイズを3としています。