shell調用預存程序

來源:互聯網
上載者:User

#!/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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.