存储过程/存储函数:PostgreSQL 中的 SELECT
Posted
技术标签:
【中文标题】存储过程/存储函数:PostgreSQL 中的 SELECT【英文标题】:Stored Procedure / Stored Function: SELECT in PostgreSQL 【发布时间】:2013-02-02 17:34:19 【问题描述】:我在 PostgreSQL 中使用简单的 SELECT 创建了一个存储过程/函数:
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'
它返回一个错误:
错误:声明为返回过程的函数中的返回类型不匹配 详细信息:最终语句返回字符而不是整数 第 1 列. 上下文:SQL 函数“select_proc2”我尝试了任何我能想到的解决方案。这里有人知道如何解决这个错误吗?
【问题讨论】:
从您的表定义中,我们将能够看到您是否实际上使用双引号 CamelCase ("Id", "Fname") 命名了该列,或者您需要删除双引号。跨度> 【参考方案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"
、ID
或id
作为列名的意义。
【讨论】:
【参考方案2】:删除字段名称周围的引号(不带“):
CREATE FUNCTION select_proc2(INT)
RETURNS SETOF procedure AS
$DELIMETER$
SELECT Fname FROM procedure where Id = $1;
$DELIMETER$
LANGUAGE 'sql'
【讨论】:
我试过但它显示错误 ERROR: column "fname" does not exist LINE 4: SELECT Fname FROM procedure where Id = $1; 好吧,那么你必须提供表格描述 表格描述?..你能给我一个例子吗? 建议可能有帮助,也可能没有帮助,没有指出实际(明显)错误。 不要引用语言名称,应该是sql
,而不是'sql'
。以上是关于存储过程/存储函数:PostgreSQL 中的 SELECT的主要内容,如果未能解决你的问题,请参考以下文章