存储过程/存储功能:PostgreSQL中的SELECT

时间:2013-02-02 17:34:20

标签: sql postgresql plpgsql postgresql-9.1 compositetype

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

它会返回错误:

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"

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

2 个答案:

答案 0 :(得分: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作为列名的重要性。

答案 1 :(得分:0)

删除字段名称旁边的引号(不带“):

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