2009-11-30 74 views
1

Linux上的PostgreSQL 8.4。我有一個函數:PostgreSQL問題與函數中的命名參數

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

您的參數與INSERT中的列名稱相同; PL/pgSQL不正確地用參數代替兩個標識符(列和值)集合,最後是在錯誤中看到的無意義的INSERT

查看注意事項關於this page的部分用於官方字 - 但基本上,您需要更改參數名稱。

+0

這解決了我的問題。那味道有點不妙? Oracle或SQL Server都沒有這種格式的問題。非常感謝SimonJ! – Craig 2009-11-30 01:17:40

+0

我不確定他們是否認爲它是一個錯誤,因爲在文檔中討論了多少討論主題。如果沒有其他的東西,它鼓勵通過強制非重疊名稱的良好做法! – SimonJ 2009-11-30 01:35:00

+0

哦,並且很可能與Oracle有類似的(但也許更微妙的)混亂 - 我曾經看到無辜的'SELECT'查詢在有人引入了與列名稱相同的本地變量時突然中斷,或者反之亦然... – SimonJ 2009-11-30 01:38:19

0

name是PostgreSQL中的保留關鍵字。

將其更改爲INSERT INTO customers ("name", etc etc...

而且他說的話:在前面加上所有與_或類似的變量名。

1

此行爲將在PostgreSQL 9.0中更改。

一)PostgreSQL的9.0是更聰明,只是在正確的地方

B)的優先級是可選的應用變量 - 如PostgreSQL,如Oracle或引發異常

對於舊版本使用前綴爲所有本地變量集成SQL的每個函數中的參數。