shell oracle互動

mrhaozi發表於2009-12-10


cat a.sh
sqlplus etl_user/etl_user << !
set heading off
col flag noprint
column flag new_val dat
select odb2odm_flag flag from etl_process_ctrl;

host echo &dat > /data/odb2odm-ok.txt

exit;
exit;
!

cat a.sh
sqlplus ods_user/ods_user << !
set heading off
col today noprint
column today new_val dat
select to_char( sysdate, 'yyyy-mm-dd') today from dual;

If &dat ='2009-05-22' Then
begin

host echo &dat > /data/s.txt
end;
End If;


exit;
exit;
!


~/new_folder
$ str="2008-10-11"
~/new_folder
$ result=`sqlplus -s <set heading off
select to_date('$str','YYYY-MM-DD') from dual;
exit;
eof
`
~/new_folder
$ echo $result
11-10? -08
$ result=`sqlplus -s <set heading off
select 1 from dual union select 2 from dual;
exit;
eof
`
~/new_folder
$ echo $result
1 2
文章出處:

Shell 與 SQLPLUS 的 互動 ---- 引數傳遞 返回值

unix上要執行oracle的sql,常見的是用shell指令碼來呼叫sqlplus執行sql。
用這種方式,自然shell和sqlplus就有可能進行互動---shell傳遞引數進sqlplus,sqlplus將結果返回給shell。
從shell傳引數進sqlplus是很簡單的,可以在sql語句中用${shell變數名}的方式直接引用shell的變數.
eg,
transaction_sequence=$1
sqlplus -S << EOF
delete ODSDEFAULT_ODS_CONTROL WHERE TRANSACTION_SEQUENCE = ${transaction_sequence};
exit;
EOF

但如果我一個sql的執行結果需要返回給shell,那該怎麼處理呢?shell中可沒法直接來引用sqlplus裡的變數。
經過研究,我發現以下兩種方式可以達到這個目的。

方法1-----------
VALUE=`sqlplus -S << EOF
set heading off
set pagesize 0;
set feedback off;
set verify off;
set echo off;
select sysdate from dual;
exit;
END`
if [ -z "$VALUE" ]; then
echo "No rows returned from database"
exit 0
else
echo "Max Sequence Number: $VALUE"
fi

方法2-----------
sqlplus -S << EOF
set heading off feedback off pagesize 0 verify off echo off
col coun new_value v_coun
select 255 coun from dual;
exit v_coun
EOF
VALUE="$?"
echo "The number of rows is $VALUE."
不過方法2有個侷限性,exit後面跟的數值只能在0-255之間。超過後會自動以255取餘。

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16396910/viewspace-1029556/,如需轉載,請註明出處,否則將追究法律責任。

相關文章