在postgresql数据库中创建存储过程getoperatordetails
。
在另一个存储过程中获取三个参数,但是它会导致错误,避免错误并且会得到结果True(或)False
CREATE OR REPLACE FUNCTION getoperatordetails(value character varying, operator character varying, fieldinputvalue character varying, retvalue boolean)
RETURNS SETOF boolean AS
$BODY$
declare
iVal numeric;
gVal numeric;
begin
IF fieldInputValue != ' ' AND operator!='equal' THEN
gVal := value :: numeric;
iVal := fieldInputValue:: numeric;
IF (operator = ('lesserThan') AND iVal < gVal) THEN
retValue= true;
ELSIF (operator = ('greaterThan') AND iVal > gVal) THEN
retValue= true;
ELSIF (operator = ('lessOrEqual') AND iVal <= gVal) THEN
retValue= true;
ELSIF (operator = ('greaterOrEqual') AND iVal >= gVal) THEN
retValue= true;
ELSIF (operator = ('equal') AND value = (fieldInputValue)) THEN
retValue= true;
ELSE
retValue= false;
END IF;
ELSIF (operator=('equal') AND value=(fieldInputValue)) THEN
retValue= true;
ELSE
retValue= false;
END IF;
return next retValue;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION getoperatordetails(character varying, character varying, character varying, boolean)
OWNER TO postgres;
我需要得到结果True(或)False
错误:AND的参数不得返回一组 第1行:SELECT retValue AND getoperatordetails(value,operator,fiel ...)
答案 0 :(得分:1)
你宣布这个功能是错的。它被声明为“RETURNS SETOF boolean”,什么是废话。可能你会写一个标量函数,所以声明应该是“RETURNS boolean” - 你必须使用“RETURN”而不是“RETURN NEXT”。
第二个问题:你使用C风格的编程 - plpgsql是解释语言,你应该最小化一些指令 - 所以使用辅助值来获得结果并不好 - 你的代码将慢2倍。您可以使用CASE结构而不是嵌套IF - 或者更好,您可以使用只是SQL函数而不是PL / pgSQL函数。
CREATE OR REPLACE FUNCTION foo(op text, a int, b int) RETURNS bool AS $$ SELECT CASE op WHEN '=' THEN a = b WHEN '<' THEN a < b WHEN '>' THEN a > b END; $$ LANGUAGE sql;
就个人而言,看起来你试图创造新的解释语言 - 用解释语言创造解释并不是最好的主意 - 真的。