【问题标题】:plpgsql - How to return out parameter and ref cursor from stored procedure?plpgsql - 如何从存储过程中返回参数和引用游标?
【发布时间】:2015-05-11 14:03:31
【问题描述】:

我想在我的应用程序中实现分页。 我创建了存储过程,它返回记录数作为输出参数和引用游标数据本身(带有限制和偏移量) 但作为结果 - 我得到 -" 由于 OUT 参数,函数结果类型必须是 bigint"

据我了解 - 它抱怨 out "_count" bigint

有什么情况可以从同一个存储过程中返回out参数和ref cursor

  CREATE OR REPLACE FUNCTION aggr."GetPromotionsFull"("_limit" bigint, "_offset" bigint, out "_count" bigint)
  RETURNS refcursor AS   
$BODY$
DECLARE
      ref refcursor;    
BEGIN   

select count(1) into "_count" from aggr."Promotion" t 
inner join aggr."Company" c on t."CompanyId"=c."Id"  
   where 
   t."isDeleted"=false
  and c."isDeleted"=false;


  OPEN ref FOR
  SELECT t."Id",
  t."CompanyId",
  t."PromoName",
  t."Description",
  t."Url",
  t."ImgPath",
  t."CreatedDate",
  t."IsEnabled",
  t."isDeleted",
  c."Name"as "CompanyName"
  FROM aggr."Promotion" t
  inner join aggr."Company" c on t."CompanyId"=c."Id"  
   where 
   t."isDeleted"=false
   and c."isDeleted"=false
   limit "_limit" offset "_offset";

    RETURN ref;     
END
$BODY$
  LANGUAGE plpgsql VOLATILE

【问题讨论】:

    标签: postgresql stored-procedures plpgsql out-parameters ref-cursor


    【解决方案1】:

    当您使用一个 OUT 变量时,结果类型必须与 OUT 变量的类型相同。当你想要返回多个值时,你必须使用更多的 OUT 变量,结果类型应该是 RECORD 或 RETURNING 部分可以忽略。

    现代 PostgreSQL 不允许你做的事情:

    postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int) 
    RETURNS numeric AS $$ select 10$$ 
    LANGUAGE sql;
    ERROR:  function result type must be integer because of OUT parameters
    

    但你应该这样做:

    postgres=# CREATE OR REPLACE FUNCTION fx(OUT a int, OUT b numeric)
    AS $$ select 10, 20.1$$ 
    LANGUAGE sql;
    CREATE FUNCTION
    

    注意:使用 OFFSET LIMIT 分页不是最好的主意 - 请参阅 http://use-the-index-luke.com/sql/partial-results/fetch-next-page

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多