2013-02-02 56 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作为列名的重要性。