莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

          PL/SQL學習筆記(一)

          Posted on 2007-02-11 19:52 dennis 閱讀(1014) 評論(0)  編輯  收藏 所屬分類: 數據庫技術

          斷斷續續學過,這次系統地來讀讀。

          (一)

          PL/SQL是oracle在標準SQL語言上的過程性擴展,它不僅允許嵌入SQL語句,而且允許定義變量和常量,允許過程語言結構(條件語句和循環語句),允許使用異常處理oracle錯誤等。通過使用PL/SQL,可以在一個PL/SQL塊中包含多條SQL語句和PL/SQL語句。PL/SQL具有以下優點:

          1。提高應用系統的運行性能。

          通過使用PL/SQL塊包含多條SQL語句,從而減少了SQL語句的發送次數,降低了網絡開銷,提高了應用程序性能

          2。提供模塊化的程序設計功能。

          將企業規則和商業邏輯集成到PL/SQL子程序當中,提供給客戶端調用,簡化了客戶端應用程序的開發和維護工作,降低了耦合度

          3。允許定義標識符,允許定義變量、常量、游標和異常等標識符

          4。具有過程語言控制結構,允許使用條件分支語句和循環語句

          5。具有良好的兼容性,在允許運行oracle的任何平臺上執行,不僅在數據庫服務端執行,也可以在oracle提供的工具中開發PL/SQL

          6。處理運行錯誤,使用PL/SQL提供的EXCEPTION,開發人員可以集中處理各種oracle錯誤和PL/SQL錯誤,簡化了錯誤處理。

          (二)

          PL/SQL塊的概念:

          Block是PL/SQL的基本單元,編寫PL/SQL本質上就是編寫PL/SQL塊,塊的嵌套層次沒有限制。

          1。塊的結構:塊由3部分組成

          ?

          DECLARE ?

          ??定義部分——定義常量,變量,游標,異常,復雜數據類型等

          BEGIN

          ??執行部分

          EXCEPTION

          ??異常處理部分

          END ;? /* 塊結束標志 */

          ?

          其中只有執行部分是必須的!

          2。分類:

          1)匿名塊,匿名塊是指沒有名稱的PL/SQL塊,可以內嵌到應用程序中,如:

          declare
          ????v_name?
          VARCHAR2 ( 10 );

          BEGIN
          ????
          select ?name? into ?v_name? from ?test? where ?name =& no;
          ????dbms_output.put_line(
          ' 名字: ' || v_name);
          ????EXCEPTION
          ????
          WHEN ?NO_DATA_FOUND? THEN
          ????dbms_output.put_line(
          ' 找不到該名字 ' );
          end ;


          2)命名塊:與匿名塊相似,使用命名塊主要是為了區分多級嵌套關系,如:

          << out >>

          declare
          ????v_name?
          VARCHAR2 ( 10 );

          BEGIN

          ????
          << inner >>

          ????
          begin

          ???????????
          null ;

          ????
          end ;

          ????
          -- <<inner>>

          ????
          ????
          select ?name? into ?v_name? from ?test? where ?name =& no;
          ????dbms_output.put_line(
          ' 名字: ' || v_name);
          ????EXCEPTION
          ????
          WHEN ?NO_DATA_FOUND? THEN
          ????dbms_output.put_line(
          ' 找不到該名字 ' );
          end ;? -- <<outer>>


          3)子程序,又可以分成3種:過程、函數和包

          A。過程用于執行特定操作,當建立過程時既可以指定輸入參數,也可以指定輸出參數,從而在應用環境和程序間傳遞數據,使用CREATE PROCEDURE語句,如:

          ? create ? or ? replace ? PROCEDURE ?update_test(id2? NUMBER ,money2? LONG )
          ?
          is
          ????e_no_row?EXCEPTION;
          ?
          begin
          ????
          update ?test? set ? money = money2? where ?id = id2;
          ????
          if ?SQL % NOTFOUND? THEN
          ??????RAISE?e_no_row;
          ????
          end ? if ;
          ?EXCEPTION
          ????
          WHEN ??e_no_row? THEN
          ??????raise_application_error(
          - 20004 , ' 該test不存在 ' );
          ?
          end ?update_test;


          B)函數,與過程主要不同是函數需要返回數據,在函數頭和函數體都必須有RETURN語句,如:

          ?

          create ? or ? replace ? FUNCTION ?get_long(name2? VARCHAR2 )
          RETURN ? LONG ? IS
          ??avg_money?
          NUMBER ;
          begin
          ??
          select ? money ? into ?avg_money? from ?test? where ?name = name2;
          ??
          RETURN ?avg_money;
          end ;??

          ?

          C)包,類似JAVA包的概念,包含兩部分,包規范和包體,包規范相當于C++中的頭文件聲明子程序,而包體包含這些子程序的具體實現。調用包中的子程序時,需要 ‘包名.子程序名’ 這樣的形式調用

          4。觸發器是指隱含執行的存儲過程,定義觸發器需要指定觸發事件和觸發操作,常見觸發事件如insert,update,delete等,使用CREATE?TRIGGER命令建立

          主站蜘蛛池模板: 连江县| 杨浦区| 特克斯县| 怀柔区| 繁峙县| 桃江县| 石河子市| 汨罗市| 青川县| 河北区| 锡林郭勒盟| 武城县| 石棉县| 安龙县| 清水县| 南华县| 宜宾县| 屯昌县| 安顺市| 天峨县| 安仁县| 来安县| 南投县| 鄢陵县| 曲阜市| 济阳县| 龙游县| 南部县| 河曲县| 孝感市| 麻阳| 临沂市| 县级市| 宁晋县| 夏津县| 合山市| 桃江县| 丹巴县| 麦盖提县| 怀仁县| 华阴市|