源程序是这样的
------------------
#!bin/ksh
sqlplus user/password @host < <!
set heading off
column sysdate new_val req
SELECT sysdate from dual;
host echo &req
exit;
-----------------
问题: 我怎样才能在此代码基础上回到shell环境中,并调用sql的中的这个参数“req”和其他操作? 谢谢!
------------------
#!bin/ksh
sqlplus user/password @host < <!
set heading off
column sysdate new_val req
SELECT sysdate from dual;
host echo &req
exit;
-----------------
问题: 我怎样才能在此代码基础上回到shell环境中,并调用sql的中的这个参数“req”和其他操作? 谢谢!
--检测到没有.ERR文件,那么就说明没有任何报错的文件,不需要做其他处理,直接退出检测,报告多维处理正确
--检测到有.ERR文件,那么就把这几个.err文件读到我的临时文件中,用AWK来分割取到第一个第二个
. /etldata/CRMETL/PARA/public.sh
##配置环境
##这是个环境配置的函数,配置了所有相关的路径,工作日期。
set_env()
{
echo "配置环境"
workdate=`awk -F= '{if ($1~/WORKDATE/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
etlsh=`awk -F= '{if ($1~/ETLSH/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
etllog=`awk -F= '{if ($1~/ETLLOG/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
etlin=`awk -F= '{if ($1~/ETLIN/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
etlcu=`awk -F= '{if ($1~/ETLCU/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
dbusr=`awk -F= '{if ($1~/DBUSR/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
dbpwd=`awk -F= '{if ($1~/DBPWD/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
esshost=`awk -F= '{if ($1~/ESSHOST/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
essuser=`awk -F= '{if ($1~/ESSUSER/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
esspwd=`awk -F= '{if ($1~/ESSPWD/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
esslog=`awk -F= '{if ($1~/ESSLOG/) print $2}' /etldata/CRMETL/PARA/etl.cfg`
##这个路径是被ESSADMIN用户写入日志的,所以必须具有写权限
lastmonth=`SubDateM $workdate 28`
echo "lastmonth:"$lastmonth
}
check_err()
(
echo "检查.err文件"
cd $etlin/$lastmonth;
ls -lrt *.err >err.txt;
echo "取得err.txt文件的行数"
wc -l err.txt|awk '{print $1}'|read a
echo $a
b=1
until [ "$b" -gt "$a" ]
do v_sDisp=`echo "${v_sDispLine}"|awk '{FS=",";print $2}'`
line=`sed -n $b'p' err.txt`
echo $line
word=`echo "$line" |awk '{print $9}'`
echo $word
cube=`echo "$word"|awk -F. '{print $1}'`
table=`echo "$word"|awk -F. '{print $2}'`
echo $cube
echo $table##记录运行日志
sqlplus $dbusr/$dbpwd <<!insert into dgcrm.ess_check(cube_id,table_id) values ('$cube','$table');
commit;
exit;
!
b=`expr $b + 1`
done
)############################ 主程序 ############################
set_env
check_err
######################是否有当前进程在运行############你看就是几个函数之间的调用,把程序层次写清楚点就好了,呵呵,就是在你的EXIT;后面加个!,来退出SQLPLUS,
Thanks
这段代码好复杂哦, 我还是新手,有些难理解。 我的环境不能配置,因为没有权限,我们是远程的服务器。
-----------------------
#!bin/ksh
sqlplus user/password <<!
set heading off
column sysdate new_val req
SELECT sysdate from dual;
host echo &req
exit;
-----------------
能不能就这段代码,告诉我怎么才能 返回到unix 中,并且调用参数 req。
这段代码是可以执行的。 谢谢了
set heading off
column sysdate new_val req
SELECT sysdate from dual;
host echo &req
。
写到文件里,1.sql然后sqlplus user/password@host @1.sql > 1.out然后分析1.out
只要你定义了就可以,或者你把你要做的工作具体描述一下
sqlplus $username /$password<<EOF
set heading off
column sysdate format a10
spool spool_file
SELECT sysdate from dual;
spool off
exit;
EOF
cat $spool_file|grep -v SQL|grep -v ^$|read
感觉你的主要功能还是读到一个 数据库里反回的结果,并且希望去掉 SELECT 语句和反回的行数等其他信息
所有你的正确答案固然可行,但并不是比较通用的方法,因为ORACLE本身提供了你希望实现的功能,例如
你可以执行以下的SHELL程序,目标文件中就是你想要的结果:
export_dimtable()
{sqlplus -s dgcrm/dgcrm <<EOF >/dev/null
set echo off;
set feedback off; --禁止显示最后一行的计数反馈信息
set heading off; --禁止输出列标题
set pagesize 0; --设置显示多少行打印一次列名
set linesize 1000;
set numwidth 12;
set termout off;
set trimout on; --清空多余的空格
set trimspool on;
set newpage none; --没有翻页,输出的文件没有空行
spool a.txt
select sysdate from dual;spool off;exit
EOF
}
export_dimtable最下面是调用上面写 的函数,你可以发现a.txt里面只有你想要的结果,只有一行,对不对?