PostgreSQL数据库存储过程

时间:2013-08-02 05:40:11

标签: postgresql

在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 ...)

1 个答案:

答案 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;

就个人而言,看起来你试图创造新的解释语言 - 用解释语言创造解释并不是最好的主意 - 真的。