源程序是这样的 
------------------ 
#!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”和其他操作? 谢谢!

解决方案 »

  1.   

    给你一段类似的程序,其实很简单的
    --检测到没有.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,
      

  2.   


    Thanks
           
       这段代码好复杂哦, 我还是新手,有些难理解。    我的环境不能配置,因为没有权限,我们是远程的服务器。
    -----------------------
     #!bin/ksh  
    sqlplus  user/password <<!  
    set heading off  
    column sysdate new_val req  
    SELECT sysdate from dual;  
    host echo &req  
    exit;  
    -----------------  
    能不能就这段代码,告诉我怎么才能 返回到unix 中,并且调用参数 req。
    这段代码是可以执行的。 谢谢了 
     
      

  3.   


    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
      

  4.   

    认真看下我给你的程序,不要着急,变量在SHELL命令和SQL中是可以自由传递的,
      只要你定义了就可以,或者你把你要做的工作具体描述一下
      

  5.   

    谢谢各位的提示,我终于研究出来了:正确答案是:
    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 
      

  6.   

    楼主,你看我看了下你的  正确答案,
    感觉你的主要功能还是读到一个 数据库里反回的结果,并且希望去掉 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里面只有你想要的结果,只有一行,对不对?