2012-04-24 5 views
0

PostgreSQL(バージョン9)データベースにサードパーティ製の製品でテーブルを作成していて、そのテーブルを変更して新しいテーブルを追加する必要がありますその列を標準値に設定します。しかし、私はそれがtotal_scoreフィールドが存在することを知らないため、これを行うことは許されないよ既存のテーブルに列を追加して単一のPostgreSQL関数で使用する方法

CREATE FUNCTION alterscorecolumns() 
    RETURNS void AS 
$BODY$ 

ALTER TABLE "hi_scores" ADD "total_score" integer; 

UPDATE "hi_scores" SET total_score = score1+score2+score3; 

$BODY$ 

は、私は私の関数の中で次のよう持っています。メッセージを受け取ったばかりですERROR: column "total_score" of relation "hi_scores" does not exist.

これは実行計画に関連する理由があると思いますが、アップデートを実行する前にALTER TABLEを実行するように指示する必要があるかもしれませんが、私が何をする必要があるのか​​理解する。

答えて

0

あなたはそのように行うことはできません。関数内のSQLは、その関数を作成するときに解析されます。関数の作成時には列は存在しないので、エラーメッセージが表示されます。

動的SQLを使用してUPDATE文を実行する必要があります。

ような何か:

CREATE FUNCTION alterscorecolumns() 
    RETURNS void AS 
$BODY$ 
begin 
    execute 'ALTER TABLE hi_scores ADD total_score integer'; 
    execute 'UPDATE hi_scores SET total_score = score1+score2+score3'; 
$BODY$ 
language plpgsql; 

(テストなので、そこに構文エラーがあるかもしれません)、既に提供

+0

ありがとう、これは私が知る必要があったものです。最後に、私は2つの関数にプロセスを分割しました(私は "ALTER TABLE"関数を実行した後に "UPDATE"を作成しなければなりませんでした)ので、コミットされている関数を変更すると、私が更新を実行するために1つ。 – glenatron

0

ただ、このようなあなたの文にDEFAULTを追加します。

ALTER TABLE "hi_scores" ADD "total_score" integer DEFAULT 0; 
+0

ご意見ありがとうございます。私は試しましたが、エラーメッセージは変更されません。 – glenatron

+0

ああ、実際にはそれがあるかもしれません。 – glenatron

+0

いいえ、同じエラーメッセージです。 – glenatron

0

@mu:あなたは関数として、この手順を保存したい場合は、あなたがする必要がありますEXECUTEで動的SQLを使用してください。しかし、UPDATEの場合のみ。 ALTER TABLEステートメントは正常に機能します。

これは明らかに1回の操作(同じ列を2回追加することはできません)として、目的のために機能を維持することはほとんど意味がありません。

DO 
$BODY$ 
BEGIN 
    ALTER TABLE hi_scores ADD total_score integer; 
    EXECUTE 'UPDATE hi_scores SET total_score = score1+score2+score3'; 
END; 
$BODY$; 

しかし、その後、再び、それをシンプルに保つ:あなたは代わりに DOステートメントを使用することができますちょうど2つのSQL文を実行します。 ALTER TABLEが完了すると、 UPDATEは正常に動作します。トランザクション内かどうかは問題ではありませんが、順序通りに実行してください。

+0

私は一般的には同意しますが、私が日常的に作業しているソフトウェアがゼロからテーブルを落として再作成するため、ここに関数を持つと便利です。これはその再作成のフォローアップの一部なので、テーブル作成ごとに1回だけ実行する必要がありますが、それはスケジュールされたイベントです。 – glenatron

+0

@glenatron:なぜ単純なSQLコマンドをスケジュールしないのですか? –

+0

私は同じツールのインターフェイスを使って作業しているので、ポストグルで関数を呼び出すことはできますが、アドホッククエリを実行することはできません。 – glenatron

関連する問題