2012-06-16 28 views
2

我正在使用shell脚本来调用Oracle sqlplus,并且我想将查询结果导出到sql文件。生成Oracle SQL文件作为查询请求的结果

这个请求给了我很多的值:

SELECT * FROM CUST_TABLE WHERE CUST_CITY = 'San Fran'; 

而且我想我的脚本生成SQL文件是这样的:

[email protected]$cat first_query_result.sql 

INSERT INTO CUST_TABLE (COLUMN_1, COLUMN_2, ....) 
VALUES (CUST1_COLUMN_1, CUST1_COLUMN_2, ...); 
INSERT INTO CUST_TABLE (COLUMN_1, COLUMN_2, ....) 
VALUES (CUST2_COLUMN_1, CUST2_COLUMN_2, ...); 
INSERT INTO CUST_TABLE (COLUMN_1, COLUMN_2, ....) 
VALUES (CUST3_COLUMN_1, CUST3_COLUMN_2, ...); 

任何想法(我在Oracle中的一些背景和SQL)如何在我的脚本中执行该操作?

+0

@Mat:谢谢:)。 – iPadDevloperJr

+0

完全取出WITH子句(示例中的前两行),然后尝试。 – DCookie

+0

阅读有关WITH子句(又名,子查询因子)的信息:http://www.oracle-base.com/articles/misc/with-clause.php – DCookie

回答

3

东西沿着这些路线,也许是:

sqlplus -silent uid/[email protected] <<+EOF 
set heading off 
set feedback off 
set pagesize 0 
set linesize 32000 
set trimspool on 
set termout off 
set echo off 
set verify off 
set sqlblanklines off 
spool somefile.sql 
WITH cust_table AS 
(SELECT 1 id, 'San Francisco' city, 'C1V1' col1, 'C2V1' col2 FROM dual 
UNION ALL SELECT 2, 'Los Angeles', 'C1V2', 'C2V2' FROM dual 
UNION ALL SELECT 3, 'San Jose', 'C1V3', 'C2V3' FROM dual 
UNION ALL SELECT 4, 'San Francisco', 'C1V4', 'C2V4' FROM dual) 
SELECT 'INSERT INTO cust_table (id, city, col1, col2)'||CHR(10)||'VALUES ('|| 
     id||','''||city||''','''||col1||''','''||col2||''');' 
    FROM cust_table 
WHERE city = 'San Francisco'; 
quit; 
+EOF 

这将导致与以下内容的文件somefile.sql:

INSERT INTO cust_table (id, city, col1, col2) 
VALUES (1,'San Francisco','C1V1','C2V1'); 
INSERT INTO cust_table (id, city, col1, col2) 
VALUES (4,'San Francisco','C1V4','C2V4'); 
+0

谢谢,但我不明白为什么所有这个工会?,我想要更多的东西通用的,所以我不需要在我的代码中转储所有colums名称,这就是为什么我在我的问题中使用select *,所以我想转储表的所有列。 – iPadDevloperJr

+0

当我想运行我的脚本时,我也遇到了这个错误:ORA-00904:col6:无效的标识符 – iPadDevloperJr

+0

这只是一个例子 - 向SELECT语句提供一点输入以显示它的工作方式。在你的真实脚本中,你会省略那部分。 – DCookie