【问题标题】:PostgreSQL function does not return a valuePostgreSQL 函数不返回值
【发布时间】:2017-03-28 13:35:44
【问题描述】:

-- 看不懂哪里出错了

CREATE OR REPLACE FUNCTION get_person_membership (IN person_urn CHARACTER VARYING)

   RETURNS TEXT  AS
$BODY$

DECLARE
result text;
urn ALIAS FOR $1;

BEGIN

SELECT INTO result pers.mx_groupmember FROM mt_person AS pers, mxt_recordheader AS rech
WHERE rech.primaryurn = 'urn'
AND rech.entitytype = 'person' 
AND rech.logicalserverprefix = 'EA'
AND rech.id = pers.id;
RETURN result;

END;
$BODY$
LANGUAGE plpgsql
VOLATILE
COST 100

【问题讨论】:

  • SELECT INTO result pers.mx_groupmember更改为SELECT pers.mx_groupmember into result
  • 另外,您实际上并没有在查询中使用person_urn 参数(也不是它的urn 别名,这完全没有必要,因为参数已经有了名称)。
  • 我想你应该写rech.primaryurn =urn而不是rech.primaryurn ='urn'
  • 非常感谢 Vao

标签: postgresql function


【解决方案1】:

我简化了您的查询:

  • 对于输入,您可以使用 $1,这将指示您的条件。

  • 如果您不需要其他任何地方,您可以直接返回结果。

    select * from get_person_membership('something');


CREATE OR REPLACE FUNCTION get_person_membership (IN person_urn CHARACTER VARYING) 
RETURNS TEXT  AS
$BODY$

BEGIN

RETURN (select pers.mx_groupmember --returns single value
FROM mt_person AS pers, mxt_recordheader AS rech
WHERE rech.primaryurn = $1 --input value from person_urn 
AND rech.entitytype = 'person' 
AND rech.logicalserverprefix = 'EA'
AND rech.id = pers.id);

END;
$BODY$
LANGUAGE plpgsql
VOLATILE
COST 100

【讨论】:

  • return from? (@_@)
  • return (select pers.mx_groupmember FROM mt_person AS pers, mxt_recordheader AS rech WHERE rech.primaryurn = $1 --input value from person_urn AND rech.entitytype = 'person' AND rech.logicalserverprefix = 'EA' AND rech.id = pers.id)相关链接:first solution
  • 我也从未听说过RETURN FROM。并且没有找到任何应​​该工作的evidence。但是apparently, it does(至少有 9.5)。
  • 我在 9.6 中测试过,确实有效。我想知道为什么文档中没有。
  • 这可能类似于= 的赋值参见9.39.4:很久以前(9.3 之前)就支持它,但被认为是隐藏功能(并且是一个坏的设计,因为它很容易与等式测试混淆)。这种语法似乎(至少)符合PERFORM,因此它最终可能会被添加到文档中。但在那之前,这是一个未记录的功能,因此,它可能会在没有事先通知的情况下发生变化。非常小心地使用这种语法。
【解决方案2】:

不需要PL/pgSQL,一个简单的SQL函数就可以了:

CREATE OR REPLACE FUNCTION get_person_membership (IN person_urn CHARACTER VARYING)
   RETURNS TEXT  AS
$BODY$
  SELECT pers.mx_groupmember 
  FROM mt_person AS pers
    JOIN mxt_recordheader AS rech ON rech.id = pers.id
  WHERE rech.primaryurn = person_urn --<< input parameter
    AND rech.entitytype = 'person' 
    AND rech.logicalserverprefix = 'EA';
$BODY$
LANGUAGE sql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多