我正在尝试创建一个解析字符串并使用regexp_substr将其转换为行的函数,但字符串和分隔符应该是动态的。
DECLARE
txt VARCHAR2(30) := '10;20;30';
delim varchar2(2) := ';';
BEGIN
open :c for 'SELECT
REGEXP_SUBSTR ('''||txt||''',''[^' || delim || ']+'',1,LEVEL) FROM DUAL
CONNECT BY REGEXP_SUBSTR ('''||txt||''',''[^' || delim || ']+'',1,LEVEL) IS NOT NULL';
END;
上面的代码运行良好,但我不知道如何将它放入一个函数,这是我的函数下面但不返回任何东西(可能有错误..我错过了什么?
CREATE OR REPLACE FUNCTION EPM_APPS.FN_PARSER (toParse IN VARCHAR, delim IN VARCHAR)
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
OPEN my_cursor FOR
'SELECT REGEXP_SUBSTR ('''||toParse||''',''[^' || delim || ']+'',1,LEVEL) FROM DUAL
CONNECT BY REGEXP_SUBSTR ('''||toParse||''',''[^' || delim || ']+'',1,LEVEL) IS NOT NULL';
--CLOSE my_cursor;
RETURN my_cursor;
END FN_PARSER;
提前感谢。
答案 0 :(得分:1)
创建SQL对象类型:
create or replace type delimted_list as table of varchar2(4000);
/
功能:
CREATE OR REPLACE FUNCTION FN_PARSER (toParse IN VARCHAR, delim IN VARCHAR)
RETURN delimted_list
AS
l_delimted_list delimted_list := delimted_list();
BEGIN
SELECT REGEXP_SUBSTR (toParse,'[^'||delim||']+',1,LEVEL)
BULK COLLECT INTO l_delimted_list
FROM DUAL
CONNECT BY REGEXP_SUBSTR (toParse,'[^'||delim||']+',1,LEVEL) IS NOT NULL;
RETURN l_delimted_list;
END FN_PARSER;
/
<强>用法:强>
select * from TABLE(FN_PARSER('Mahesh,Vignesh',','));
COLUMN_VALUE ------------------
Mahesh
Vignesh