0

私はjdbcクライアントをpostgresqlデータベースと通信させています。JDBC からテーブルにデータを挿入するための準備済みステートメントを作成しますが、クエリの作成の時点で、クライアントはステートメント内に挿入するすべてのフィールドを認識していません。クエリを完了するために、起動する TRIGGER を記述しましたそのテーブルに挿入する前に、欠落している値を見つけ、クエリを実行し続けます。これはjdbcコードです:

String MY_INSERT = "INSERT INTO myTable VALUES(?, ?, ?, ?, ?, ?)";
PreparedStatement pstm = connection.PrepareStatement(MY_INSERT);
pstm5.setInt(1, 2562);
pstm5.setInt(2, 22);
pstm5.setInt(3, 0); //unknown value, set to zero
pstm5.setString(4, "a string");
pstm5.setInt(5, 0); //the other unknown value

これはトリガーコードです:

CREATE FUNCTION perform_() RETURNS trigger AS $myTrigger$

DECLARE 
vend VARCHAR(20);
pre numeric(10,2);

BEGIN
    SELECT field3, field5 FROM otherTable WHERE id = NEW.field2 INTO vend, pre;

    NEW.field3 = vend;
    NEW.field5 = pre;

    RETURN NULL;
END;
$myTrigger$ LANGUAGE plpgsql;

CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable
EXECUTE PROCEDURE perform_(); 

トリガーが起動すると、次のエラーが発生します。

Exception: JDBCClass error: ERROR: record "new" is not assigned yet
Details: The tuple structure of a not-yet-assigned record is indeterminate.
SELECT field3, field5 FROM otherTable WHERE id = NEW.field2 INTO vend, pre;

どういう意味ですか?jdbcコードでわかるように、新しいレコードが割り当てられています...

4

1 に答える 1

1

FOR EACH ROWまず、トリガー宣言を見逃しています:

CREATE TRIGGER myTrigger
BEFORE INSERT ON myTable
FOR EACH ROW EXECUTE PROCEDURE perform_(); 

次に、return NEW;レコードをテーブルに挿入する場合は、必要があります

SQLフィドルのデモを参照してください

于 2013-08-16T09:20:26.250 に答える