ネット上で文字列トークナイザー クエリを見つけて、それを以下の関数にパッケージ化しました。この関数は、トークンの動的セットを返します。関数は正常にコンパイルされますが、どういうわけか「ORA-00933: SQL コマンドが正しく終了していません」というエラーが表示されます。誰かがこれをデバッグするのを手伝ってくれますか? ありがとうございました。
CREATE OR REPLACE TYPE KEY_VALUE_TYPE is object (k varchar2(4000), v varchar2(4000));
CREATE OR REPLACE TYPE KEY_VALUE_TABLE is table of key_value_type;
CREATE OR REPLACE FUNCTION StrTokenizer
(string IN VARCHAR2, delimiter IN VARCHAR2)
RETURN key_value_table AS
v_ret key_value_table;
BEGIN
SELECT
CAST(
multiset(
SELECT
LEVEL k,
SUBSTR(STRING_TO_TOKENIZE,
DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1),
INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)
- DECODE( LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)) v
FROM
(
SELECT
':string'||':delimiter' AS STRING_TO_TOKENIZE , ':delimiter' AS DELIMITER
FROM
DUAL
)
CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0
ORDER BY level ASC)
As key_value_table)
INTO
v_ret
FROM dual;
return v_ret;
END;
select * from strtokenizer('a,b,c',',')
ORA-00933: SQL command not properly ended
編集:
select * from table(strtokenizer('a,b,c',','))
「ORA-30732: テーブルにはユーザーに表示される列が含まれていません」と表示されます。ORA-30732
関数の所有者としてログオンしたときに消えましたが、関数は ':string'||':delimiter' を渡された値に置き換えることができません。どうすればこれを修正できますか? また、所有者としてログオンしていないときに関数を実行するにはどうすればよいですか? ありがとうございました。