错误:列";xxx“;不存在:Postgresql plpgsql存储过程

错误:列";xxx“;不存在:Postgresql plpgsql存储过程,postgresql,stored-procedures,Postgresql,Stored Procedures,我写了一个简单的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 ); CREAT

我写了一个简单的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,...
                                           ^

有人能找出/解释是什么导致了这个错误吗?。显然,表架构中存在列名,因此我不理解错误消息。

在PostgreSQL 9.2之前,纯SQL(而不是pl/pgSQL等过程语言)编写的函数的参数不能按名称引用命名参数,即使函数签名可能包含这些参数(“为文件目的”)

本说明包括:

注意: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\u id()
是围绕
now()
和用户id所需的任何逻辑的本地定义的函数。)

另外,Postgres没有“存储过程”,只有“函数”“。这似乎是一个迂腐的评论,但关键的区别在于,函数只能返回某些内容,而不能像存储过程在其他一些DBMS中那样作为结果集输出。有趣的是,它似乎在Postgres 9.2下按预期工作,因此,无论发生什么,都可能被认为是一个bug,并在某一点上得到修复。+1用于仔细解释错误发生的原因。如果仅仅依靠生成的错误消息,我永远也不会明白这一点。