2012-06-16 5 views
2

J'utilise un script shell pour appeler Oracle sqlplus et je souhaite exporter le résultat d'une requête dans un fichier sql.Générer un fichier SQL Oracle à la suite d'une requête

Cette demande me donne beaucoup de valeurs:

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

Et je veux que mon script pour générer un fichier sql comme ceci:

[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, ...); 

Toute idée (j'ai un peu de fond dans Oracle et SQL) sur la façon d'effectuer cela dans mon script?

+0

@Mat: Merci :). – iPadDevloperJr

+0

Sortez la clause WITH (les deux premières lignes de votre exemple) complètement, et essayez cela. – DCookie

+0

En savoir plus sur la clause WITH (alias, affacturage sous-requête) ici: http://www.oracle-base.com/articles/misc/with-clause.php – DCookie

Répondre

3

Quelque chose le long de ces lignes, peut-être:

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 

Il en résulte un somefile.sql de fichier avec le contenu suivant:

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

Merci, mais je ne comprends pas pourquoi toute cette union ?, Je veux quelque chose de plus générique, donc je n'ai pas besoin de vider tous les noms de colonnes dans mon code, c'est pourquoi j'ai utilisé select * dans ma question, donc je veux vider toutes les colonnes de la table. – iPadDevloperJr

+0

J'ai aussi cette erreur quand je veux exécuter mon script: ORA-00904: col6: identificateur invalide – iPadDevloperJr

+0

C'est juste une illustration - un moyen de fournir un peu d'entrée à l'instruction SELECT pour montrer que cela fonctionne. Dans votre vrai script, vous omettez cette partie. – DCookie

Questions connexes