sql - 存储过程/存储函数 : SELECT in PostgreSQL

标签 sql postgresql plpgsql postgresql-9.1 composite-types

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

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

最佳答案

您需要调整 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 作为列名的重要性。

关于sql - 存储过程/存储函数 : SELECT in PostgreSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14664533/

相关文章:

mysql - 使用 WHERE_IN 子句从具有多个值的字段中进行 SELECT 查询

postgresql - 使用变量作为语句的一部分

sql - 使用大量 if-else 语句和 JSONification 简化 PL/pgSQL 函数

asp.net - 字符支持问题 - 如何将较高的 ASCII 字符转换为较低的 ASCII 字符

php - 检查空白数组时出现什么问题?

c# - 调用存储过程时需要Connection.Open()吗?

sql - 正确查询以获取 PostgreSQL 数据库中的当前连接数

Postgresql 向量搜索根据单词外观

ruby-on-rails-3 - 基于用户偏好的动态表格列

sql - Postgres 列的任意字符串名称