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

Hom*_*lli 3 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
);


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;
Run Code Online (Sandbox Code Playgroud)

当我在命令行输入函数定义时,我收到以下错误:

ERROR:  column "forename" does not exist
LINE 6:     INSERT INTO foobar VALUES (forename, surname,...
                                           ^
Run Code Online (Sandbox Code Playgroud)

任何人都可以发现/解释导致此错误的原因吗?显然,列forename存在于表模式中,因此我不理解错误消息.

IMS*_*SoP 5

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

SQL函数当前手册页包括以下注释:

注意: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;
Run Code Online (Sandbox Code Playgroud)

(我假设getdate()并且user_id()是本地定义的函数,now()并且用户ID需要任何逻辑.)