如何使用shell脚本从表中检索多个数据?

时间:2017-09-09 09:28:42

标签: oracle shell

var=`sqlplus -s user/pass <<EOF
      2 set feedback off
      3 set heading off
      4 set pagesize 2000
      5 select * from orders;
      6 exit
      7 EOF`
      8 cnt=${#var[@]}
      9 for (( i=0 ; i<cnt ; i++ ))
     10 do
     11 echo $var[0]
     12 echo $var[1]
     13 done

这是我正在使用的代码,但总是给我最后一行。

结果如下:

$ sh test.sh
[0] 5 555 c52
[1] 5 555 c52

这是表格:

ORDER_ID          QUANTITY EAN        C_ID
--------------- ---------- ---------- --------------------
o1                      14 551        c1
o2                      14 552        c2
o3                       3 553        c3
o4                       4 554        c4
o5                       5 555        c5

2 个答案:

答案 0 :(得分:2)

变量var不是数组。它的简单标量变量包含多行文本。因此,您不能使用它来循环来检索变量内容。尝试这样的事情:

~$ var=$(sqlplus -s user/pass@db_tnsalias <<EOF
   set feedback off
   set heading off
   set pagesize 0
   select * from orders;
   exit
EOF
)
~$ echo "$var" | while read line; do echo $line; done
o1 14 551 c1
o2 4 552 c2
o3 3 553 c3
o4 4 554 c4
o5 5 555 c5

注意:

  • 围绕$var引用双引号以避免变量扩展
  • pegesize 0删除第一个空行

答案 1 :(得分:0)

这不起作用,因为sql命令返回的行然后逐字输入数组。所以之后没有任何迹象表明数据行结束而下一行开始。我没有填充一个数组,而是将整个输出传输到一个while循环中,该循环从stdin读取,如下所示:

{ sqlplus -s system/subho94 <<EOF
set feedback off
set heading off
set pagesize 2000
select * from orders;
exit
EOF
} |
while read orderid quantity ean cid; do
  echo $orderid $quantity $ean $cid
done

请注意,在从stdin读取行时,shell会对行进行标记,但会应用IFS,这会导致从列中删除所有空白区域,但我认为这正是您想要的。

相关问题