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

PL/SQLストアドプロシージャでコンマ区切りの文字列を分割する

    これはあなたが探していることをするはずです..それはあなたのリストが常にただの数字であると仮定します。そうでない場合は、DBMS_SQL.NUMBER_TABLEへの参照を、すべてのデータで機能するテーブルタイプに変更するだけです。

    CREATE OR REPLACE PROCEDURE insert_from_lists(
        list1_in IN VARCHAR2,
        list2_in IN VARCHAR2,
        delimiter_in IN VARCHAR2 := ','
    )
    IS 
        v_tbl1 DBMS_SQL.NUMBER_TABLE;
        v_tbl2 DBMS_SQL.NUMBER_TABLE;
    
        FUNCTION list_to_tbl
        (
            list_in IN VARCHAR2
        )
        RETURN DBMS_SQL.NUMBER_TABLE
        IS
            v_retval DBMS_SQL.NUMBER_TABLE;
        BEGIN
    
            IF list_in is not null
            THEN
                /*
                || Use lengths loop through the list the correct amount of times,
                || and substr to get only the correct item for that row
                */
                FOR i in 1 .. length(list_in)-length(replace(list_in,delimiter_in,''))+1
                LOOP
                    /*
                    || Set the row = next item in the list
                    */
                    v_retval(i) := 
                            substr (
                                delimiter_in||list_in||delimiter_in,
                                instr(delimiter_in||list_in||delimiter_in, delimiter_in, 1, i  ) + 1,
                                instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i+1) - instr (delimiter_in||list_in||delimiter_in, delimiter_in, 1, i) -1
                            );
                END LOOP;
            END IF;
    
            RETURN v_retval;
    
        END list_to_tbl;
    BEGIN 
       -- Put lists into collections
       v_tbl1 := list_to_tbl(list1_in);
       v_tbl2 := list_to_tbl(list2_in);
    
       IF v_tbl1.COUNT <> v_tbl2.COUNT
       THEN
          raise_application_error(num => -20001, msg => 'Length of lists do not match');
       END IF;
    
       -- Bulk insert from collections
       FORALL i IN INDICES OF v_tbl1
          insert into tmp (a, b)
          values (v_tbl1(i), v_tbl2(i));
    
    END insert_from_lists; 
    


    1. PostgreSQL用のAmazonRDSおよびAuroraオファリングの概要

    2. OracleクエリでXMLTypeノードを連結します

    3. SQLServerでビューを暗号化する方法

    4. jQuery UIソート可能、次にデータベースに順序を書き込む