Greenplum plpgsql函数在输入结束时返回语法错误
我正在用Greenplum编写一个PL/pgSQL函数,该函数需要将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
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,我应该考虑资源的成本。