需要在Unix shell脚本中将用户输入(日期)传递给DB2查询

时间:2014-11-15 02:27:22

标签: shell unix

下面的DB2查询应该与用户输入的日期一起运行。如何将用户输入日期传递给DB2查询中哪一个以粗体突出显示。

#/usr/bin/ksh
db2 connect to sunrise user edwprod using prodedw1

echo "enter the date (format should be 20140829)"

read $DATE   # Read date here

result=`db2 "Select ORBDDT, count(*) as cnt_lines,
                    sum(ODAPRC * (cast(((coalesce(odsqty,1)/(case when odconv=0 then 1 else odconv end))) AS decimal (20,2)))) as sum_Sales,
                    sum(ODSQTY * ODAVCS) as sum_COGS
               from SFBASLIB.SFORDD
               JOIN SFBASLIB.SFORDR ON (ODORD# = ORORD# and ODLINK = ORLINK and ODSHP# = ORSHP#)
               JOIN SFBASLIB.SFORDH ON (OHORD# = ORORD# and OHLINK = ORLINK and OHORD# = ODORD# and OHLINK = ODLINK)
              where ORBDDT>='$DATE'
                and ODSQTY <> 0
                and ODSTAT not in ('SCR','CAN','BCN','KIL')
                and ORPSTA not in ('SCR','CAN','BCN')
                and ODITYP not in ('M','C')
                and OHTYPE not in ('RE','QU','TRAN')
              group by ORBDDT with UR"`

echo $result

1 个答案:

答案 0 :(得分:1)

假设db2的第二次调用被后引号包围(现在在重新格式化的问题中显示),则问题出在read行。它应该是:

read DATE

您不必在$声明中使用read作为名称的前缀。这是将分配给$DATE的值并尝试将其用作变量名称,但这并不起作用。

您应该优先使用$(db2 "SELECT …")表示法优先于后引号。我假设你要做的不仅仅是回应结果;否则,你不应该捕获输出。即使你只是回应它,你应该使用:

echo "$result"

保留结果的内部间距。

我假设您能够使用第一个db2命令创建连接,然后使用第二个db2命令针对相同的连接运行查询。而且你最好没有披露生产密码。