试图编写PostgreSQL 9.0函数

时间:2013-03-13 10:37:04

标签: function postgresql plpgsql

我正在尝试在PostgreSQL 9.0中编写一个函数。这将最终用于新的聚合函数,但一次只能使用一步。 以下是我到目前为止的情况:

create or replace function encstate(text,text) returns text as $$
DECLARE
  oldstate alias for $1;
  arg alias for $2;
BEGIN
IF length(oldstate)>0 then
  select 'Encrypted';
else if
  select '';
end if;
END; 
$$ language sql strict immutable;

(我知道我还没有使用$ 2参数。)

结果是:

ERROR:  syntax error at or near "alias"
LINE 3:   oldstate alias for $1;

当我删除DECLARE块并在体内引用$ 1等参数时,结果为:

ERROR:  syntax error at or near "if"
LINE 3:   if length($1)>0 then

据我所知,我在网上找到了匹配的例子,除了我找不到带有if语句的函数的例子,所以我不知道我做错了什么。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我建议将其作为SQL函数执行:

create or replace function encstate(text,text) returns text as $$

SELECT CASE WHEN length($1)>0 then 'Encrypted' ELSE '' END;

$$ language sql strict immutable;

您也可以使用其他方法执行操作,但将sql更改为plpgsql。我的建议是,你可以在一个SQL函数中做什么,你应该通常在一个。您将获得更好的性能,规划人员可以使用它做更多的事情。

答案 1 :(得分:1)

如果你想要一个SQL函数:

create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;

SQL没有变量或控制结构,因为它不是程序性的,它是声明性的。如果你想要程序功能,那么使用plpgsql函数:

create or replace function encstate(text, text) returns text as $$
DECLARE
    oldstate alias for $1;
    arg alias for $2;
BEGIN
    IF length(oldstate) > 0 then
        return 'Encrypted';
    else
        return '';
    end if;
END; 
$$ language plpgsql strict immutable;

答案 2 :(得分:1)

SQL

CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
  RETURNS text LANGUAGE SQL IMMUTABLE AS
$func$
SELECT CASE WHEN $1 <> '' THEN 'Encrypted' ELSE '' END
$func$

PL / pgSQL的

CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
  RETURNS text LANGUAGE plpgsql IMMUTABLE AS
$func$
BEGIN
    IF oldstat <> '' THEN
      RETURN 'Encrypted';
    ELSE
      RETURN '';
    END IF;
END 
$func$;

重点

  • 表达式length(x) > 0xtext)仅排除''NULL。 使用100%等效表达式x <> ''。无论函数是否声明为STRICT,都会更简单,更快捷。

  • 如果您不需要,请不要使用plpgsql ALIAS。它仅用于兼容性和重命名预定义的参数名称。该手册积极阻止其用于其他目的。我从不使用它。自8.1版起,命名参数可用。更简单,更好 在SQL函数中,您可以引用参数名称(而不是位置参数($1$2,..),因为PostgreSQL 9.2。在此之前,为文档命名参数仍然是一个好主意。< / p>

  • 怀疑你做想宣布这个函数STRICT (synonym: RETURNS NULL ON NULL INPUT)。与同义词暗示一样,它会在(任意)NULL输入上返回NULL。好像你想要一个空字符串('')。 还有表现意义:
    Function executes faster without STRICT modifier?