2011-10-14 59 views
0

我有一个SQL查询: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(); 

我想写这个输出到一个文件。如果它仅仅是一个文本文件,我会使用文件写入器和缓冲写入器。但现在它是一个SQL生成的文件,我有点困惑。有没有办法在Java中实现这一点?

+0

数据的源是不重要的。听起来像输出文件的确是一个文本文件。 – trojanfoe

+0

是的,trojanfoe是对的。你只需要将你的数据写入一个文本文件。 –

回答

2

如果你想要写一个文件在本地(数据库的计算机上)也有个非常快,像这样的情况下,简单的COPY

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

我用dollar-quoting这里,以避免逃避单引号。

+0

非常简单的解决方案很好。 – Kuberchaun

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

+0

您也可以使用\ o从psql设置输出文件,这很容易。 –