如何返回在1个函数中找到的总行数的记录

时间:2010-12-27 09:29:44

标签: c# sql postgresql npgsql

CREATE OR REPLACE FUNCTION some_function(_limit integer, _skip integer, _sortcolumn text, _sortasc boolean)
  RETURNS SETOF some_table AS
$BODY$

begin

 return query execute 'select * from some_table order by "'||_sortcolumn||'"' ||case when _sortasc then 'asc' else 'desc' end ||' limit $1 offset $2;' using _limit, _skip;

end;
$BODY$
  LANGUAGE plpgsql STABLE SECURITY DEFINER
  COST 100
  ROWS 100;

我想通过引用传递参数,所以我可以将总行分配给param。到目前为止我发现它是不可能的有什么建议吗?我正在使用C#

修改

我发现'RAISE NOTICE'可能很有用。仍然找到一种方法通过npgsql

接收.Net中的通知

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。如果使用命令对象直接调用此函数,则ExecuteScalar函数将返回该命令返回的行数。

rowCountValue = (int)command.ExecuteScalar();

或者,您可以在函数定义中执行此操作;

CREATE OR REPLACE FUNCTION some_function(_limit integer, _skip integer, _sortcolumn text, _sortasc boolean, OUT _row_count integer)
  RETURNS SETOF some_table AS
$BODY$
DECLARE
    _result RECORD;
BEGIN
EXECUTE 'SELECT * FROM some_table ORDER BY "'||_sortcolumn||'"' ||case when _sortasc then 'asc' else 'desc' end ||' limit $1 offset $2;' INTO _result using _limit, _skip;

GET DIAGNOSTICS _row_count = ROW_COUNT;

return result;

END;
$BODY$
  LANGUAGE plpgsql STABLE SECURITY DEFINER
  COST 100
  ROWS 100;

如果你查询建筑物是好的,那么这个应该可以很好地工作。

希望这有帮助。

答案 1 :(得分:1)

您也可以尝试更改函数以返回一组refcursors,并返回带有行数的结果集和带有数据的另一组。

查看“在DataSet对象中获取完整结果:使用refcursors”部分来自Npgsql用户手册:http://manual.npgsql.org您将在那里找到如何做到这一点。

我希望它有所帮助。