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

「xx.yy」の近くのコンマ区切りリストをdbms_utility.comma_to_tableで無効にしています

    を参照してくださいカンマ区切りの文字列を行に分割する方法

    1。 REGEXP_SUBSTRアプローチ

    SQL> WITH DATA AS(
      2  SELECT 'ac_Abc.88,ac_Abc.99,ac_Abc.77' str FROM dual)
      3  SELECT regexp_substr(str,'[^,]+',1,level) str
      4  FROM DATA
      5    CONNECT BY regexp_substr(str, '[^,]+', 1, level) IS NOT NULL
      6  /
    
    STR
    -----------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    
    SQL>
    

    2。 XMLアプローチ

    SQL> SELECT EXTRACT (VALUE (d), '//row/text()').getstringval () str
      2  FROM
      3    (SELECT XMLTYPE ( '<rows><row>'
      4      || REPLACE ('ac_Abc.88,ac_Abc.99,ac_Abc.77', ',', '</row><row>')
      5      || '</row></rows>' ) AS xmlval
      6    FROM DUAL
      7    ) x,
      8    TABLE (XMLSEQUENCE (EXTRACT (x.xmlval, '/rows/row'))) d
      9  /
    
    STR
    --------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    

    3。テーブル機能

    SQL> CREATE TYPE test_type
      2  AS
      3    TABLE OF VARCHAR2(100)
      4  /
    
    Type created.
    
    SQL>
    SQL> CREATE OR REPLACE
      2  FUNCTION comma_to_table(
      3      p_list IN VARCHAR2)
      4    RETURN test_type
      5  AS
      6    l_string VARCHAR2(32767) := p_list || ',';
      7    l_comma_index PLS_INTEGER;
      8    l_index PLS_INTEGER := 1;
      9    l_tab test_type     := test_type();
     10  BEGIN
     11    LOOP
     12      l_comma_index := INSTR(l_string, ',', l_index);
     13      EXIT
     14    WHEN l_comma_index = 0;
     15      l_tab.EXTEND;
     16      l_tab(l_tab.COUNT) := SUBSTR(l_string, l_index, l_comma_index - l_index);
     17      l_index            := l_comma_index                           + 1;
     18    END LOOP;
     19    RETURN l_tab;
     20  END comma_to_table;
     21  /
    
    Function created.
    
    SQL> sho err
    No errors.
    SQL>
    SQL> SELECT * FROM TABLE(comma_to_table('ac_Abc.88,ac_Abc.99,ac_Abc.77'))
      2  /
    
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    
    SQL>
    

    4。パイプライン機能

    SQL> CREATE OR REPLACE
      2    FUNCTION comma_to_table(
      3        p_list IN VARCHAR2)
      4      RETURN test_type PIPELINED
      5    AS
      6      l_string LONG := p_list || ',';
      7      l_comma_index PLS_INTEGER;
      8      l_index PLS_INTEGER := 1;
      9    BEGIN
     10      LOOP
     11        l_comma_index := INSTR(l_string, ',', l_index);
     12        EXIT
     13      WHEN l_comma_index = 0;
     14        PIPE ROW ( SUBSTR(l_string, l_index, l_comma_index - l_index) );
     15        l_index := l_comma_index                           + 1;
     16      END LOOP;
     17      RETURN;
     18    END comma_to_table;
     19    /
    
    Function created.
    
    SQL> sho err
    No errors.
    SQL>
    SQL> SELECT * FROM TABLE(comma_to_table('ac_Abc.88,ac_Abc.99,ac_Abc.77'))
      2  /
    
    COLUMN_VALUE
    --------------------------------------------------------------------------------
    ac_Abc.88
    ac_Abc.99
    ac_Abc.77
    


    1. MySqlエラー!サーバーはPIDファイルを更新せずに終了します

    2. PostgresCopyに大きなtxtファイルの最初の行を無視させる方法

    3. エラーメッセージのないエラーをデバッグするにはどうすればよいですか?

    4. WHMのデータベースのみのバックアップ