1

だから私は最近postgresを使い始めました。また、関数内でリソースとパフォーマンスのどちらが優れているかを知りたい場合を除き、「IF else」を実行することはできません。1. 次のような関数を作成して、ID を格納するデータベースにクエリを実行します。id をチェックして、それが null であるかどうかを確認します。それ以外の場合は id を返します。

CREATE OR REPLACE FUNCTION getallfoo() RETURN INT AS
$BODY$
DECLARE
id INTEGER := (SELECT id FROM foo where (lots of condition checks 15+);
BEGIN
IF id is null then
   INSERT INTO foo(a,b,c,d,e,f) SELECT (1,2,3,4,5,6) RETURNING id INTO id;
   return id;
ELSE 
  RETURN id;
END IF;
END;
$BODY$
Language 'plpgsql';
select * from getallfoo();

または 2: 最初にデータベースへの挿入を試み、次のようなことを行います。続いて、挿入が失敗したと仮定してデータベースにクエリを実行します。最初に挿入を行う理由がありますが、それはこの質問のポイントではありません。私はほとんどの人が最初にクエリを実行し、存在しない場合は挿入すると言うことを知っています。

INSERT INTO foo (a,b,c,d,e,f, ........, 15+) SELECT (1,2,3,4,5,6, ........., 15+) 
WHERE NOT EXIST(SELECT 1 from foo where a=1, b=2, c=3, up to 15);

私はJavaで作業しているので、rs.getGeneratedKeys() = 0;かどうかを確認するだけです。挿入が失敗した場合は、ID のデータベースを再クエリします。

SELECT id from foo where a=1, b=2, c=3, ect;

問題は、クエリの条件チェックが長いため、関数を作成してデータベースに一度クエリを実行する方がよいということです。または、関数をスキップして 2 回クエリするだけです。私は、約 50 の異なるテーブルでこれらのタイプの挿入を行っています。

副次的な質問は、preparedStatement(上記の関数) ResultSet rs = ps.executeUpdate(); を使用して Java で関数を作成できるかということです。

4

2 に答える 2

2

アプリケーションのパフォーマンスが低下するため、同じデータに対してデータベースに複数回ヒットすることはお勧めできません。したがって、DB に複数回クエリを実行する代わりに、単一の関数でタスクを実行できる場合は、関数を使用する必要があります。

于 2013-07-03T18:22:12.250 に答える