oracle 用split整张表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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通过两张表更新一张表
有ABC三张表,A表T数据空,需要将BC表中的T数据根据id更新过去,两次update之后发现第一次更新的都变成空的了
参考技术A到底用b还是c来更新?或者有什么关系?
给你写一个用B更新A的吧:
update A set t = (select T from B where a.id = b.id)where exists (select 1 from B where a.id = b.id and b.T is not null);追问
用B和C更新A,但是我分开更新发现,第二次更新将第一次的刷没了
追答where很关键的;
oracle的用其它表更新中没有sqlserver的update from 的语法,用上面的语法where一定要写对。
提示缺少关键字
追答B.ID后面多了个逗号
追问少了个as,我已经做好啦,谢谢
本回答被提问者采纳 参考技术C 更新一张表以上是关于oracle 用split整张表的主要内容,如果未能解决你的问题,请参考以下文章