1

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

4

3 回答 3

3

INSERT您的参数与;中的列同名 PL/pgSQL 错误地用参数替换两组标识符(列和值),最终导致INSERT您在错误中看到的荒谬。

请参阅此页面上的“警告”部分以获取官方用词 - 但本质上您需要更改参数名称。

于 2009-11-30T01:00:13.580 回答
1

此行为将在 PostgreSQL 9.0 中更改。

a) PostgreSQL 9.0 更智能,只在正确的地方应用变量

b) 优先级是可选的 - 像 PostgreSQL、像 Oracle 或引发异常

对于旧版本,使用集成 SQL 的每个函数中的所有局部变量和参数都使用前缀。

于 2009-11-30T06:28:35.557 回答
0

name是 PostgreSQL 中的保留关键字。

将其更改为INSERT INTO customers ("name", etc etc...

还有他所说的:在所有变量名前加上 a_或类似名称。

于 2009-11-30T01:02:26.303 回答