1

我在 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”

我尝试了任何我能想到的解决方案。这里有人知道如何解决这个错误吗?

4

2 回答 2

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 中专门使用不带引号的小写标识符。首先阅读“标识符和关键词”一章,了解"id"、或作为列名的意义。"Id"IDid

于 2013-02-03T22:33:45.213 回答
0

删除字段名称周围的引号(不带“):

  CREATE FUNCTION select_proc2(INT)
  RETURNS SETOF procedure AS
  $DELIMETER$
  SELECT Fname FROM procedure where Id = $1;
  $DELIMETER$
  LANGUAGE 'sql'
于 2013-02-02T17:57:07.160 回答