PostgreSQL问题与函数中的命名参数

时间:2009-11-30 00:48:10

标签: sql postgresql stored-procedures plpgsql

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,没有运气。想法?

3 个答案:

答案 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...

他说的也是:用_或类似的前缀加上你的所有变量名。