Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Greenplum plpgsql函数在输入结束时返回语法错误_Sql_Postgresql_Plpgsql_Greenplum - Fatal编程技术网

Greenplum plpgsql函数在输入结束时返回语法错误

Greenplum plpgsql函数在输入结束时返回语法错误,sql,postgresql,plpgsql,greenplum,Sql,Postgresql,Plpgsql,Greenplum,我正在用Greenplum编写一个PL/pgSQL函数,该函数需要将interval转换为正值 例如,间隔值-23:57:00应转换为00:03:00。所以我写了这个函数: CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL) RETURNS INTERVAL AS $$ BEGIN IF timeval < INTERVAL '00:00:00' THEN RETURN timeval + INTERVAL '2

我正在用Greenplum编写一个PL/pgSQL函数,该函数需要将
interval
转换为正值

例如,间隔值
-23:57:00
应转换为
00:03:00
。所以我写了这个函数:

CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL)
RETURNS INTERVAL AS $$
BEGIN
    IF timeval < INTERVAL '00:00:00' THEN
        RETURN timeval + INTERVAL '24:00:00';
    ELSE
        RETURN timeval;
    END IF;
    RETURN;
END;
$$ LANGUAGE plpgsql;

我不确定出了什么问题?

现代PostgreSQL有更好的诊断功能:

postgres=# CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL)
RETURNS INTERVAL AS $$
BEGIN
  IF timeval < INTERVAL '00:00:00' THEN
    RETURN timeval + INTERVAL '24:00:00';
  ELSE
    RETURN timeval;
  END IF;
  RETURN; --- SHOULD BE REMOVED
END;                
$$ LANGUAGE plpgsql;
ERROR:  missing expression at or near ";"
LINE 9: RETURN;
              ^
postgres=#创建或替换函数abstime(timeval INTERVAL)
将间隔返回为$$
开始
如果timeval<间隔“00:00:00”,则
返回时间值+间隔“24:00:00”;
其他的
返回时间值;
如果结束;
返回;——应该删除
结束;
$$语言plpgsql;
错误:在“;”处或附近缺少表达式
第9行:返回;
^

第9行的返回值无效,并且缺少一个表达式。您必须删除第9行。在这种情况下,表达式在
RETURN
语句中是必需的。

现代PostgreSQL具有更好的诊断功能:

postgres=# CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL)
RETURNS INTERVAL AS $$
BEGIN
  IF timeval < INTERVAL '00:00:00' THEN
    RETURN timeval + INTERVAL '24:00:00';
  ELSE
    RETURN timeval;
  END IF;
  RETURN; --- SHOULD BE REMOVED
END;                
$$ LANGUAGE plpgsql;
ERROR:  missing expression at or near ";"
LINE 9: RETURN;
              ^
postgres=#创建或替换函数abstime(timeval INTERVAL)
将间隔返回为$$
开始
如果timeval<间隔“00:00:00”,则
返回时间值+间隔“24:00:00”;
其他的
返回时间值;
如果结束;
返回;——应该删除
结束;
$$语言plpgsql;
错误:在“;”处或附近缺少表达式
第9行:返回;
^

第9行的返回值无效,并且缺少一个表达式。您必须删除第9行。在这种情况下,表达式在
RETURN
语句中是必需的。

Pavel在如何修复函数方面是100%正确的,但基于函数代码,并且由于您使用的是Greenplum,我猜您希望针对一个大表选择此内联。执行此操作时,您需要避免PL/pgSQL的开销。这是一种很棒的语言,我经常使用它,但对于内联SQL,我会避免使用它。使用PL/pgSQL封装转换逻辑,而不是内联SQL

其次,我将使函数不可变,因为您不更新函数中的数据库,并且给定参数总是返回相同的值。更多信息请参见:

证明:

CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL)
RETURNS INTERVAL AS $$
BEGIN
IF timeval < INTERVAL '00:00:00' THEN
RETURN timeval + INTERVAL '24:00:00';
ELSE
RETURN timeval;
END IF;
END;
$$ LANGUAGE plpgsql;
现在,将此函数重写为SQL函数并使用IMMUTABLE标志

CREATE OR REPLACE FUNCTION abstime_v2(timeval INTERVAL)
RETURNS INTERVAL AS 
$$
SELECT CASE WHEN $1 < INTERVAL '00:00:00' THEN $1 + INTERVAL '24:00:00' ELSE $1 END;
$$ 
LANGUAGE sql IMMUTABLE;

v2功能所需的扫描和内存更少

Pavel在如何修复函数方面是100%正确的,但基于函数代码,并且由于您使用的是Greenplum,我猜您希望针对一个大表选择此内联。执行此操作时,您需要避免PL/pgSQL的开销。这是一种很棒的语言,我经常使用它,但对于内联SQL,我会避免使用它。使用PL/pgSQL封装转换逻辑,而不是内联SQL

其次,我将使函数不可变,因为您不更新函数中的数据库,并且给定参数总是返回相同的值。更多信息请参见:

证明:

CREATE OR REPLACE FUNCTION abstime(timeval INTERVAL)
RETURNS INTERVAL AS $$
BEGIN
IF timeval < INTERVAL '00:00:00' THEN
RETURN timeval + INTERVAL '24:00:00';
ELSE
RETURN timeval;
END IF;
END;
$$ LANGUAGE plpgsql;
现在,将此函数重写为SQL函数并使用IMMUTABLE标志

CREATE OR REPLACE FUNCTION abstime_v2(timeval INTERVAL)
RETURNS INTERVAL AS 
$$
SELECT CASE WHEN $1 < INTERVAL '00:00:00' THEN $1 + INTERVAL '24:00:00' ELSE $1 END;
$$ 
LANGUAGE sql IMMUTABLE;

v2功能所需的扫描和内存更少

我猜这个错误是在调用函数之后出现的。显示调用。您有多少个
abstime
函数?。实际上,我根本没有调用这个函数,这个错误在我按下
enter
后出现,所以我的
\df
中根本没有函数。我猜调用函数后会出现这个错误。显示该调用。您有多少个
abstime
函数?。实际上,我根本没有调用该函数,在我按下
enter
后出现此错误,因此我的
\df
中根本没有函数。是的,非常感谢。
返回东西是从一个导师那里得到的,我正在使用
greenplum
,它基于
postgresql v8.2
。是的,非常感谢。
返回是从教程中得到的,我使用的是<代码> GrimPrime<代码>,这是基于<代码> PostgreSQL V8.2<代码>。哦,是的,这真的很有用,是的,因为我使用Greenplum,我应该考虑资源的成本。哦,是的,这真的很有帮助,是的,因为我使用Greenplum,我应该考虑资源的成本。