【问题标题】:Using return query in Postgres 9.0 function with composite type在具有复合类型的 Postgres 9.0 函数中使用返回查询
【发布时间】:2014-04-25 22:40:30
【问题描述】:

我在 Postgres 中有一个函数,它返回一组复合类型。返回时,我只能使用return next; 执行此操作,而无法使用return query 命令执行此操作,这是为什么呢?

 CREATE TYPE return_type AS
   (paramname character varying,
    value character varying);

 CREATE OR REPLACE FUNCTION test(i_param1 character varying, i_param2 character varying)
      RETURNS SETOF return_type AS

    --this works just fine returning two rows
    r.paramname:='row1';
    r.value:='myvalue1';
    return next r;        
    r.paramname:='row1';
    r.value:='myvalue1';
    return next r;
    return;

    --  with this command I do not get a single row attached in the resultset
    return query
    select 'row1' as paraName,'myvalue1' as value
    UNION ALL
    select 'row2' as paraName,'myvalue2' as value;
    return;

【问题讨论】:

    标签: database function postgresql plpgsql


    【解决方案1】:

    这对我有用,即使在 Postgres 8.4 中:

    CREATE OR REPLACE FUNCTION test(i_param1 varchar, i_param2 varchar)
      RETURNS SETOF return_type AS
    $func$
    BEGIN
        RETURN QUERY
        SELECT 'row1'::varchar, 'myvalue1'::varchar
        UNION ALL
        SELECT 'row2','myvalue2';
    END
    $func$  LANGUAGE plpgsql;
    

    由于类型不匹配,您的原件应该只返回一个异常。您需要将字符串文字cast 转换为匹配的类型。另一方面,列别名在这里无关紧要:在函数体之外不可见。

    SQL Fiddle

    【讨论】:

    • 好吧@erwin,在获取函数结果时,到目前为止,关于类型不匹配,我没有任何异常,所以我认为这不是我的问题。当应该返回一行时,它只是返回 0 行。关于别名,我无权更改。
    • @Douglas:查询中的别名不需要要求更改。他们只是噪音。至于结果:你看过提供的小提琴吗?它显然适用于 Postgres 8.4 和 9.1。手头不再有任何 9.0 安装。 9.0 不是一个特别受欢迎的版本,现在已经过时了。如果这不能解决您的问题,请提供一个完整的函数定义——就像你应该开始的那样——这样我们就可以尝试重现你的发现。
    • 是的,你是对的@Erwin,遗憾的是我需要使用该版本的 Postgres,因为与所使用平台的新版本 Postgres 的兼容性问题。我进行了一些测试,看起来你是正确的我需要转换字符串文字,但由于某种原因它没有抛出任何错误。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多