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 stag_maint/stag_maint_ps@oraods << EOF

delete ODSDEFAULT_ODS_CONTROL WHERE TRANSACTION_SEQUENCE = ${transaction_sequence};

exit;

EOF

但如果我一个sql的执行结果需要返回给shell,那该怎么处理呢?shell中可没法直接来引用sqlplus里的变量。

经过研究,我发现以下两种方式可以达到这个目的。

方法1-----------

VALUE=`sqlplus -S stag_maint/stag_maint_ps@oraods << 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 stag_maint/stag_maint_ps@oraods << 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取余。


例3:--------

#!/bin/bash

#This script will test get correct URL FROM attachmentID

#

attURL=$(sqlplus -s 'clsp/clsp@orcl'<<\EOF

set pages 0 feed off

set heading off;

set feedback off;

set verify off; //这个

set linesize 1000;

define hostname_str = "bocc-qa.test.locala/bocc";

define attID = "1118";

SELECT getAttURL('&hostname_str','&attID') FROM dual;

EOF

)

echo $attURL

希望这些小tips对其他人有些帮助!!!

你可能感兴趣的:(oracle,sql,unix,脚本,bash)