コメントで述べたように、 の代わりにsubstr
and関数を使用してみてください。おそらく、パフォーマンスは許容できるでしょう。instr
regexp_substr
CREATE TABLE test_list_tab (
id NUMBER,
str VARCHAR2(100)
);
CREATE TABLE test_tokens_tab (
id NUMBER,
token VARCHAR2(100)
);
INSERT INTO test_list_tab VALUES (1, 'i love dogs');
INSERT INTO test_list_tab VALUES (2, 'i like cats and dogs');
INSERT INTO test_list_tab VALUES (3, 'i');
INSERT INTO test_list_tab VALUES (4, 'abc');
INSERT INTO test_list_tab VALUES (5, 'abc i');
INSERT INTO test_list_tab VALUES (6, NULL);
DECLARE
v_token test_list_tab.str%TYPE;
v_space_position NUMBER := 1;
v_prev_space_position NUMBER := 1;
BEGIN
FOR v_rec IN (SELECT id, str FROM test_list_tab WHERE str IS NOT NULL)
LOOP
v_prev_space_position := 0;
LOOP
v_space_position := instr(v_rec.str, ' ', v_prev_space_position + 1);
IF v_space_position > 0 THEN
v_token := substr(v_rec.str, v_prev_space_position + 1, v_space_position - v_prev_space_position - 1);
ELSE
v_token := substr(v_rec.str, v_prev_space_position + 1);
END IF;
INSERT INTO test_tokens_tab VALUES (v_rec.id, v_token);
v_prev_space_position := v_space_position;
EXIT WHEN v_space_position = 0;
END LOOP;
END LOOP;
COMMIT;
END;
SELECT id, token FROM test_tokens_tab;
出力:
IDトークン
---------- -------
1 私
1 愛
1匹の犬
2 私
2いいね
2匹の猫
2 と
2匹の犬
3 私
4 abc
5 abc
5 私