熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

講解Sybase存儲過程的建立和使用

2022-06-13   來源: Oracle 

  存儲過程的特點

  Sybase的存儲過程是集中存儲在SQL Server中的預先定義且已經編譯好的事務存儲過程由SQL語句和流程控制語句組成它的功能包括:接受參數;調用另一過程;返回一個狀態值給調用過程或批處理指示調用成功或失敗;返回若干個參數值給調用過程或批處理為調用者提供動態結果;在遠程SQL Server中運行等

  存儲過程的性能特點如下:

  ·存儲過程是預編譯過的這就意味著它與普通的SQL語句或批處理的SQL語句不同當首次運行一個存儲過程時SQL Server的查詢處理器對其進行分析在排除了語法錯誤之後形成存儲在系統中的可執行方案由於查詢處理的大部分工作已經完成所以存儲過程執行速度很快

  ·存儲過程和待處理的數據都放在同一台運行SQL Server的計算機上使用存儲過程查詢當地的數據效率自然很高

  ·存儲過程一般多由Client端通過存儲過程的名字進行調用即跨網傳送的只是存儲過程的名字及少量的參數(如果有的話)而不是構成存儲過程的許多SQL語句因此可以減少網絡傳輸量加快系統響應速度

  ·存儲過程還有著如同C語言子函數那樣的被調用和返回值的方便特性

  所以存儲過程大大增強了SQL語言的功能效率和靈活性掌握和應用好存儲過程對進一步發揮Sybase數據庫系統的強大功能有著重要的意義

  存儲過程的語法規則

  建立存儲過程的語法規則為:

  
  CREATE PROCedure[owner]procedurename[;number]
  [[(]@parameter_name datatype[=default][OUTput]
  [@parameter_name datatype[=default][OUTput]][)]]
  [WITH RECOMPILE]
  AS SQL_statements

  使用存儲過程的語法規則為:

  
  [EXECute][@returnstatus=]
  [[[server]database]owner]procedurename[;number]
  [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]
  [[@parameter_name=]value|[@parameter_name=]@variable[OUTput]]]
  [WITH RECOMPILE]

  [page]下面簡要介紹這兩個命令的常用選項以及建立和使用存儲過程的要點關於選項的更為詳細的說明請參考有關手冊

  ·[[[server]database]owner]procedure_name:存儲過程的名字

  ·@parameter_name datatype[=default][OUTput]:形式參數(形參)的名稱類型df ault是賦予的缺省值(可選)OUTput指定本參數為輸出參數(可選)形參是存儲過程中的自變量可以有多個名字必須以@打頭最長個字符

  ·SQL_statements:定義存儲過程功能的SQL語句

  ·@return_status:接受存儲過程返回狀態值的變量

  ·[@parameter_name=]value:實際參數(實參)@parameter_name為實參的名稱(可選)如果某個實參以@parameter_name=value提供那麼隨後的實參也都要采用這一形式提供

  ·[@parameter_name=]@varialbe[OUTput]:將變量@varialbe中的值作為實參傳遞給形參@parameter_name(可選)如果變量@varialbe是用來接受返回的參數值則選項OUTput不可缺少

  存儲過程的建立和使用我們將通過幾個例子進行介紹

  假設有一個用下述語句生成的技能工資表RSLSGZJiNeng:

  create table RS_LS_GZ_JiNeng     /*技能工資表*/

  (GeRen_id char()         /*個人代碼 */

  RiQi smalldatetime         /*執行日期 */

  YuanYin_id char() null       /*變動原因代碼 */

  JinE smallmoney)           /*技能工資金額 */

  該表存儲著某單位員工多年來技能工資的歷史檔案

  例如果要查詢全體員工的技能工資變動歷史則可先建立一個存儲過程pRsGzJiNegAll:

  
  create procedure p_RsGz_JiNeng_All as
  select *
  from RS_LS_GZ_JiNeng
  order by GeRenidRiQi

  然後用批處理語句調用存儲過程p_RsGz_JiNeng_All進行查詢:

  execute p_RsGz_JiNeng_All

  本例只顯示查詢到的數據無輸入輸出參量是最簡單的一個存儲過程

  例如果要查詢某人技能工資的變動歷史可建立另一個存儲過程p_RsGz_JiNeng:

  
  create procedure p_RsGz_JiNeng @c_GeRenId char()
  as
  select *from RS_LS_GZ_JiNeng
  where GeRen_id=@c_GeRenId
  order by RiQi

  之後用批處理語句調用存儲過程p_Rs_Gz_JiNeng進行查詢:

  declare @GeRenId char()

  select @GeRenId= /*設要查詢員工的個人代碼為 */

  execute p_RsGz_JeNeng @c_GeRenId=@GeRenId

  存儲過程p_RsGz_JiNeng中定義了一個形參@c_GeRenId是字符型變量在調用該過程的批處理中既可以用具體的值也可以用變量作為實參用變量作實參(如本例)時必須用del are語句加以說明值得注意的是在批處理的調用過程語句中@c_GeRenId=@GeRenId中的@ c_GeRenId是存儲過程p_RsGz_JiNeng中的形參名不是批處理中的變量所以不能將它列入d eclare語句的變量單中

  例如果要計算當月工資就必須從工資歷史中查出員工距離當前最近的一次技能工資變動的結果:

  
  create procedure p_RsGz_JiNeng_Slt
  (@c_GeRenId char()@sm_JinE smallmoney output)
  as
  select @sm_JinE=JinE
  from RS_LS_GZ_JiNeng
  where RiQi=(select max(RiQi)
  from RS_LS_GZ_JiNeng

  where GeRenid=@cGeRenId)/*找出歷史記錄中距離當前最近的日期*/

  調用存儲過程p_RsGz_JiNeng_Slt進行查詢:

  
  declare @GeRenId char()@JinE smallmoney
  select @GeRenid=/*設要查詢員工的個人代碼為*/
  select @JinE=
  execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId@sm_JinE=@ JinE output

  這裡變量 @JinE用來存儲過程形參@sm_JinE傳回的金額在調用過程語句中@sm_JiE = @JinE output中的output不可省略否則變量@JinE將得不到形參傳回的數值而始終為零(等於初值)

  例查到了個人代碼為員工的技能工資就顯示其歷史紀錄查不到則顯示一條出錯信息

  
  create procedure p_RsGz_JiNeng_Rtn
  @c_GeRenId char()
  as
  declare @ErrCode smallint
  select @ErrCode=
  if exists(select* from RSLSGZJiNeng
  where GeRenid=@cGeRenId)
  begin
  select *
  from RS_LS_GZ_JiNeng
  whrer GeRen_id=@c_GeRenId
  order by RiQi
  return @ErrCodE
  end
  eslE
  begin
  select @ErrCode=
  return @ErrCodE
  end

  調用存儲過程p_RsGz_JiNeng_Rtn:

  
  declare @GeRenId char()@RtnCode smallint
  select @GeRenId=
  select @RtnCode=
  execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId
  if @RtnCode=
  printNo this one!

  存儲過程p_RsGz_JiNeng_Rtn向調用者返回一個存儲在變量@ErrCode裡的值這個值被稱為狀態值它向調用者反映存儲過程執行的成敗狀態在本例中如果查不到指定員工技能工資的任何記錄時就認為查無此人返回出錯狀態值否則返回成功狀態值

  調用過程的批處理語句使用變量@RtnCode存儲返回的狀態值一旦檢出存儲過程p_RsG_ JiNeng_Rtn返回了錯誤標志(@RtnCode=)就顯示一條信息No this one![page]

  小結

  上述四個例子簡要介紹了存儲過程常用的幾種形式從中我們已經可以領略到它的編程特色以及使用上的靈活性和方便性

  雖然上述例子在調用存儲過程時都是用SQL的批處理語句實現的但並不意味著這是唯一的方法例如在存儲過程中調用存儲過程(即所謂過程嵌套)的現象就很常見另外在其它Sybase數據庫開發系統 (如PowerBuilder)的 script語句中調用Sybase的存儲過程也非常普遍


From:http://tw.wingwit.com/Article/program/Oracle/201311/17494.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.