oracle中split是关键字?

Posted

tags:

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

在PL/SQL中 发现split为关键字,请问这个关键字怎么用?
和JAVA中的split函数有关系吗?
我当然知道spilt是拆分字符。。。
我想知道ORACLE里的这个关键字的作用。

oracle 中的split是分区里有数据检索用的,具体也不知道怎用,
不是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一条。

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中split是关键字?的主要内容,如果未能解决你的问题,请参考以下文章

错误:__init__() 有一个意外的关键字参数“n_splits”

C#字符串Split方法的误区

oracle 中怎么样去除关键字特殊意义?

jstl split 分割字符串?

Oracle基础之保留字和关键字

oracle 中,计算多个数值项目的和,再将求出的值作为条件项目判断。请教关键字是啥?