【问题标题】:Postgresql return SETOF row from TablePostgresql 从表中返回 SETOF 行
【发布时间】:2015-01-15 07:25:09
【问题描述】:

我在 DBMS (Postgresql) 中有这个存储过程

CREATE OR REPLACE FUNCTION getallentree()
  RETURNS SETOF entree AS
$BODY$
begin 
   select * from entree ; 
end;
$BODY$
  LANGUAGE plpgsql 

调用此程序后:

select *  from getAllEntree(); 

我收到此错误:

ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function getallentree() line 3 at SQL statement

********** Error **********

ERROR: query has no destination for result data
SQL state: 42601
Hint: If you want to discard the results of a SELECT, use PERFORM instead.
Context: PL/pgSQL function getallentree() line 3 at SQL statement

【问题讨论】:

    标签: java database postgresql stored-procedures


    【解决方案1】:

    对于这样一个简单的查询,最好使用 SQL 函数。查询优化器可以对它们进行内联和比 PL/pgSQL 函数更好的优化:

    CREATE OR REPLACE FUNCTION getallentree()
      RETURNS SETOF entree AS
    $BODY$
       select * from entree ; 
    $BODY$
      LANGUAGE sql;
    

    如果您确实需要 PL/pgSQL 进行一些您没有向我们展示的其他处理,那么 Mureinik 关于使用 return query 的回答是您的最佳选择。

    【讨论】:

    • 您的意思是,从 java jdbc 执行此操作比调用存储过程更好?
    • 我的意思是:对于没有任何过程逻辑的普通查询,SQL 函数比 PL/pgSQL 函数更好(更快)。在 JDBC 中调用/使用 SQL 函数与调用/使用 PL/pgSQL 函数没有什么不同(尽管对于这样一个简单的语句,我根本看不到函数的原因,但您可能没有向我们展示一切)。
    • 我使用存储过程的原因是为了尽量减少客户端和 postgresql 服务器之间的往返行程。但是,我真的需要从专家那里知道原因。我想试试这个,如果它比在 JDBC 中使用普通的 PreparedStatement 或 Statement 更好。
    • SQL 和 PL/pgSQL 函数之间的决定与在 JDBC 中使用 PreparedStatement 或 Statemet 无关。 SQL 函数比 PL/pgSQL 函数更有效,无论您如何调用它(尤其是当您开始加入它时)。但是对于这样一个简单的查询,我一开始就不会使用函数。而且这个函数(如图所示)将不会减少到数据库的往返次数。 PL/pgSQL 函数实际上调用起来会更昂贵。调用SQL函数不会有任何区别
    【解决方案2】:

    您只需将return query 添加到您的select 语句中:

    CREATE OR REPLACE FUNCTION getallentree()
      RETURNS SETOF entree AS
    $BODY$
    begin 
       return query
       select * from entree ; 
    end;
    $BODY$
      LANGUAGE plpgsql 
    

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      相关资源
      最近更新 更多