【问题标题】:Select union in a Stored Procedure在存储过程中选择联合
【发布时间】:2017-01-27 10:32:50
【问题描述】:

我使用postgresql 创建了这个存储过程:

 create or replace Function GetTimeStamp(
    IN t1 timestamp ,
    IN t2 timestamp ,
    Out reg_os Varchar(50),
    Out customer_count int ,
    Out t5 timestamp
    ) returns void AS $$
    Begin

    SELECT payment.payment_ts AS t , customer.registration_os As os ,count(Distinct customer.customer_id) As total
    From customer inner join payment on customer.customer_id = payment.customer_id
    Where Payment.payment_ts Between t1 And t2 
    Group By 1 , 2
    Union
    SELECT transfer.ts_created AS t , customer.registration_os As os, count(Distinct customer.customer_id) As total 
    From customer inner join account on customer.customer_id = account.customer_id inner join transfer on account.account_id = transfer.from_account
    Where transfer.ts_created Between t1 And t2 
    Group By 1 , 2;
    select t , os , total into t5 , reg_os , customer_count ;
    End;
    $$ LANGUAGE plpgsql;

我可以创建存储过程,但是当我使用此代码时:

 SELECT GetTimeStamp('2016-01-01' ,'2017-01-01')   OR  
 SELECT * FROM GetTimeStamp('2016-01-01' ,'2017-01-01')

它给了我一个错误:

查询没有结果数据的目的地提示:如果您想丢弃 SELECT 的结果,请改用 PERFORM

.

我在存储过程中使用 perform 而不是 select,它给了我

PERFORM 附近的语法错误。

我不知道我是否可以在两个执行查询之间使用联合。我怎样才能得到这个存储过程的结果?

【问题讨论】:

  • PERFROM 附近的语法错误 -- 它是 PERFORM,而不是 PERFROM
  • @pozs 这是我编辑的错字
  • 那么请给我们你用PERFORM调用这个函数的代码示例。可能只是上面的语句中缺少一个分号。
  • @pozs PERFORM GetTimeStamp('2016-01-01' , '2017-01-01');它给了我:“PERFORM”处或附近的语法错误。我也尝试在存储过程中使用 perfom 而不是 sql,但它给了我同样的错误。
  • 请在您的问题中提供整个上下文(通常很难从 cmets 读取代码)。

标签: sql postgresql stored-procedures


【解决方案1】:

在 PL/pgSQL 中,您需要使用SELECT ... INTO 来指定应该存储结果的变量。要丢弃结果,请使用PERFORM 而不是SELECT。

【讨论】:

    【解决方案2】:

    你需要return a set (table),它可以是普通的SQL

    create or replace Function GetTimeStamp (
       IN t1 timestamp ,
       IN t2 timestamp
    ) returns table (
        reg_os Varchar(50),
        customer_count int,
        t5 timestamp
    ) language sql as $$
    
        SELECT
            payment.payment_ts AS t ,
            customer.registration_os As os ,
            count(Distinct customer.customer_id) As total
        From
            customer
            inner join
            payment on customer.customer_id = payment.customer_id
        Where Payment.payment_ts Between t1 And t2 
        Group By 1 , 2
    
        Union
    
        SELECT
            transfer.ts_created AS t ,
            customer.registration_os As os,
            count(Distinct customer.customer_id) As total 
        From
            customer
            inner join
            account on customer.customer_id = account.customer_id
            inner join
            transfer on account.account_id = transfer.from_account
        Where transfer.ts_created Between t1 And t2 
        Group By 1 , 2;
    $$;
    

    【讨论】:

    • 我使用了这个 perform ,但是它返回了一行,一列没有任何内容。
    • 退货是什么意思?从功能上?您的函数返回 void 所以这是预期的。如果您想要不同,请更改其返回类型。
    猜你喜欢
    • 1970-01-01
    • 2011-09-21
    • 2013-10-12
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多