【问题标题】:Syntax Error creating function in SQL for Postgres 9 database在 SQL 中为 Postgres 9 数据库创建函数时出现语法错误
【发布时间】:2017-10-17 22:27:51
【问题描述】:

我正在尝试在 postgres_9 数据库中创建以下函数:

CREATE OR REPLACE FUNCTION getUser(IN user_id INT8)
RETURNS TABLE(id INT8, nom TEXT, prenom TEXT)
AS $$
    BEGIN
        SELECT id, nom, prenom 
        FROM security.users
        WHERE id = user_id
    END
$$ LANGUAGE sql;

但我收到以下错误:

ERROR: syntax error at or near "SELECT"

PS:我是 Postgres 数据库的新手。 如果您有关于如何在 plpgsql 或 SQL 中为 Postgres 数据库创建函数和触发器的教程和书籍的良好资源,那就太好了!

【问题讨论】:

  • 删除BEGINEND
  • 谢谢!!但现在我有一个新错误:ERROR: column "user_id" does not exist
  • 这个函数怎么调用?
  • 您为什么使用过时且不受支持的 Postgres 版本?
  • 我应该使用什么版本?

标签: sql postgresql relational-database plpgsql postgresql-9.1


【解决方案1】:

您能否按照Postgresql 9.1 Create Function 中的建议尝试这种方法

CREATE FUNCTION getUser(int)
RETURNS TABLE(id int, nom text, prenom text)
AS $$ SELECT id, nom, prenom 
      FROM security.users
      WHERE id = $1 $$
LANGUAGE SQL;

【讨论】:

  • 现在我得到ERROR: syntax error at or near "SELECT"
【解决方案2】:

PostgreSQL 有两种存储过程(函数)的默认语言:PLpgSQL 和 SQL。 SQL 是原始 SQL。 PLpgSQL 是具有块结构的基于 ADA 的过程语言 - 块由关键字 BEGIN、END 定义。您可以用这两种语言编写函数。您应该正确指定语言。

CREATE OR REPLACE FUNCTION getUser(IN user_id INT8)
RETURNS TABLE(id INT8, nom TEXT, prenom TEXT)
AS $$
BEGIN
  RETURN QUERY SELECT id, nom, prenom 
                 FROM security.users
                 WHERE id = user_id;
END
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION getUser(IN user_id INT8)
RETURNS TABLE(id INT8, nom TEXT, prenom TEXT)
AS $$
   SELECT id, nom, prenom 
     FROM security.users
    WHERE id = $1 
$$ LANGUAGE sql;

9.1 的 SQL 语言不支持命名参数,所以你应该使用 $1, $2, ... 作为参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2022-12-31
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多