Linux上的PostgreSQL 8.4。我有一个功能:
CREATE OR REPLACE FUNCTION production.add_customer (
name varchar(100),
email_address varchar(300),
street_address text,
city varchar(50),
state varchar(2),
zip varchar(10),
secret1 bytea,
secret2 bytea,
secret3 bytea,
secret4 bytea,
referrer text)
RETURNS integer as $$
BEGIN
INSERT INTO customers (name, email_address, street_address, city, state, zip, secret1, secret2, secret3, secret4, create_date, referrer) VALUES
(name, email_address, street_address, city, state, zip, create_date, referrer
pgp_sym_encrypt(secret1, 'reallylongrandomstring'),
pgp_sym_encrypt(secret2, 'reallylongrandomstring'),
pgp_sym_encrypt(secret3, 'reallylongrandomstring'),
pgp_sym_encrypt(secret4, 'reallylongrandomstring'),
current_timestamp, referrer);
RETURNING customer_id;
END;
$$ LANGUAGE plpgsql;
当我尝试创建它时会返回此错误:
ERROR: syntax error at or near "$1"
LINE 1: INSERT INTO customers ( $1 , $2 , $3 , $4 , $5 , $6 , ...
^
QUERY: INSERT INTO customers ( $1 , $2 , $3 , $4 , $5 , $6 , $7 , $8 , $9 , $10 , create_date, $11 ) VALUES ( $1 , $2 , $3 , $4 , $5 , $6 , create_date, $11 pgp_sym_encrypt( $7 , 'reallylongrandomstring'), pgp_sym_encrypt( $8 , 'reallylongrandomstring'), pgp_sym_encrypt( $9 , 'reallylongrandomstring'), pgp_sym_encrypt( $10 , 'reallylongrandomstring'), current_timestamp, $11 )
CONTEXT: SQL statement in PL/PgSQL function "add_customer" near line 8
myserver=#
我试过ALIAS FOR
,没有运气。想法?
答案 0 :(得分:3)
您的参数与INSERT
中的列名相同; PL / pgSQL错误地将两个标识符集(列和值)替换为参数,最后是您在错误中看到的无意义的INSERT
。
请参阅this page上的警告部分获取官方字词 - 但基本上您需要更改参数名称。
答案 1 :(得分:1)
此行为将在PostgreSQL 9.0中更改。
a)PostgreSQL 9.0更智能,只在正确的位置应用变量
b)优先级是可选的 - 如PostgreSQL,如Oracle或引发异常
对于旧版本,使用带有集成SQL的每个函数中的所有局部变量和参数的前缀。
答案 2 :(得分:0)
name
是PostgreSQL中的保留关键字。
将其更改为INSERT INTO customers ("name", etc etc...
他说的也是:用_
或类似的前缀加上你的所有变量名。