oracle 用split整张表

Posted

tags:

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

我想把整张表里面的name字段都split掉,应该怎么写?
现在split函数只能split一条。

CREATE TABLE TestMulToOne (
  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 先把BC两表数据整合一下,create view V_BC select B.T,B.ID, FROM B UNION SELECT C.T,C.ID FROM C.追问

提示缺少关键字

追答

B.ID后面多了个逗号

追问

少了个as,我已经做好啦,谢谢

本回答被提问者采纳
参考技术C 更新一张表

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

Oracle12c:自动分区表

Oracle提升查询性能之-简单范围分区表的创建

oracle的局部本地分区索引

oracle SQL语句怎么关联一张表 没有对应数据的就显示为空

ORACLE-2

用oracle存储过程将一张表的数据查出插入另一张表