2015-06-20 93 views
0

我想如果条件得到满足,运行SQL查询,但我得到了以下错误:PostgreSQL的函数执行查询

错误:单独的$链是未完成或接近«$ FUNC $

我的SQL查询是:

CREATE OR REPLACE FUNCTION myfunc() 
RETURNS TABLE(dateticket date, timeticket time, userid integer, my_all bigint) AS 
    $func$ 
    BEGIN 
      IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN 
       RETURN QUERY EXECUTE 'select t.* 
       from (select distinct on (userid) dateticket, timeticket, userid, 
       count(*) over (partition by userid) as my_all 
       from tickets t 
       order by userid, dateticket, timeticket) t 
       order by my_all, dateticket, timeticket'; 
      ELSE 
       RETURN QUERY EXECUTE 'select t.* 
       from (select distinct on (userid) dateticket, timeticket, userid, 
       count(*) over (partition by userid) as my_all 
       from tickets t 
       order by userid, dateticket, timeticket) t 
       order by my_all DESC, dateticket DESC, timeticket DESC'; 
      END IF; 
    END; 
    $$ LANGUAGE plpgsql; 
+2

您使用$ func $启动函数,但尝试使用$$结束。这些必须与 –

回答

1

错误实际上不是关于条件或函数本身的任何内容,而是函数创建的语法。用$func$开始函数定义,并以$$结束。这不起作用。

$func$更改为$$以修复语法。

+0

准备匹配...但SQL查询未执行。 – ivanjj22

+0

@Ivan它应该是当你执行该功能 –

0

你有两个故障的功能一个已经回答了一个又一个的RETURN表的列是一样的温控功能内部使用的选择查询的列名,这将导致

ERROR: column reference "dateticket" is ambiguous LINE 1: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 ^DETAIL: It could refer to either a PL/pgSQL variable or a table column. QUERY: (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 CONTEXT: PL/pgSQL function myfunc() line 3 at IF ********** Error **********

所以您需要修改您的功能,如下所示

CREATE OR REPLACE FUNCTION myfunc() 
RETURNS TABLE(datet_icket date, time_ticket time, user_id integer, myall bigint) AS 
    $$ 
BEGIN 
    IF (SELECT COUNT(DISTINCT(dateticket)) from tickets) = 1 THEN 
     RETURN QUERY EXECUTE 'select t.* 
     from (select distinct on (userid) dateticket, timeticket, userid, 
     count(*) over (partition by userid) as my_all 
     from tickets t 
     order by userid, dateticket, timeticket) t 
     order by my_all, dateticket, timeticket'; 
    ELSE 
      RETURN QUERY EXECUTE 'select t.* 
      from (select distinct on (userid) dateticket, timeticket, userid, 
      count(*) over (partition by userid) as my_all 
      from tickets t 
      order by userid, dateticket, timeticket) t 
      order by my_all DESC, dateticket DESC, timeticket DESC'; 
      END IF; 
    END; 
    $$ LANGUAGE plpgsql;