【问题标题】:ERROR: column "xxx" does not exist: Postgresql plpgsql stored procedure错误:列“xxx”不存在:Postgresql plpgsql 存储过程
【发布时间】:2013-11-06 23:52:30
【问题描述】:

我写了一个简单的 PG SP 作为概念证明。但是,当我运行 SP 时,我收到一条错误消息。这是架构和 SP 的 SQL:

CREATE TABLE foobar
(
    forename    VARCHAR(255),
    surname     VARCHAR(32),
    enrolement_ts   TIMESTAMP,
    age     SMALLINT,
    major       VARCHAR(32),
    user_id     INTEGER
);


CREATE OR REPLACE FUNCTION insert_foobar (
       forename         VARCHAR(255),
       surname          VARCHAR(32),
       age      SMALLINT,
       major        VARCHAR(32) ) RETURNS VOID AS $$
    INSERT INTO foobar VALUES (forename, surname, getdate(), age, major, user_id());
$$ LANGUAGE sql;

在命令行输入函数定义时,出现如下错误:

ERROR:  column "forename" does not exist
LINE 6:     INSERT INTO foobar VALUES (forename, surname,...
                                           ^

任何人都可以发现/解释导致此错误的原因吗?显然,表架构中存在列名,所以我不明白错误消息。

【问题讨论】:

  • 顺便说一句,Postgres 没有“存储过程”,只有“函数”。这似乎是一个迂腐的评论,但关键的区别在于函数只能返回一些东西,而不是像其他一些 DBMS 中的存储过程那样将其作为结果集输出。
  • 有趣的是,它似乎在 Postgres 9.2 下按预期工作,如 shown in this SQLFiddle demo,所以无论发生什么都可能被认为是一个错误并在某个时候修复。

标签: postgresql stored-procedures


【解决方案1】:

在 PostgreSQL 9.2 之前,用纯 SQL(而不是诸如 pl/pgSQL 之类的过程语言)编写的函数的参数不能通过它们的名称来引用命名参数,即使函数签名可以包含它们(“出于文档目的")。

current manual page on SQL functions 包含此注释:

注意:在 PostgreSQL 9.2 中添加了使用名称来引用 SQL 函数参数的功能。要在旧服务器中使用的函数必须使用 $n 表示法。

因此,要使用 9.2 之前的版本,您的函数需要如下所示:

CREATE OR REPLACE FUNCTION insert_foobar (
       forename         VARCHAR(255),
       surname          VARCHAR(32),
       age      SMALLINT,
       major        VARCHAR(32) ) RETURNS VOID AS $$
    INSERT INTO foobar VALUES ($1, $2, getdate(), $3, $4, user_id());
$$ LANGUAGE sql;

(我假设 getdate()user_id() 是围绕 now() 和用户 ID 所需的任何逻辑的本地定义函数。)

【讨论】:

  • +1 用于仔细解释错误发生的原因。仅依靠生成的错误消息,我永远无法弄清楚这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-29
  • 1970-01-01
相关资源
最近更新 更多