oracle中使用split函数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中使用split函数问题相关的知识,希望对你有一定的参考价值。

我使用的是网上找到的方法:
CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN ty_str_split
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
str_split ty_str_split := ty_str_split ();
BEGIN
len := LENGTH (p_str);
len1 := LENGTH (p_delimiter);

WHILE j < len
LOOP
j := INSTR (p_str, p_delimiter, i);

IF j = 0
THEN
j := len;
str := SUBSTR (p_str, i);
str_split.EXTEND;
str_split (str_split.COUNT) := str;

IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
str_split.EXTEND;
str_split (str_split.COUNT) := str;
END IF;
END LOOP;

RETURN str_split;
END fn_split;
但是运行编译时,提示ty_str_split必须声明,怎么声明呢?

参考技术A CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN VARCHAR2
应该是这样追问

首先感谢您的热心,您有一个比较全的这个函数的写法吗?发一个呗,谢谢

追答

你应该修改一下就能用啦,这个不是通用的

追问

您的方法我试验了,还是提示错误

追答

str_split ty_str_split := ty_str_split (); 这一句也是有问题的
不知道你需要什么功能

oracle中split字符串的问题

请问使用什么办法实现split的功能?
谢谢
例如原先的字符串是“张三,李四,王五”
然后拆成一个集合(“张三”,“李四”,“王五”)
然后我可以在where子句中使用in。
谢谢。

参考技术A 写function或procedure来分隔。
首先声明一个数组类型:
-- 字符串集合
TYPE Typ_Tab_Str IS TABLE OF VARCHAR(150) INDEX BY BINARY_INTEGER;
-- 写一个函数
CREATE OR REPLACE FUNCTION Fun_Stringtoarrary(P_Sourcestr IN VARCHAR2, -- 源字符串
P_Separator IN VARCHAR2, -- 分隔符
P_Arrary OUT Typ_Tab_Str -- 拆分后得到的数组
) RETURN NUMBER IS
n_Count NUMBER(6); -- 分隔符的个数
n_Posb NUMBER(6); -- 初始位置
n_Pose NUMBER(6); -- 分隔符的位置
BEGIN
-- 初始化
n_Count := 0;
n_Posb := 1;
-- 非空校验
IF Prm_Sourcestr IS NULL OR Prm_Separator IS NULL THEN
RETURN - 1;
END IF;
LOOP n_Pose := Instr(Prm_Sourcestr, Prm_Separator, n_Posb, 1);
n_Count := n_Count + 1;
IF n_Pose = 0 THEN
Prm_Arrary(n_Count) := Substr(Prm_Sourcestr, n_Posb, Length(Prm_Sourcestr) - n_Posb + 1);
EXIT;
END IF;
Prm_Arrary(n_Count) := Rtrim(Ltrim(Substr(Prm_Sourcestr, n_Posb, n_Pose - n_Posb))); n_Posb := n_Pose + Length(Prm_Separator);
END LOOP;
RETURN n_Count;
EXCEPTION
WHEN OTHERS THEN
RETURN - 1;
END Fun_Stringtoarrary;追问

oracle没有内置的函数吗

追答

没有,只提供了,inner,substr等等简单操作的函数,因为oracle本身就没有数组类型,我们是通过索引表来模拟数组,其实就是一个仿数组的结构。上面的函数完全正确,属于常用自定义功能函数。

本回答被提问者和网友采纳
参考技术B 你是想把一个字符串分成多个么?比如abc拆成a,b,c?
如果是这样的话可以用substr(),例如:
substr(abc,1,1)=a,substr(abc,1,2)=ab,substr(abc,2,2)=bc。追问

例如原先的字符串是“张三,李四,王五”
然后拆成一个集合(“张三”,“李四”,“王五”)
然后我可以在where子句中使用in。
谢谢。

追答

一样的substr就是提取部分字符段的函数,可以用到你的集合里。

参考技术C SELECT '('||''''||REPLACE('张三,李四,王五',',',''',''')||''''||')' FROM DUAL;
你可以在JAVA理处理:

以上是关于oracle中使用split函数问题的主要内容,如果未能解决你的问题,请参考以下文章

oracle 用split整张表

oracle中split是关键字?

Oracle按指定字符拆分字符串-split函数

【Python】split()函数

oracle split() 函数

oracle数组 拼到sql的in子句中去