PostgreSQL 8/9用のデータベースドライバーは、INSERT
またはUPDATE
の実行時に影響を受けるレコードのカウントを返しません。
PostgreSQLは、非標準の構文 " [〜#〜] returning [〜#〜] "を提供していますが、これは適切な回避策のようです。しかし、構文は何でしょうか?この例はレコードのIDを返しますが、カウントが必要です。
ディストリビューターへの挿入(did、dname)値(デフォルト、「XYZウィジェット」)RETURNING did;
私はこの質問がoooolllllldであり、私の解決策は間違いなく過度に複雑であることを知っていますが、それは私のお気に入りの解決策です!
とにかく、私は同じことをしなければならず、次のように動作させました:
-- Get count from INSERT
WITH rows AS (
INSERT INTO distributors
(did, dname)
VALUES
(DEFAULT, 'XYZ Widgets'),
(DEFAULT, 'ABC Widgets')
RETURNING 1
)
SELECT count(*) FROM rows;
-- Get count from UPDATE
WITH rows AS (
UPDATE distributors
SET dname = 'JKL Widgets'
WHERE did <= 10
RETURNING 1
)
SELECT count(*) FROM rows;
最近の1つは、PostgreSQLのWITH句に恋愛ソネットを書くことです。
私はマイレンに同意します、あなたのドライバーはあなたのためにこれをするべきです。どのドライバーをどの言語で使用していますか?しかし、plpgsqlを使用している場合は、GET DIAGNOSTICS my_var = ROW_COUNT;を使用できます。
http://www.postgresql.org/docs/current/static/plpgsql-statements.html
どうぞ ROW_COUNT
このコードで更新または挿入した後:
insert into distributors (did, dname) values (DEFAULT, 'XYZ Widgets');
get diagnostics v_cnt = row_count;
あなたが質問からどのように声明を呼んでいるかは明らかではありません。 JDBCのようなものを使用していると仮定すると、更新ではなくクエリとして呼び出すことができます。 JDBCから executeQuery
:
指定されたSQLステートメントを実行し、単一のResultSetオブジェクトを返します。
したがって、これは、SELECT
やINSERT ... RETURNING
などのクエリ結果を返すステートメントを実行する場合に適しています。データベースを更新していて、影響を受けたタプルの数を知りたい場合は、 executeUpdate
を使用する必要があります。
(1)SQLデータ操作言語(DML)ステートメントの行カウント、または(2)何も返さないSQLステートメントの0