0

私はSQLクエリを持っています:

SELECT 'DROP TABLE ' || tablename
  FROM pg_catalog.pg_tables where tablename like 'r_395%';

その出力は次のとおりです。

?column?      
--------------------
 DROP TABLE r_395_0
 DROP TABLE r_395_1
 DROP TABLE r_395_2
 DROP TABLE r_395_3
 DROP TABLE r_395_4
 DROP TABLE r_395_5
 DROP TABLE r_395_6
 DROP TABLE r_395_7
 DROP TABLE r_395_8
 DROP TABLE r_395_9
(10 rows)

私はエンティティマネージャーを使用してこのクエリを実行しています:

StringBuffer query = new StringBuffer();

query.append("SELECT 'DROP TABLE ' || tablename
                FROM pg_catalog.pg_tables where tablename like 'r_395%'");            
entityManager.createNativeQuery(query.toString()).executeUpdate();

この出力をファイルに書き込みたい。単なるテキスト ファイルの場合は、filewriter と buffered writer を使用します。しかし、今は SQL 生成ファイルなので、少し混乱しています。Javaでこれを達成する方法はありますか?

4

2 に答える 2

2

ファイルをローカル (データベースのマシン上) に書き込みたい場合は、次のような場合に非常に高速でシンプルな方法もありますCOPY

COPY $$SELECT 'DROP TABLE ' || tablename
         FROM pg_catalog.pg_tables
        WHERE tablename ~~ 'r_395%'$$ TO /path/to/myfile;

ここではドル引用符を使用して、一重引用符をエスケープしないようにしています。

于 2011-10-14T15:52:44.457 に答える
2

SQL COPY (Erwin Brandstetter の回答を参照) を使用するのと非常によく似た解決策は、psql メタ コマンド \copyを使用することです。ここでの違いは、データベース ボックスへのローカル アクセスが必要ないことです。SQL COPY の出力は、システム ユーザー postgres が書き込みアクセス権を持つデータベース ボックス上の場所にのみ書き込むことができます。psql \copy を使用すると、出力をクライアント上の場所に書き込むことができます。

psql でデータベースに接続し、コマンドを実行します

psql -h host -p port -U user database
\copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'

または、コマンドを -c パラメータを使用して psql に直接渡します。

psql -h host -p port -U user -c "\copy (SELECT 'DROP TABLE ' || tablename FROM pg_catalog.pg_tables WHERE tablename ~~ 'r_395%') to '/path/to/myfile'" database

HTH

于 2011-10-14T18:23:15.257 に答える