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 に答える