2011-08-10 14 views
5

私はPostgreSQLに2種類のストアドプロシージャを記述しようとしています。 Postgreは機能しか持っていないと私は理解しています。誰かが自分のコードを見て指針を提示できるかどうか疑問に思っていました。また、スペーシング/新しいコマンド行の有無に慣れていません。PostgreSQLストアドプロシージャ(関数)の正しい構文は何ですか?

最初の関数は、ユーザーからの入力を受け取り、それをテーブルに追加する必要があります。 属性 "model"と "year"を持つテーブル名 "Car"があるとします。 新しい車をテーブルに追加するには、これは正しいストアドファンクションですか?

CREATE OR REPLACE FUNCTION 
    addto_car(model IN Car.model%type, year IN Car.year%type) 
RETURNS 
    void 
AS $$ 
BEGIN 
    INSERT INTO Car VALUES(model, year); 
END; 
$$ LANGUAGE plpgsql; (#Is this correct? I'm using postgresql 9) 

----------進行コードで仕事 機能1

CREATE OR REPLACE FUNCTION 
    addto_car(In model Car.model%type, IN year Car.year%type) 
AS $$ 
BEGIN 
    INSERT INTO Car VALUES(model, year); 
END; 
$$ LANGUAGE plpgsql; 

これが機能するようになりました! (モデルと年をCarに挿入します)。

+2

あなたの引用符は一致しません。あなたは '&&'で始まり、 '$$ 'で終わります。 '&&'は無効な引用符の区切り文字で始まると確信しています。関数本体を '$$'や '$ SOMETHING $'で開始して終了する必要があります。 – SingleNegationElimination

+0

ああ、okが編集されました。ありがとう。 – tvguide1234

答えて

5

Official Documentation

CREATE [ OR REPLACE ] FUNCTION 
    name ([ [ argmode ] [ argname ] argtype [ { DEFAULT | = } default_expr ] [, ...] ]) 
    [ RETURNS rettype 
     | RETURNS TABLE (column_name column_type [, ...]) ] 
    { LANGUAGE lang_name 
    | WINDOW 
    | IMMUTABLE | STABLE | VOLATILE 
    | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT 
    | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER 
    | COST execution_cost 
    | ROWS result_rows 
    | SET configuration_parameter { TO value | = value | FROM CURRENT } 
    | AS 'definition' 
    | AS 'obj_file', 'link_symbol' 
    } ... 
    [ WITH (attribute [, ...]) ] 

から、あなたはそこにあなたの答えを見つけると、多分、プロセス上の二、三有益な事を学びます。

特にRETURNS TABLE構成に興味があるかもしれません。

+0

Hmm私はすべてのコマンドを理解するのが難しいです。最初の関数を見てみましょう。 'argtype'の場合は、ユーザーが入力した値をデータベースに入力したいので、 'IN'を入力する必要がありますか? '(年Car.year%のタイプでモデルCar.model%のタイプでは、)のfuction addto_carをCREATE OR REPLACE RETURNS 無効 AS $$ は INSERT INTOカーVALUES(モデル、年を)BEGIN; END; $$ LANGUAGE plpgsql; ' – tvguide1234

+0

必ずしもテーブルを返す必要はありません。新しいタプルを挿入して、" RETURN TABLE "または" VOID RETURN "を使用するかどうかわかりません。 – tvguide1234

+1

Donそして、 'RETURN'を使ってください。あなたが問題を理解している文書(それは理解できる)を持っているなら、例を見てください。それらのうちのいくつかは 'RETURN'節も持っていません。 –