2011-07-29 135 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和更新版本檢測到這種衝突。