我有一个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和缓冲编写器。但现在它是一个SQL生成的文件,我有点困惑。有没有办法在Java中实现这个目标?
答案 0 :(得分:2)
如果你想在本地写一个文件(在数据库的机器上),对于这样的情况,也有非常快速和简单的COPY
:
COPY $$SELECT 'DROP TABLE ' || tablename
FROM pg_catalog.pg_tables
WHERE tablename ~~ 'r_395%'$$ TO /path/to/myfile;
我在这里使用dollar-quoting,以避免转义单引号。
答案 1 :(得分:2)
使用SQL COPY的非常类似的解决方案(请参阅Erwin Brandstetter的答案)是使用psql meta command \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