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
PostgreSQL-错误:查询没有结果数据的目标_Sql_Postgresql - Fatal编程技术网

PostgreSQL-错误:查询没有结果数据的目标

PostgreSQL-错误:查询没有结果数据的目标,sql,postgresql,Sql,Postgresql,为什么会出现以下错误?: 错误:查询没有结果数据的目标 这是我的职责: CREATE OR REPLACE FUNCTION public.SumASCII( value character varying) RETURNS int LANGUAGE 'plpgsql' COST 100.0 VOLATILE NOT LEAKPROOF AS $function$ DECLARE finalResult int; DECLARE tem

为什么会出现以下错误?:

错误:查询没有结果数据的目标

这是我的职责:

CREATE OR REPLACE FUNCTION public.SumASCII(
    value character varying)
    RETURNS int
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $function$

    DECLARE finalResult int;
    DECLARE tempChar character;
    DECLARE valueLength int;
    DECLARE tempResult int;

    BEGIN
        SELECT LENGTH(value) INTO valueLength;
        SELECT finalResult = 0;
        SELECT tempResult = 0;

        DO
        $do$
        BEGIN 
        FOR i IN 1..valueLength LOOP
           SELECT SUBSTRING(value, i, 1) INTO tempChar;
           SELECT ASCII(tempChar) INTO tempResult;
           SELECT finalResult += tempResult;
        END LOOP;
        END
        $do$;

        RETURN finalResult;
    END;

$function$;
CREATE OR REPLACE FUNCTION public.sumascii(varchar)
RETURNS bigint AS $$
  SELECT sum(ascii(c)) FROM regexp_split_to_table($1,'') g(c);
$$ LANGUAGE SQL IMMUTABLE;
我看过其他有同样错误的问题,但它们似乎与我的问题无关。我相信答案很简单,但我就是看不出这里有什么问题。。我声明了一个int,并返回了一个int

按如下方式调用函数:

SELECT SumASCII('abc')

通过大量简化,我可以使它工作。我相信
DECLARE
只需要使用一次(示例在),我不确定您试图用
do
END
块做什么,但我只是取出了它

CREATE OR REPLACE FUNCTION public.SumASCII(
    value character varying)
    RETURNS int
    LANGUAGE 'plpgsql'
    COST 100.0
    VOLATILE NOT LEAKPROOF 
AS $function$

DECLARE
    finalResult int := 0;
BEGIN
    FOR i IN 1..LENGTH(value) LOOP
       finalResult := finalResult + ASCII(SUBSTRING(value, i, 1));
    END LOOP;
    RETURN finalResult;
END;
$function$;

SELECT SumASCII('abc')
正在返回
294

在PLpgSQL中Fortran样式是错误样式-任何表达式都是
SELECT
。嵌入的
越多,选择的
s越慢。simple one SQL可以完成的事情应该由simple SQL完成(在100%的情况下不是这样(可能取决于单个表达式)-例如@mike.k代码比my快3倍:循环中只有一个简单表达式,我的代码有一个通用查询和非常慢的regexpr函数):

SQL(以及PostgreSQL)中的标识符不区分大小写,因此不适合使用驼峰符号


当函数的结果在时间上是不可变的(对于给定的参数),那么该函数应该标记为
不可变

,在plpgsql中使用DO语句是无意义的。更新的使用SELECT而不是assign语句
:=
。选择是完全不必要的:语言名称是一个标识符,它不应该用单引号引起来:
语言plpgsql
是正确的(只接受单引号是为了向后兼容)@a_horse_没有名称,好眼力。我跳过了创建部分,选择了主体。