спулировать несколько файлов в l oop сценария оболочки - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь спулировать несколько файлов, чтобы уменьшить объем ручной работы.

В файле SQL (spool_csv. sql) есть оператор выбора, который мне нужно спутировать как файл CSV, как показано ниже

set colsep ','
set linesize 9999
set trimspool on
set heading on
set pagesize 0 embedded on
set wrap off
set feedback off
set newpage 0
set verify off
set arraysize 5000
SET TERMOUT OFF
spool C:\Users\spool_csv\csv_03\csv_file_03-jan_&1..csv
select * from CRAFT_MVT_H where code = '&1';
spool off;
exit;

и затем у меня есть простой сценарий оболочки (spool_csv. sh), который перебирает файл для передачи параметра в файл SQL и для изменения имени файла очереди во время выполнения, а также для где предложение оператора SELECT.

for line in `cat chartfield1_03.txt`
do
  echo $line
  sqlplus -s user/password@SID @spool_03.sql $line
done 

chartfield1_03.txt содержит -

778
769
741 
728
739
759
737
752
710
734
747

мне нужно иметь отдельный CSV-файл для каждой строки (скажем, значения) chartfield1_03.txt

так что это будет похоже на

csv_file_03-jan_778.csv
csv_file_03-jan_769.csv
csv_file_03-jan_741.csv
and so on....

, но когда я запускаю сценарий оболочки, он создает только один файл CSv для последней строки chartfield1_03.txt, т.е. csv_file_03-jan_747.csv

Я не уверен, почему другой файл не создается, когда я передаю файл спула в качестве параметра и вызываю его в al oop, поэтому каждый раз, когда он должен открывать новый SQL сеанс и создавать новый файл спула.

Пожалуйста, помогите мне в постой, чего мне здесь не хватает !!

Итак, в конце я узнал, почему он не работал, так как пропустил EOF в команде SQLPLUS после добавления этого, как показано ниже, он работает нормально.

Решение, как я нахожу.

#!/bin/bash

for line in `cat chartfield1_03.txt`
do
  echo $line
  dt1 = `sqlplus -s HEW/hew_dba14@DEVHEW<<EOF
  whenever sqlerror exit sql.sqlcode;
  @spool_03.sql $line;
EOF` &

done

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Мое решение.

Пожалуйста, предоставьте любое другое решение, если вы думаете:)

#!/bin/bash

for line in `cat chartfield1_03.txt`
do
  echo $line
  dt1 = `sqlplus -s HEW/hew_dba14@DEVHEW<<EOF
  whenever sqlerror exit sql.sqlcode;
  @spool_03.sql $line;
EOF` &

done
0 голосов
/ 21 февраля 2020

Одним из возможных решений является создание при каждом sqlplus выполнении одного и того же файла и переименование его в оболочке. Для этого вы можете изменить строку:

spool C:\Users\spool_csv\csv_03\csv_file_03-jan_&1..csv

на

spool C:\Users\spool_csv\csv_03\csv_file_03-jan_..csv

и в сценарии оболочки:

sqlplus -s user/password@SID @spool_03.sql $line

на

sqlplus -s user/password@SID @spool_03.sql 
mv "C:\Users\spool_csv\csv_03\csv_file_03-jan_..csv" "C:\Users\spool_csv\csv_03\csv_file_03-jan_${line}.csv"
...