首页 > 其他分享 >达梦split函数的实现,pipe row的用法

达梦split函数的实现,pipe row的用法

时间:2023-07-13 15:46:18浏览次数:32  
标签:END 函数 pipe split str mytype 达梦 Row

本文转载自:https://www.yii666.com/article/516427.html

 

为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。达梦和Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。

管道化表函数必须返回一个集合。在函数中,PIPE ROW 语句被用来返回该集合的单个元素,该函数必须以一个空的 RETURN 语句结束,以表明它已经完成。一旦我们创建了上述函数,我们就可以使用 TABLE 操作符从 SQL 查询中调用它。

管道化表函数经常被用来把数据从一种类型转化成另一种类型。

下面是用 Pipelined Table 实现 split 函数的例子

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 PIPELINED
IS
j INT := 0;
i INT := 1;
len INT := 0;
len1 INT := 0;
str VARCHAR2 (4000);
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);
PIPE ROW (str);
IF i >= len
THEN
EXIT;
END IF;
ELSE
str := SUBSTR (p_str, i, j - i);
i := j + len1;
PIPE ROW (str);
END IF;
END LOOP;
RETURN;
END fn_split;

测试:SELECT * FROM TABLE (fn_split ('1;;12;;123;;1234;;12345', ';;'));

结果:
1
12
123
1234
12345

CREATE TYPE mytype AS OBJECT (
field1 NUMBER,
field2 VARCHAR2 (50)
);
CREATE TYPE mytypelist AS TABLE OF mytype;
CREATE OR REPLACE FUNCTION pipelineme
RETURN mytypelist PIPELINEDIS
v_mytype mytype;
BEGIN
FOR v_count IN 1 .. 20
LOOP
v_mytype := mytype (v_count, 'Row ' || v_count);
PIPE ROW (v_mytype); END LOOP;
RETURN;
END pipelineme;
SELECT * FROM TABLE (pipelineme);
FIELD1 FIELD2

------ ------------------------
1 Row 1
2 Row 2
3 Row 3
4 Row 4
5 Row 5
6 Row 6
7 Row 7
8 Row 8
9 Row 9
10 Row 10
11 Row 11
12 Row 12
13 Row 13
14 Row 14
15 Row 15
16 Row 16
17 Row 17
18 Row 18
19 Row 19
20 Row 20

*********************************

标签:END,函数,pipe,split,str,mytype,达梦,Row
From: https://www.cnblogs.com/zhncnblogs/p/17551064.html

相关文章

  • 解决redis mget和pipeline性能对比的具体操作步骤
    RedisMGET和Pipeline性能对比整体流程为了理解和比较Redis的MGET和Pipeline性能,我们需要了解以下步骤:步骤描述1连接到Redis服务器2使用MGET命令获取多个键的值3使用Pipeline命令批量执行多个命令4计算每个步骤的执行时间5比较MGET和Pipeline的性能......
  • csplit
    csplit将一个大文件分割成小的碎片文件补充说明csplit命令用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件。碎片文件的命名类似“xx00”,“xx01”。csplit命令是split的一个变体,split只能够根据文件大小或行数来分割,但csplit能够根据文件本身特点来分割......
  • MySQL迁移达梦数据库注意事项
    mysql<—>dmmysql迁移到dm报错【错误消息:不支持该数据类型】mysql迁移到dm报错【错误消息:不支持该数据类型】|达梦技术社区(dameng.com)更改迁移工具DM连接驱动.这个驱动地址在安装包里面有,相对路径为:/drivers/jdbc,可以挑选最新的驱动。不支持直接comment注释创建......
  • 达梦数据库&DBeaver
    DBeaver:https://dbeaver.io/download/达梦官网:https://eco.dameng.com/download/前提:数据库需要启动 链接步骤:1、打开DBeaver 2、数据库--->驱动管理器---->新建   3、新建数据库链接--->找到上面设置的驱动(可以搜索)4、输入链接需要的配置项     ......
  • 达梦实时主备搭建技术分享
    在部分工作场景下可能会使用到达梦数据库的数据守护功能,本文介绍达梦数据守护服务的搭建。此次搭建使用三台机器,一主一备一监视器。其中主备数据库需要提前初始化。一、数据准备需要保证主备库数据一直,这里使用dmrman脱机备份还原方式进行。停止主库,进行rman全备。./dmrmanCTL......
  • Qt QSplitter拆分器
    1.简介QSplitter拆分器允许用户通过拖动子部件之间的边界来控制它们的大小。单个拆分器可以控制任意数量的小部件。QSplitter的典型用法是创建几个小部件,并使用insertWidget()或addWidget()添加它们。2.常用方法 默认情况下,QSplitter会动态调整其子元素的大小。如果您希望QS......
  • 麒麟V10操作系统安装达梦DM8常见问题分享
    一、麒麟V10关闭防火墙kylinV10系统或linux系统关闭启动防火墙开启防火墙并设置开机自启启动:systemctlstartfirewalld关闭:systemctlstopfirewalld查看状态:systemctlstatusfirewalld开机禁用:systemctldisablefirewalld开机启用:systemctlenablefirewalld二、......
  • 麒麟V10操作系统安装达梦DM8常见问题分享
    一、麒麟V10关闭防火墙kylinV10系统或linux系统关闭启动防火墙开启防火墙并设置开机自启启动:systemctlstartfirewalld关闭:systemctlstopfirewalld查看状态:systemctlstatusfirewalld开机禁用:systemctldisablefirewalld开机启用:systemctlenablefirewalld二、......
  • 银河麒麟V10安装达梦数据库DM8
    1.系统准备查看系统信息:cat/proc/version查看CPU:lscpu或cat/proc/cpuinfo查看内存:free-m查看磁盘空间:cat/proc/meminfo或df-h查看tmp空间(至少1.5G以上):df-h/tmp发现tmp空间太小(安装DM8需要至少800M的临时空间),增加tmp空间大小:mount-oremount,size=2G/tmp查看Glib......
  • 达梦数据库操作手册
    https://eco.dameng.com/document/dm/zh-cn/start/index.html#:~:text=%E6%9C%AC%E6%8C%87%E5%8D%97%E4%B8%BA%E6%AD%A6%E6%B1%89%E8%BE%BE%E6%A2%A6%E6%95%B0%E6%8D%AE%E5%BA%93%E8%82%A1%E4%BB%BD%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%EF%BC%88%E4%BB%A5%E4%B8%8B%E7%AE%80......