我写了一个简单的PG SP作为概念证明。但是,当我运行SP时,我收到错误消息。这是架构的SQL和SP:
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,...
^
有人可以发现/解释导致此错误的原因吗?显然,列forename存在于表模式中,因此我不理解错误消息。
答案 0 :(得分:5)
在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需要任何逻辑。)