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

有帮助吗?

解决方案

您的参数与 INSERT 中的列具有相同的名称; PL / pgSQL错误地用参数替换两个标识符集(列和值),最后是错误中看到的无意义的 INSERT

请参阅此内容的警告部分官方单词的页面 - 但基本上你需要更改参数名称。

其他提示

此行为将在PostgreSQL 9.0中更改。

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

b)优先级是可选的 - 比如PostgreSQL,如Oracle或引发异常

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

name 是PostgreSQL中的保留关键字。

将其更改为 INSERT INTO客户(“名称”等等......

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top