【问题标题】:spool multiple files in loop of shell script在 shell 脚本的循环中假脱机多个文件
【发布时间】:2020-02-21 07:23:34
【问题描述】:

我正在尝试假脱机多个文件以减少手动工作。

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;

然后我有一个简单的 shell 脚本 (spool_csv.sh),它循环一个文件以将参数传递给 SQL 文件,并在运行时更改假脱机文件的名称以及 SELECT 语句的 where 子句。

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

我需要为 chartfield1_03.txt 的每一行(比如值)创建单独的 csv 文件

所以它会像

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

但是当我运行 shell 脚本时,它只创建一个用于 chartfield1_03.txt 最后一行的 CSV 文件 即 csv_file_03-jan_747.csv

我不确定为什么当我将假脱机文件作为参数传递并在循环中调用它时没有创建其他文件,所以每次它都应该打开一个新的 SQL 会话并创建新的假脱机文件。

请帮助我了解我在这里缺少什么!

所以最后我发现它为什么不工作,因为我错过了 SQLPLUS 命令中的 EOF,如下所示添加它之后它工作正常。

我找到的解决方案。

#!/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

【问题讨论】:

  • 但是回声有效吗?你得到输出的数字了吗?
  • 是的,回声正在工作。现在我得到了所需的输出,请检查已编辑的问题以获取解决方案。

标签: linux bash oracle shell unix


【解决方案1】:

一种可能的解决方案是在每个 sqlplus 执行时创建相同的文件并在 shell 中重命名它。为此,您可以更改行:

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

在 shell 脚本中:

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"

【讨论】:

  • 感谢您的回复,但是我找到了在 shell 中为 SQLPLUS 命令添加 EOF 的解决方案。我将编辑以反映正确的解决方案。
  • @mradul,您可以将其添加为答案
  • 是的,刚刚做了:)
【解决方案2】:

我的解决方案。

如果您有想法,请提供任何其他解决方案:)

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2021-12-24
    • 2020-07-02
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多