5

私は plpgsql 関数を持っています:

CREATE OR REPLACE FUNCTION test() RETURNS VOID AS
$$
DECLARE
    my_row my_table%ROWTYPE;
BEGIN
    SELECT * INTO my_row FROM my_table WHERE id='1';
    my_row.date := now();
END;
$$ LANGUAGE plpgsql;

my_rowレコードを直接更新できるかどうか知りたいです。

私が今それを行うことがわかった唯一の方法は次のとおりです。

UPDATE my_table SET date=now() WHERE id='1';

これは関数の例にすぎないことに注意してください。実際の関数はこれよりもはるかに複雑です。

PostgreSQL 9.2 を使用しています。

アップデート:

混乱して申し訳ありませんが、私が言いたかったことは次のとおりです。

SELECT * INTO my_row FROM my_table INTO my_row WHERE id='1';
make_lots_of_complicated_modifications_to(my_row, other_complex_parameters);
UPDATE my_row;

つまり、 my_rowを使用して、基礎となるテーブルの情報を永続化します。更新するパラメータがたくさんあります。

4

4 に答える 4

7

「my_row」レコードを直接更新できるかどうか知りたいです。

です。
plpgsql で行またはレコード型の列を更新できます - あなたが持っているのと同じように。明らかに機能しているはずですか?

もちろん、これは変数ではなく、基になるテーブルを更新します!

UPDATE my_table SET date=now() WHERE id='1';

ここで2つのことを混同しています...


コメントでの説明への回答

UPDATE行全体を処理できる構文が PostgreSQL にあるとは思いません。UPDATEただし、 column listは可能です。このデモを考えてみましょう:

列名thedateの代わりに使用する方法に注意してください。これは、すべての SQL 標準の予約語であり、PostgreSQL の型名です。datedate

CREATE TEMP TABLE my_table (id serial, thedate date);
INSERT INTO my_table(thedate) VALUES (now());

CREATE OR REPLACE FUNCTION test_up()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 5 ;

   UPDATE my_table t
    -- explicit list of columns to be to updated
   SET   (id, thedate) = (_r.id, _r.thedate)
   WHERE  t.id = 1;
END
$func$;

SELECT test_up();
SELECT * FROM my_table;

ただし、INSERT行全体を簡単に作成できます。テーブルの列リストを提供しないでください (通常は提供する必要がありますが、この場合は提供しなくても問題ありません)。

anUPDATEは内部的に a のDELETE後にとにかくが続きINSERT、関数はトランザクション内のすべてを自動的にカプセル化するため、代わりにこれを使用できない理由がわかりません。

CREATE OR REPLACE FUNCTION x.test_ delins()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r
   FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 10;

   DELETE FROM my_table t WHERE t.id = 1;
   INSERT INTO my_table SELECT _r.*;
END
$func$;
于 2012-09-21T11:18:02.117 に答える
1

Postgresql は update で行を設定していません。行全体を更新しない場合は、各列に個別に値を割り当てる必要があります

于 2021-12-05T16:23:08.377 に答える
0

はい、行型変数を更新/追加することは可能です。

CREATE OR REPLACE FUNCTION test() RETURNS VOID AS $$
DECLARE    
         my_row my_table%ROWTYPE;
BEGIN
         SELECT * INTO my_row FROM my_table WHERE id='1';
         my_row.date := now(); 
         raise notice  'date  : %; ',my_row.date;
END;
$$ LANGUAGE plpgsql;

ここでは、昇給通知には今日の日付のみが表示されます。

ただし、これは my_table の列の日付を更新しません。

于 2012-09-21T11:20:20.650 に答える