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

时间:2017-02-10 00:51:10

标签: 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 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$;

我已经查看了同样错误的其他问题,但它们似乎与我的问题无关。我确定答案很简单,但我似乎无法看到问题在这里......我宣布一个int并且我正在返回一个int ..

按如下方式调用该函数:

SELECT SumASCII('abc')

2 个答案:

答案 0 :(得分:1)

我能够通过简化很多工作来实现它。我相信DECLARE只需要使用一次(https://www.postgresql.org/docs/9.6/static/plpgsql-declarations.html处的示例),而且我不确定您尝试使用DO ... {{1阻止,但我把它拿出来。

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')

答案 1 :(得分:1)

Fortran风格是PLpgSQL中的风格是坏风格 - 任何表达式都是SELECT。更多嵌入式SELECT,更慢。简单的一个SQL可以做什么应该通过简单的SQL来完成(在100%的情况下不是这样(可以取决于个别表达式) - 例如@ mike.k代码比我快3倍:只有一个简单的表达式在循环中,我的代码有一个通用查询和非常慢的regexpr函数):

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;

SQL中的标识符(以及PostgreSQL)也不区分大小写,因此使用驼峰表示法并不好。

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