だから私は最近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 で関数を作成できるかということです。