Anda dapat menggunakan regexp_substr
(10g+):
SQL> SELECT regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 1) c1,
2 regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 2) c2,
3 regexp_substr('23|12.1| 450|30|9|', '[^|]+', 1, 3) c3
4 FROM dual;
C1 C2 C3
-- ---- ----
23 12.1 450
Dengan loop di PL/SQL:
SQL> SET SERVEROUTPUT ON
SQL> DECLARE
2 p_tsv VARCHAR2(1000) := '23|12.1| 450|30|9|78|82.5|92.1|120|185|52|11';
3 l_item VARCHAR2(100);
4 BEGIN
5 FOR i IN 1 .. length(p_tsv) - length(REPLACE(p_tsv, '|', '')) + 1 LOOP
6 l_item := regexp_substr(p_tsv, '[^|]+', 1, i);
7 dbms_output.put_line(l_item);
8 END LOOP;
9 END;
10 /
23
12.1
450
30
9
78
82.5
92.1
120
185
52
11
PL/SQL procedure successfully completed
Perbarui
Anda hanya memiliki 12 kolom, saya akan menulis kueri secara langsung tanpa loop, itu akan lebih berkinerja dan lebih mudah dipelihara daripada SQL dinamis (belum lagi jauh lebih mudah untuk ditulis):
INSERT INTO your_table
(ID, month1, month2, month3...)
SELECT :p_id,
regexp_substr(:p_tsv, '[^|]+', 1, 1) c1,
regexp_substr(:p_tsv, '[^|]+', 1, 2) c2,
regexp_substr(:p_tsv, '[^|]+', 1, 3) c3
...
FROM dual;