暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL Oracle 兼容性之 - PL/SQL pipelined

digoal 2016-03-18
374
TAG 21

作者

digoal

日期

2016-03-18

标签

PostgreSQL , Oracle , 兼容性 , pipelined , setof , plpgsql , pl/sql


背景

在Oracle中可以使用pipelined来返回多条记录。

在PostgreSQL中对应的功能是setof 表示返回多条记录。

网上的一个例子:

```
Oracle supports pipelined functions.

e.g a split function which takes in a string (a,b,c) and returns a b and c on multiple rows.

Can you advise on how to migrate such a function into enterprisedb?
```

```
create or replace function split
(
p_list varchar2,
p_del varchar2 := ','
) return split_tbl pipelined
is
l_idx pls_integer;
l_list varchar2(32767) := p_list;
l_value varchar2(32767);
begin
loop
l_idx := instr(l_list,p_del);
if l_idx > 0 then
pipe row(trim(substr(l_list,1,l_idx-1)));
l_list := substr(l_list,l_idx+length(p_del));

else
pipe row(trim(l_list));
exit;
end if;
end loop;
return;
end split;
```

PostgreSQL:

对于以上例子的需求,可以使用现成的PostgreSQL函数来解决:

```
postgres=# select regexp_split_to_table('a-b-c-d','-');
regexp_split_to_table


a
b
c
d
(4 rows)
```

如果用户只是有返回多行的需求,则可以使用returns setof来解决。

例如:

```
postgres=# create or replace function split (text,text) returns setof text as $$
postgres$# select regexp_split_to_table($1,$2);
postgres$# $$ language sql strict;
CREATE FUNCTION

postgres=# select split('a-b-c-d','-');
split


a
b
c
d
(4 rows)

postgres=# create or replace function rsf1(id int) returns setof int as $$
postgres$# declare
postgres$# begin
postgres$# for i in 0..abs(id) loop
postgres$# return next i;
postgres$# end loop;
postgres$# end;
postgres$# $$ language plpgsql strict;
CREATE FUNCTION
postgres=# select rsf1(10);
rsf1


0  
1  
2  
3  
4  
5  
6  
7  
8  
9
复制

10
(11 rows)
```

PostgreSQL 许愿链接

您的愿望将传达给PG kernel hacker、数据库厂商等, 帮助提高数据库产品质量和功能, 说不定下一个PG版本就有您提出的功能点. 针对非常好的提议,奖励限量版PG文化衫、纪念品、贴纸、PG热门书籍等,奖品丰富,快来许愿。开不开森.

9.9元购买3个月阿里云RDS PostgreSQL实例

PostgreSQL 解决方案集合

德哥 / digoal's github - 公益是一辈子的事.

digoal's wechat

文章转载自digoal,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论