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