Postgres提供了游标表达式,但是它的语法比Oracle更不方便。
首先,你需要创建功能阵列REFCURSOR转换:
create or replace function arr2crs(arr anyarray) returns refcursor as $$
declare crs refcursor;
begin
open crs for select * from unnest(arr);
return crs;
end;
$$ language plpgsql volatile;
现在让我们创建一些测试数据
create table dep as
select 1 depid, 'Sales' depname
union all
select 2 depid, 'IT' depname;
create table emp as
select 1 empid, 1 depid, 'John' empname union all
select 2 empid, 1 depid, 'James' empname union all
select 3 empid, 2 depid, 'Rob';
可以查询它像这样
select
dep.*,
arr2crs(array(
select row(emp.*)::emp from emp
where emp.depid = dep.depid
)) emps
from dep
而且在这样的客户端处理(Java)
public static List Rs2List(ResultSet rs) throws SQLException{
List result = new ArrayList();
ResultSetMetaData meta = rs.getMetaData();
while(rs.next()){
Map row = new HashMap();
for (int i = 1; i <= meta.getColumnCount(); i++){
Object o = rs.getObject(i);
row.put(
meta.getColumnName(i),
(o instanceof ResultSet)?Rs2List((ResultSet)o):o);
}
result.add(row);
}
return result;
}
请注意,您必须将行显式投射到特定类型。您可以使用CREATE TYPE来创建必要的类型。
来源
2012-04-23 16:28:18
dvv
很好的参考,谢谢。但PostgreSQL的“标量子查询”与“游标表达式”不同:游标表达式可以返回多个行和列,而标量子查询只能返回一行(或无)和一列 – tbrugz 2011-12-27 12:49:26