2011-07-29 138 views
4

我有一个简单的PostgreSQL function..something像下面PostgreSQL的功能不能正常工作

CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' 
BEGIN 
    OPEN $1 FOR 

    SELECT col 
    FROM test 
    WHERE cola = 1; 

    RETURN $1; 
END; 
' LANGUAGE plpgsql; 

的事情是,当我运行下面的SQL,说我得到10行

SELECT col 
    FROM test 
    WHERE cola = 1; 

但当我打电话功能时,我得到0行,后来改变脚本后,我发现以下工作

CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS ' 
BEGIN 
    OPEN $1 FOR 

    SELECT col 
    FROM test  t 
    WHERE t.cola = 1; 

    RETURN $1; 
END; 
' LANGUAGE plpgsql; 

并返回必要的行。

我知道这不是一个严格的SQL问题,但是这是一个众所周知的PostgreSQL问题,或者可能是一个错误?

这里需要注意的一点是,我有很多列名为'可乐'的表,这是原因还是有PostgreSQL配置问题? PostgreSQL的V8.3的

32位Windows版本

回答

1

你的问题是相当模糊的,所以我在黑暗中在这里猜测。你有没有机会在你的函数中有一个叫做“可乐”的变量?当函数级别的变量与列名冲突时,变量优先,最终会导致查询结果完全出乎意料。

解决方法是重命名您的函数中的变量。

这是PL/pgSQL中非常常见的陷阱。 PostgreSQL 9.0和更新版本检测到这种冲突。