oracle中split是关键字?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中split是关键字?相关的知识,希望对你有一定的参考价值。
在PL/SQL中 发现split为关键字,请问这个关键字怎么用?
和JAVA中的split函数有关系吗?
我当然知道spilt是拆分字符。。。
我想知道ORACLE里的这个关键字的作用。
不是JAVA里的split函数,
若想要在oracle 实现些函数
CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
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;
/
测试:
DECLARE
CURSOR c
IS
SELECT *
FROM TABLE (CAST (fn_split ('1;;12;;123;;1234;;12345', ';;') AS ty_str_split
)
);
r c%ROWTYPE;
BEGIN
OPEN c;
LOOP
FETCH c INTO r;
EXIT WHEN c%NOTFOUND;
DBMS_OUTPUT.put_line (r.column_value);
END LOOP;
CLOSE c;
END;
/
结果:
1
12
123
1234
12345 参考技术A 拆分字符串 split('') s 单引号里是按哪个字符拆分
比如 str='1|2|3'的话 str.split('|') 结果就是数组1,2,3
oracle 用split整张表
我想把整张表里面的name字段都split掉,应该怎么写?
现在split函数只能split一条。
name VARCHAR(10),
allTitles VARCHAR(200)
);
INSERT INTO TestMulToOne VALUES ('张三', '程序员,系统管理员,网络管理员');
INSERT INTO TestMulToOne VALUES ('李四', '项目经理,系统分析员');
-- 定义一个对象类型.
CREATE OR REPLACE TYPE ty_row_str_split as object (strValue VARCHAR2 (4000));
/
-- 定义一个 表/数组类型, 内容是前面定义的那个对象.
CREATE OR REPLACE TYPE ty_tbl_str_split IS TABLE OF ty_row_str_split;
/
--------------------
-- 字符分割函数.
-- 参数1: 被分割的源字符串
-- 参数2: 用于拆分的字符串。
--------------------
CREATE OR REPLACE FUNCTION fn_split(
p_str IN VARCHAR2,
p_delimiter IN VARCHAR2)
RETURN ty_tbl_str_split IS
j INT := 0;
i INT := 1;
-- 被分割的源字符串 的长度.
len INT := 0;
-- 分隔字符串的长度
len1 INT := 0;
-- 暂存的中间每一个单元的文本信息.
str VARCHAR2(4000);
-- 预期返回结果.
str_split ty_tbl_str_split := ty_tbl_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=0 意味着没有找到.
-- 可以理解为是查询到最后一个单元了.
-- 设置 j := len, 让外部的循环处理可以结束了.
j := len;
-- 获取最后一个单元的内容.
str := SUBSTR(p_str, i);
-- 结果追加一行.
str_split.EXTEND;
-- 设置结果内容.
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
IF i >= len THEN
EXIT;
END IF;
ELSE
-- 如果在被分割的源字符串中,找到了 分隔字符串.
-- 首先,获取分割的内容.
str := SUBSTR(p_str, i, j - i);
-- 然后设置索引, 下一次再查找的时候,从指定的索引位置开始(不是从0开始找了)
i := j + len1;
-- 结果追加一行.
str_split.EXTEND;
-- 设置结果内容.
str_split(str_split.COUNT) := ty_row_str_split(strValue => str);
END IF;
END LOOP;
RETURN str_split;
END fn_split;
/
函数创建完毕以后,可以开始做查询的处理.
SQL> select to_char(strvalue) as Value from table(fn_split('aa,bb,cc',','));
VALUE
-------------------------------------------------------------------------------
aa
bb
cc
SQL> COLUMN "name" FORMAT A15
SQL> COLUMN "Value" FORMAT A15
SQL>
SQL>
SQL>
SQL> select
2 TestMulToOne.name,
3 to_char(strvalue) as Value
4 from
5 TestMulToOne,
6 table(fn_split( TestMulToOne.allTitles, ','));
NAME VALUE
--------------- ---------------
张三 程序员
张三 系统管理员
张三 网络管理员
李四 项目经理
李四 系统分析员
SQL>
这样的效果。 行不?
参考技术A 你说的有点笼统,不知道你是想把表结构里面的name字段弄掉,还是把这个表数据里面的name字段弄掉,要是内容的话,那你就写个procedure,循环输出每一行,之后对本行内容进行正则,直接正则的分界为“name”之后获取的list循环拼接就行了啊,追问http://zhidao.baidu.com/question/1539892740940730307.html?sort=6#answer-1582571857
这里是详细的问题,能再上面写个语句吗
以上是关于oracle中split是关键字?的主要内容,如果未能解决你的问题,请参考以下文章