在返回游标的函数中使用regexp_substr

时间:2015-07-03 08:01:23

标签: oracle plsql

我正在尝试创建一个解析字符串并使用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;

提前感谢。

1 个答案:

答案 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 
相关问题