度量快速开发平台-专业、快速的软件定制快开平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 部件 流程 SQL
查看: 1071|回复: 4
打印 上一主题 下一主题

[分享] 自定义oracle拆分字符串函数splitst

[复制链接]

348

主题

3572

帖子

9333

积分

论坛元老

Rank: 8Rank: 8

积分
9333
跳转到指定楼层
楼主
发表于 2020-6-9 22:17:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

在oracle中将一个字符串按照某个分隔符进行拆分,然后以数据集合返回,这种需求还是比较常见的,然后oracle本身却没有提供相应的内置函数。

下面是在网上找到的一个自定义的splitstr函数,用来实现该功能:

Step 1:定义一个类型

  1. CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000);
复制代码

Step 2:编写splitstr函数

  1. CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
  2.     RETURN str_split
  3.     PIPELINED
  4. AS
  5.     v_length   NUMBER := LENGTH(p_string);
  6.     v_start    NUMBER := 1;
  7.     v_index    NUMBER;
  8. BEGIN
  9.     WHILE(v_start <= v_length)
  10.     LOOP
  11.         v_index := INSTR(p_string, p_delimiter, v_start);

  12.         IF v_index = 0
  13.         THEN
  14.             PIPE ROW(SUBSTR(p_string, v_start));
  15.             v_start := v_length + 1;
  16.         ELSE
  17.             PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
  18.             v_start := v_index + 1;
  19.         END IF;
  20.     END LOOP;

  21.     RETURN;
  22. END splitstr;
复制代码

Step 3:创建同义词

  1. CREATE OR REPLACE PUBLIC SYNONYM splitstr FOR YEDWARD.splitstr;
复制代码

假设Step 2中的splitstr函数是在YEDWARD用户下编译,其owner是YEDWARD,为了方便被公共访问,可以建一个public同义词。

下面就可以测试了:

  1. DECLARE
  2.   TYPE t_char_array IS TABLE OF VARCHAR2(240) INDEX BY BINARY_INTEGER;
  3.   l_access_org_ids str_split;
  4. BEGIN
  5.   SELECT to_char(hou.organization_id)
  6.     BULK COLLECT
  7.     INTO l_access_org_ids
  8.     FROM hr_operating_units hou;

  9.   FOR rec IN (SELECT *
  10.                 FROM cux_settle_headers sha
  11.                WHERE EXISTS (SELECT 1
  12.                         FROM TABLE(l_access_org_ids) t
  13.                        WHERE t.column_value = sha.org_id))
  14.   LOOP
  15.     dbms_output.put_line('header_id:' || sha.header_id);
  16.   END LOOP;
  17. END;
复制代码

可以看出splistr的返回值其实是一个pl/sql table(oracle内存表),如果需要对pl/sql table类型的变量做查询,可以使用select * from table(l_plsql_type_var),如上代码所示。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
若現在就覺得失望無力,未來那麽遠妳該怎麽扛...
————————————————————————致自己
回复

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
沙发
发表于 2020-6-11 14:12:45 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
板凳
发表于 2020-6-11 14:13:13 | 只看该作者
回复 支持 反对

使用道具 举报

328

主题

3738

帖子

8566

积分

作者

Rank: 7Rank: 7Rank: 7

积分
8566
QQ
地板
发表于 2020-6-11 14:13:31 | 只看该作者
回复 支持 反对

使用道具 举报

235

主题

2547

帖子

5835

积分

论坛元老

Rank: 8Rank: 8

积分
5835
5#
发表于 2020-2-16 17:51:48 | 只看该作者
:L
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|重庆度量科技  本站关键词:快速开发平台

GMT+8, 2024-11-27 10:01 , Processed in 0.129682 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表