Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Function 正在尝试编写PostgreSQL 9.0函数_Function_Postgresql_Plpgsql - Fatal编程技术网

Function 正在尝试编写PostgreSQL 9.0函数

Function 正在尝试编写PostgreSQL 9.0函数,function,postgresql,plpgsql,Function,Postgresql,Plpgsql,我正试图在PostgreSQL 9.0中编写一个函数。这最终将用于一个新的聚合函数,但每次只执行一步。 以下是我到目前为止的情况: 创建或替换函数encstatetext,text返回文本作为$$ 声明 oldstate别名1美元; arg别名为$2; 开始 如果lengtholdstate>0,则 选择“加密”; 否则如果 选择 如果结束; 终止 $$语言sql严格不可变; 我知道我还没有使用$2参数 结果是: ERROR: syntax error at or near "alias" L

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

创建或替换函数encstatetext,text返回文本作为$$ 声明 oldstate别名1美元; arg别名为$2; 开始 如果lengtholdstate>0,则 选择“加密”; 否则如果 选择 如果结束; 终止 $$语言sql严格不可变; 我知道我还没有使用$2参数

结果是:

ERROR:  syntax error at or near "alias"
LINE 3:   oldstate alias for $1;
ERROR:  syntax error at or near "if"
LINE 3:   if length($1)>0 then
当我删除DECLARE块并在正文中将参数引用为$1等时,结果是:

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

据我所知,我所拥有的与web上的示例相匹配,只是我找不到带有if语句的函数示例,所以我不知道我做错了什么。任何帮助都将不胜感激。

我建议将此作为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;
create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;
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;

您也可以像对另一个那样做,但是将sql更改为plpgsql。不过,我的建议是,在SQL函数中可以做的事情通常应该在SQL函数中完成。您将获得更好的性能,计划者可以利用它做更多的工作。

我建议将此作为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;
create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;
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;

您也可以像对另一个那样做,但是将sql更改为plpgsql。不过,我的建议是,在SQL函数中可以做的事情通常应该在SQL函数中完成。您将获得更好的性能,计划者可以利用它做更多的工作。

如果您想要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;
create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;
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;
SQL没有变量或控制结构,因为它不是过程性的,而是声明性的。如果需要程序功能,请使用plpgsql函数:

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

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

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

如果需要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;
create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;
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;
SQL没有变量或控制结构,因为它不是过程性的,而是声明性的。如果需要程序功能,请使用plpgsql函数:

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

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

$$ language sql strict immutable;
create or replace function encstate(text, text) returns text as $$
select case
    when length($1) > 0 then 'Encrypted'
    else ''
    end
;
$$ language sql strict immutable;
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;
SQL PL/pgSQL 要点 表达式lengthx>0 x为纯文本,不包括和NULL。 使用100%等效表达式x。无论函数是否声明为严格函数,都可以更简单、更快地执行相同的操作

如果不需要,就不要使用。它只是为了兼容性和重命名预先确定的参数名。本手册积极劝阻将其用于其他目的。我从不使用它。命名参数自8.1版起可用。越简单越好。 在SQL函数中,可以引用参数名,而不是位置参数$1、$2、。。从PostgreSQL 9.2开始。在这之前命名参数仍然是一个好主意,用于文档

我怀疑您不想声明此函数。正如同义词所暗示的那样,它在任何空输入上返回NULL。看起来你想要一个空字符串。 还有一个性能影响:

SQL PL/pgSQL 要点 表达式lengthx>0 x为纯文本,不包括和NULL。 使用100%等效表达式x。无论函数是否声明为严格函数,都可以更简单、更快地执行相同的操作

如果不需要,就不要使用。它只是为了兼容性和重命名预先确定的参数名。本手册积极劝阻将其用于其他目的。我从不使用它。命名参数自8.1版起可用。越简单越好。 在SQL函数中,可以引用参数名,而不是位置参数$1、$2、。。从PostgreSQL 9.2开始。在这之前命名参数仍然是一个好主意,用于文档

我怀疑您不想声明此函数。正如同义词所暗示的那样,它在任何空输入上返回NULL。看起来你想要一个空字符串。 还有一个性能影响:


您可能在寻找PL/pgSQL函数,而不仅仅是SQL函数。不知道这是否有助于您的实际函数。您是否打算在NULL输入时返回NULL?我怀疑您想要一个空字符串?可能您想要的是PL/pgSQL函数,而不仅仅是SQL函数。在您的示例中,请尝试使用。不知道这是否有助于您的实际函数。您是否打算在NULL输入时返回NULL?我怀疑您想要一个空字符串?在这种情况下,我建议不要将函数设置为严格的,因为查询计划器无法内联严格的函数。除非语义要求严格,否则应该忽略它。@CraigRinger:。但值得一提的是,在这种情况下,严格也会影响结果。在这种情况下,我建议不要对函数进行严格设置,因为查询计划器无法内联严格的函数。除非语义要求严格,否则应该忽略它。@CraigRinger:。但值得一提的是,严格也会影响本案的结果。不止一个人解决了这个问题——最终的关键是最后的语言声明。我坚持使用sql和used case语句。@Nickj:语言声明可以在不同的地方出现。不止一个人解决了这个问题——最后的关键是最后的语言声明。我坚持使用sql和用例语句。@Nickj:Language声明可以
在不同的地方。不使用别名+1。命名参数也可以由应用程序在运行时确定,并按照我们在LSMB中执行操作的方式使用。+1不使用别名。命名参数也可以由应用程序在运行时确定,并使用我们在LSMB中执行操作的方式。