为什么我收到以下错误?:
错误:查询没有结果数据的目的地
这是我的功能:
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')
答案 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
。