今天跟开发的同志学了一手,如何将数据库查到值付给shell里的一个变量,例子如下:
sql001="select 'status='||to_char(last_day(sysdate),'dd') from dual;"
monthend=`echo $sql001 | \
sqlplus -S } | \
grep status | \
awk -F= '{print $2}' `
可以看出变量monthend就是每月最后一天的值了。
针对自己的需要修改了一下:
dbdate1="select 'status '||to_char(sysdate,'dd')||' '||to_char(sysdate-1,'dd') from dual;"
#dbdate2="select 'status='||to_char(sysdate-1,'dd') from dual;"
daystr=`echo $dbdate1 | \
sqlplus -S } | grep status `
day1=`echo $daystr | awk '{print $2}' `
day2=`echo $daystr | awk '{print $3}' `
day=$day1
if [ "$day1" -eq "01" ]
then
day=`expr $day2 + 1`
fi
echo $day1
echo $day2
echo $day
这里day1是今天的日期,day1是前一天的日期,day的值是在day1为每月首日的时候将day2值加1。别问为什么要这么干,应用需要,呵呵。
自己的shell超烂,还得多跟人家学学,呵呵。
还在网上搜到两种方法
1:
sqlplus -S "/ as sysdba" << !
set heading off
col today noprint
column today new_val dat
select to_char( sysdate, 'yyyy-mm-dd') today from dual;
host echo 'today is ' &dat
exit;
exit;
!
2:
#!/bin/ksh
VALUE=`sqlplus -silent "/ as sysdba" < < END
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v\\\$log_history;
exit;
END`
if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo "Max Sequence Number: $VALUE"
fi
不过感觉都没有随开始的那个好使,全当记录吧。
最后在记录一个shell中执行sql的方法,修改下也可以付值。
#!/usr/bin/ksh
SQL_EXEC()
{
sqlplus $USER/$PASSWD@$DB<set linesize 1024
set pagesize 1024
$SQLCOMM
quit
!
}
#select
SQLCOMM="select 'xxx',username from all_users;"
SQL_EXEC | grep xxx
这种方法比较整洁清晰,不过我没试过是否可以,哈哈。
阅读(6625) | 评论(0) | 转发(0) |