0

私は postgresql を使用しており、プログラムで関数を使用してレコードを挿入または更新したいと考えています。しかし、私が知っておく必要があるのは、探している条件を持つレコードが既にデータベースにある場合はそれを更新し、そうでない場合は新しいレコードを挿入するということです。詳細:

テーブル :

CREATE TABLE running_check
(
  "UID" character varying(100) NOT NULL,
  "CameraIP" character varying(100),
  "ErrorStatus" integer,
  "IsRunning" boolean,
  "CheckTime" timestamp without time zone
);

レコードの例:

UID        CameraIP         ErrorStatus        IsRunnning     CheckTime
------------------------------------------------------------------
12E        10.0.0.26        0                  true           now()
C26        10.0.0.22        0                  true           now()
454        10.0.0.13        3                  false          now()

次のような関数が必要です。

InsertRunningCheckInfo(character varying, character varying, integer, boolean )

そして、関数を呼び出すとき、最初に、同じ UID を持つレコードが既に存在する場合はテーブル内のレコードを確認する必要があります。次に、その「IsRunning」値が true の場合は「CheckTime」を更新するだけで、そうでない場合はその ErrorStatus、IsRunning、およびCheckTime 値、同じ UID を持つレコードが存在しない場合、新しいレコードを挿入します。

実際、私が直面している問題は、関数で Select クエリを使用してそのフィールドをチェックしてから機能させる方法がわからないことです。自分。私が知らないPostgresqlでこのタスクに利用できる別の方法があるかもしれないので、あなたに尋ねたかった.

前もって感謝します。

4

3 に答える 3

3

ストアド プロシージャの本体では、次のようなことができます。

SELECT UID
FROM running_check
WHERE UID = myparameter;

IF FOUND THEN
  -- UPDATE running_check SET ... WHERE UID = myparameter
ELSE
  -- INSERT INTO running_CHECK ...
END IF;

ブール値は、前のfoundステートメントの結果をチェックします。使用できる Postgres 環境がなくなったので、これを確認することはできません。しかし、これはあなたを正しい方向に押し進めるはずです。

于 2013-05-16T08:54:29.187 に答える
-1

良いか悪いか、私の問題に対する私の解決策:

CREATE OR REPLACE FUNCTION insertrunningcheckinfo(character varying, character varying, integer, boolean) RETURNS void
    LANGUAGE plpgsql
    AS $_$

        DECLARE 
    record_number INTEGER;

BEGIN
 --LOOP

    Select Into record_number "RecordNo" from "running_check" where "UID" = $1 order by "RecordNo" DESC limit  1 ;

    UPDATE "running_check"
    SET   "CheckTime" = now()
        WHERE "RecordNo" = record_number and ("IsRunning" = true and $4 = true);

        IF found THEN
            RETURN;
        END IF;


        UPDATE "running_check"
    SET   "CheckTime" = now()
        WHERE "RecordNo" = record_number and ("IsRunning" = false and $4 = false) and "Status" = $3;

        IF found THEN
            RETURN;
        END IF;

--BEGIN --BEGIN INSERT

    INSERT INTO "running_check"(
            "UID", 
            "CameraIP", 
            "Status",
            "IsRunning",
            "CheckTime")

    VALUES ($1, 
        $2, 
        $3,
        $4,
        now()
        );

    RETURN;
    EXCEPTION WHEN unique_violation THEN
    -- Do nothing
--END; --END INSERT
--END LOOP;
END;
$_$;
于 2013-05-17T11:13:55.517 に答える