#!/bin/sh
##--------------------------------------------------------
##
##--功能說明:調用SP(只支援SP有0-4個in參數,2個out參數)
## 需要完善的地方:參數類型判斷
##--輸入參數:
##-- $1:資料庫名稱(必須)
##-- $2:資料庫使用者名稱(必須)
##-- $3:資料庫使用者密碼(必須)
##-- $4:資料庫SP名稱(必須)
##-- $5:SP輸入參數(可選)--$8:SP輸入參數(可選)
##--返回參數說明:
##-- p_out_sqlcode:預存程序執行錯誤碼()
##-- p_out_errmsg:預存程序執行錯誤描述()
##-- p_errmsg:程式錯誤描述
##--------------------------------------------------------
sqlLogFile=sqllog.tmp
dbname=$1
dbuser=$2
dbpwd=$3
spname=$4
param1=$5
param2=$6
param3=$7
param4=$8
paramnum=$# #SP參數個數
if [ $# -lt 4 ]
then
echo "至少輸入4個參數!"
exit
fi
sqlplus -S $dbuser/$dbpwd@$dbname>>${sqlLogFile} <<!
set serveroutput on size 100000
declare
p_out_sqlcode number;
p_out_errmsg VARCHAR2(2000);
V_SQL VARCHAR2(2000);
v_num number; --shell傳遞的參數IN個數
v_sp_num number;--SP參數IN個數
begin
SELECT '('||WMSYS.WM_CONCAT(':P' || ROWNUM)||')' INTO V_SQL FROM DUAL
CONNECT BY LEVEL <=$paramnum-4+2;
V_SQL := 'CALL ' || '$spname ' ||V_SQL ;
v_num :=$paramnum-4;
select count(1) into v_sp_num From user_arguments
where object_name=upper('$spname')
And in_out='IN';
if v_num !=v_sp_num
then
RAISE_APPLICATION_ERROR( -20001, 'p_errmsg^輸入的參數個數出錯!' );
end if;
if v_num ='0'
then
EXECUTE IMMEDIATE V_SQL
USING OUT p_out_sqlcode, OUT p_out_errmsg;
elsif v_num='1'
then
EXECUTE IMMEDIATE V_SQL
USING IN '$param1',
OUT p_out_sqlcode, OUT p_out_errmsg;
elsif v_num='2'
then
EXECUTE IMMEDIATE V_SQL
USING IN '$param1',IN '$param2',
OUT p_out_sqlcode, OUT p_out_errmsg;
elsif v_num='3'
then
EXECUTE IMMEDIATE V_SQL
USING IN '$param1',IN '$param2',IN '$param3',
OUT p_out_sqlcode, OUT p_out_errmsg;
elsif v_num='4'
then
EXECUTE IMMEDIATE V_SQL
USING IN '$param1',IN '$param2',IN '$param3',IN '$param4',
OUT p_out_sqlcode, OUT p_out_errmsg;
else
RAISE_APPLICATION_ERROR( -20001, 'p_errmsg^輸入的參數個數出錯!' );
end if;
dbms_output.put('p_out_sqlcode^');
dbms_output.put_line(p_out_sqlcode);
dbms_output.put('p_out_errmsg^');
dbms_output.put_line(p_out_errmsg);
end;
/
!
# get p_out_sqlcode
p_out_sqlcode=$(awk -F"^" '/^p_out_sqlcode/ {print $2}' ${sqlLogFile})
p_out_errmsg=$(awk -F"^" '/^p_out_errmsg/ {print $2}' ${sqlLogFile})
p_errmsg=$(awk -F"^" '{ if ($1~"p_errmsg") print $2}' ${sqlLogFile})
rm sqllog.tmp
echo $p_out_sqlcode
echo $p_out_errmsg
echo $p_errmsg