oracle 預存程序(1)

來源:互聯網
上載者:User

標籤:

說明

建立一個預存程序與編寫一個普通的PL/SQL程式快有很多相似地方,比如:包括生命部分,執行部分和異常部分.但是兩者之間實現細節還是有很多差別的,比如:建立預存程序需要使用procedure關鍵字,在關鍵字後就是過程名稱和參數列表;建立預存程序不需要使用declare關鍵字,而是使用create或replace.

要建立一個過程對象(procedural object),必須有 CREATE PROCEDURE 系統許可權。如果這個過程對象需要被其他的使用者schema 使用,那麼你必須有 CREATE ANY PROCEDURE 許可權。執行 procedure 的時候,可能需要excute許可權。或者EXCUTE ANY PROCEDURE 許可權。如果單獨賦予許可權,如下例所示:  

grant  execute on MY_PROCEDURE  to Jelly

基本文法如下:

    CREATE [OR REPLACE] PROCEDURE 預存程序名[(參數[IN|OUT|IN OUT] 資料類型...)]
  {AS|IS}
  [說明部分]
  BEGIN   
  可執行部分
  [EXCEPTION
  錯誤處理部分]
  END [過程名];

其中: 可選關鍵字OR REPLACE 表示如果預存程序已經存在,則用新的預存程序覆蓋,通常用於預存程序的重建。 參數部分用於定義多個參數(如果沒有參數,就可以省略)。參數有三種形式:IN、OUT和IN OUT。如果沒有指明參數的形式,則預設為IN。 關鍵字AS也可以寫成IS,後跟過程的說明部分,可以在此定義過程的局部變數。 編寫預存程序可以使用任何文字編輯器或直接在SQL*Plus環境下進行,編寫好的預存程序必須要在SQL*Plus環境下進行編譯,產生編譯代碼,原代碼和編譯代碼在編譯過程中都會被存入資料庫。編譯成功的預存程序就可以在Oracle環境下進行調用了。 一個預存程序在不需要時可以刪除。刪除預存程序的人是過程的建立者或者擁有DROP ANY PROCEDURE系統許可權的人。刪除預存程序的文法如下:

DROP PROCEDURE 預存程序名;

預存程序的優點

  • 執行效率很高,因為預存程序是先行編譯的,即建立時編譯,而SQL語句是執行一次,編譯一次。調用預存程序可以大大減少同資料庫的互動次數。
  • 降低網路通訊量,因為預存程序執行的時候,只需要call預存程序名,不需要傳遞大量的SQL語句。 
  • 有利於複用。

預存程序的缺點

  • 移植性非常差,如果在oracle上寫的預存程序,移植到mysql需要修改。
  • 代碼可讀性差,實現一個簡單的邏輯,代碼會非常長。

預存程序的用途

  • 造測試資料:可以使用預存程序,往表裡造幾百萬條資料。
  • 資料同步:兩個表之間按照一定的商務邏輯進行資料同步。
  • 資料採礦。

預存程序注意事項

  • 資料量大的時候(10萬+),一定要做壓力測試,有些預存程序在大資料量的情況下才會出現問題。
  • 如果插入或者更新的次數比較多,為了提高效率,可以執行一萬次,再commit一次。
  • 如果先插入記錄,沒有commit,再對這條記錄進行更新,會引起死結。如果先後對同一筆記錄進行更新,又沒有commit,也會引起死結。因為後一條語句會等待前一條語句提交。如果出現這種情況,則需要一條條commit。
  • 不要忘記在預存程序裡寫commit。

效能測試

  •  用預存程序插入40萬資料用了10秒。
  •  遍曆並判斷40萬條資料用了25秒。
  •  80萬次SQL判斷+40萬次SQL插入=25秒。

擴充

  •  預存程序執行非常慢,有可能是更新語句引起了死結,也有可能是語句執行慢(需要建索引)。
  •  預存程序編譯非常慢,有可能是當前預存程序正在執行,被鎖住了。(使用DBA帳號解鎖)。

執行個體:

(1)  建立表

 create table dept(id int,name varchar(30),address varchar(20));

(2) 建立預存程序

    create or replace procedure pro_insertDept is
 begin
 insert into dept values(100,‘shimang‘,‘beijing‘);
 commit;
 dbms_output.put_line(‘insert sucess!‘);
 end pro_insertDept;

(3) 執行預存程序

SQL> execute pro_insertDept;

PL/SQL 過程已成功完成。

SQL> select * from dept;

        ID NAME ---------- ------------------------------------------------------------ ADDRESS ----------------------------------------      

      100 shimang beijing

 

oracle 預存程序(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.