如何解决我编写了一个函数,将字符串分解为以$分隔的部分
我创建了以下函数来分割由$
分隔的给定字符串。
我想在SQL查询中调用该函数,并以行的形式获取结果。
CREATE OR REPLACE FUNCTION string_tokenize2
( p_string IN CLOB
-- p_delim in varchar2
)
RETURN SYS_REFCURSOR
AS
cur1 SYS_REFCURSOR;
BEGIN
OPEN cur1 FOR
SELECT regexp_substr(p_string,'[^$]+',1,LEVEL) AS str
FROM sys.dual
CONNECT BY LEVEL <= regexp_count(p_string,'\$') + 1;
RETURN cur1;
END string_tokenize2;
/
但是,当我在SQL中尝试使用它时,会导致以下错误。
请协助我如何进行此处
解决方法
从double中选择string_tokenize2('');
将您的IN变量放入()
,您可以
1)如果您需要select
语句中的数据,请使用xmltable和xmltype从sys_refcursor函数结果中读取数据:
也就是说,您可以使用相同的函数,而无需进行任何更改,但是可以使用xmltable + xmltype读取它:
select *
from xmltable(
'/ROWSET/ROW'
passing xmltype(string_tokenize2('1$2$3$4'))
columns
str varchar2(100) path 'STR'
);
结果:
STR
---------------------------------------
1
2
3
4
2)或使用plsql隐式结果,如果您只需要从任何客户端获取数据:https://oracle-base.com/articles/12c/implicit-statement-results-12cr1
示例:
CREATE OR REPLACE PROCEDURE string_tokenize2
( p_string IN CLOB
-- p_delim in varchar2
)
AS
cur1 SYS_REFCURSOR;
BEGIN
OPEN cur1 FOR
SELECT regexp_substr(p_string,'[^$]+',1,LEVEL) AS str
FROM sys.dual
CONNECT BY LEVEL <= regexp_count(p_string,'\$') + 1;
DBMS_SQL.RETURN_RESULT(cur1);
END string_tokenize2;
/
begin
string_tokenize2('1,2,3,4');
end;
结果:
SQL> exec string_tokenize2('1,4');
ResultSet #1
STR
---------------------------------------
1,4
3)或仅将sys_refcursor作为绑定变量返回到客户端应用程序:
begin
:res := string_tokenize2('1,4');
end;
sql * plus中的示例:
SQL> var res refcursor
SQL> exec :res := string_tokenize2('1$2$3$4');
SQL> print res
STR
--------------------
1
2
3
4
4)或其他用户建议的varchar2集合/ varrays
,您是否有任何约束要坚持原样?或
为什么不创建对象类型并更改函数以返回表类型,然后在SQL中使用它呢?
--create the type
CREATE OR REPLACE TYPE string_tokenize2_obj IS TABLE OF VARCHAR2(4000);
--Function changes
CREATE OR REPLACE FUNCTION string_tokenize2(p_string IN CLOB)
RETURN string_tokenize2_obj AS
l_tab string_tokenize2_obj;
BEGIN
SELECT to_char(str)
BULK COLLECT
INTO l_tab
FROM (SELECT regexp_substr(p_string,LEVEL) str
FROM dual
CONNECT BY LEVEL <= regexp_count(p_string,'\$') + 1);
RETURN l_tab;
END string_tokenize2;
/
SQL> SELECT column_value str FROM TABLE(string_tokenize2('abc$def$geh$ijkl'));
STR
--------------------------------------------------------------------------------
abc
def
geh
ijkl
SQL>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。