0

postgresqlDBを使用しています。表に行を挿入してから、1回のpl/sql実行の最初の表に関連する外部キーを持つ別の表に別の行を挿入したいと思います。

問題は、2番目のテーブル行を挿入しようとすると、データベースは、最初のテーブルに挿入した行がまだコミットされていないため、存在しないと想定することです。私は何をしますか?

例:

REATE OR REPLACE FUNCTION "roomTypeCreate"(character varying, integer)
  RETURNS refcursor AS
$BODY$
DECLARE
curr refcursor;
counter integer;
ids integer[];
current_id integer;
count integer;
BEGIN
    SELECT COUNT(*) INTO counter FROM "RoomType" WHERE LOWER("type"::character varying) = LOWER($1::character varying);

    IF (counter > 0) THEN
        OPEN curr FOR
            SELECT false AS "Status";
        RETURN curr;
    END IF;

    INSERT INTO "RoomType"("type", "creator", "updater") VALUES ($1, $2, $2);
    SELECT currval('"RoomType_id_seq"') INTO current_id;

    SELECT ARRAY(SELECT id FROM "Rate" WHERE id>0) INTO ids;

    count = 1;

    WHILE ids[count] > 0
    LOOP
        INSERT INTO "RoomTypeRate"("type", "rate", "sun", "mon", "tue", "wed", "thu", "fri", "sat", "creator", "updater") VALUES(current_id, ids[count], 99999999, 99999999, 99999999, 99999999, 99999999, 99999999, 99999999, 0, 0);
        count = count + 1;
    END LOOP;

    OPEN curr FOR
        SELECT true AS "Status";
    RETURN curr;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
4

1 に答える 1

1

置き換えてみてください:

INSERT INTO "RoomType"("type", "creator", "updater") VALUES ($1, $2, $2);
SELECT currval('"RoomType_id_seq"') INTO current_id;

に:

INSERT INTO "RoomType"("type", "creator", "updater") VALUES ($1, $2, $2) returning id into current_id;
于 2012-12-17T11:24:48.130 に答える