2013-02-02 88 views
0

我已經在PostgreSQL中創建一個存儲過程/函數用一個簡單的SELECT:存儲過程/存儲功能:選擇PostgreSQL的

CREATE FUNCTION select_proc2() 
RETURNS SETOF procedure AS 
$DELIMETER$ 
SELECT * FROM procedure; 
$DELIMETER$ 
LANGUAGE 'sql' 

這一個工作,但是當我試圖將具體是這樣的:

CREATE FUNCTION select_proc2(INT) 
RETURNS SETOF procedure AS 
$DELIMETER$ 
SELECT "Fname" FROM procedure where "Id" = $1; 
$DELIMETER$ 
LANGUAGE 'sql' 

它返回一個錯誤:

 
ERROR: return type mismatch in function declared to return procedure 
DETAIL: Final statement returns character instead of integer at 
column 1. CONTEXT: SQL function "select_proc2" 

我想,我能想到的任何解決方案。這裏的任何人都知道如何解決這個錯誤?

+0

從您的表格定義中,我們將能夠看到您是否實際使用雙引號CamelCase(「Id」,「Fname」)命名該列,或者您需要刪除雙引號。 –

回答

0

周圍字段名刪除引號(無「):

CREATE FUNCTION select_proc2(INT) 
    RETURNS SETOF procedure AS 
    $DELIMETER$ 
    SELECT Fname FROM procedure where Id = $1; 
    $DELIMETER$ 
    LANGUAGE 'sql' 
+0

我試過但顯示錯誤 錯誤:列「fname」不存在 行4:選擇Fname FROM過程其中Id = $ 1; – user2035657

+0

好,那麼你必須提供表格說明 – kofemann

+0

表格說明?..你能舉個例子嗎? – user2035657

1

您需要的RETURN類型適應什麼實際返回:

CREATE OR REPLACE FUNCTION select_proc2(int) 
    RETURNS SETOF text AS 
$func$ 
SELECT "Fname" FROM procedure WHERE "Id" = $1; 
$func$ LANGUAGE sql 

在你的第二個版本,你只返回一列。從名稱我得到的數據類型text,但這只是一個猜測。

如果"Id"是主鍵列procedure或以其他方式定義UNIQUE,可以返回只有一行,您可以簡化爲:

RETURNS text 

也不要引用語言名稱。 sql這裏是一個標識符,而不是字符串文字。它只能容忍歷史原因,但它可能會在未來的版本中出現錯誤。

關於你的列名:我的建議是在Postgres中專門使用非引號的小寫標識符。首先閱讀"Identifiers and Key Words"一章,以瞭解"id","Id",IDid作爲列名的重要性。