1

getoperatordetails在 postgresql 数据库中创建存储过程。

在另一个存储过程中获取三个参数,但它会导致错误,避免错误并将得到结果 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...)

4

1 回答 1

1

你在声明这个函数时是错误的。它被声明为“RETURNS SETOF boolean”,这是胡说八道。可能你会写一个标量函数,所以声明应该是“RETURNS boolean”——你必须使用“RETURN”而不是“RETURN NEXT”。

第二个问题:您使用 C 风格的编程 - plpgsql 是解释性语言,您应该尽量减少指令数量 - 因此使用辅助值作为结果并不好 - 您的代码将慢 2 倍。您可以使用 CASE 构造代替嵌套的 IF - 或者更好的是,您可以使用仅 SQL 函数而不是 PL/pgSQL 函数。

创建或替换函数 foo(op text, a int, b int)
返回布尔值 $$
选择案例操作
         当'='然后a = b
         当 '<' 那么 a < b
         当 '>' 那么 a > b
       结尾;       
$$ 语言 sql;

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

于 2013-08-02T07:07:29.767 回答