溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

13-oracle_數(shù)據(jù)庫存儲過程和包的開發(fā)

發(fā)布時間:2020-08-09 08:35:14 來源:ITPUB博客 閱讀:143 作者:blt32034 欄目:關(guān)系型數(shù)據(jù)庫

13-oracle_數(shù)據(jù)庫存儲過程和包的開發(fā)

一:存儲過程 ( 圖片左邊的 procedure 目錄 )

在數(shù)據(jù)庫的實際開發(fā)過程中,我們不可能每個腳本用人工的方式執(zhí)行,需要自動的批量提交腳本到數(shù)據(jù)庫執(zhí)行,數(shù)據(jù)庫就提供了像存儲過程這樣的對象,方便開發(fā)人員把處理某個功能或報表的邏輯寫到存儲過程里。

1) 存儲過程的優(yōu)點:

a. 執(zhí)行速度更快:在數(shù)據(jù)庫中保存的存儲過程語句都是編譯過的

b. 允許模塊化程序設(shè)計和可移植性更強:類似方法的復(fù)用(使用存儲過程可以實現(xiàn)存儲過程設(shè)計和編碼工作的分開進行,只要將存儲過程名、參數(shù)、返回信息等告訴編程人員即可);

c. 提高系統(tǒng)安全性:防止 SQL 注入   (執(zhí)行存儲過程的用戶要具有一定的權(quán)限才能使用存儲過程)

d. 減少網(wǎng)絡(luò)流通量:只要傳輸存儲過程的名稱(在大批數(shù)據(jù)查詢時使用存儲過程分頁查詢比其他方式的分頁要快很多)

e. 在同時進行逐主、從表間的數(shù)據(jù)維護及有效性驗證時,使用存儲過程更加方便,可以有效的利用 SQL 中的事務(wù)處理機制。

創(chuàng)建存儲

2) 創(chuàng)建語法:

create or replace procedure p_house_create_data(p_fm_dt date default sysdate - 1 ,

                                                p_to_dt date default sysdate ) is

  /************************************************************

    author    :hf

    created   :2018-08-08

    purpose   : 生成數(shù)據(jù)過程

    parameter        value

    p_fm_dt          2018-08-01( 昨天 )

    p_to_dt          2018-08-02( 當日 )

  *************************************************************/

  /************************************************************

    定義區(qū)間

  *************************************************************/

  v_sqlstate    varchar2 ( 500 );

  v_proc_name   varchar2 ( 64 ) := 'p_house_create_data' ;

  v_fm_dt       date ;

  v_to_dt       date ;

begin

  /************************************************************

    賦值區(qū)間

  *************************************************************/

  v_sqlstate := ' 賦值 ' ;

  v_fm_dt    := trunc (p_fm_dt, 'DD' );

  v_to_dt    := trunc (p_to_dt, 'DD' );

  /************************************************************

    計算區(qū)間

  *************************************************************/

  v_sqlstate := ' 開始 ' ;

  pkg_rpt_system.sys_log(v_proc_name, v_sqlstate, 'OK' , null , null ); -- 寫日志

  v_sqlstate := ' 刪除數(shù)據(jù) ' ;

  delete t_landlord;

  commit ;

 

  v_sqlstate := ' 生成房東信息數(shù)據(jù) ' ;

  insert into t_landlord

  values

    ( '001' , ' 張強 ' , ' ' , '13723870069' , '001' , '2010-03-12' );

  commit ;

  /************************************************************

    結(jié)束區(qū)間

  *************************************************************/

  v_sqlstate := ' 結(jié)束 ' ;

  pkg_rpt_system.sys_log(v_proc_name, v_sqlstate, 'OK' , null , null ); -- 寫日志

  /************************************************************

    異常區(qū)間

  *************************************************************/

exception

  when others then

    rollback ; -- 回滾數(shù)據(jù)

    pkg_rpt_system.sys_log(v_proc_name,

                           v_sqlstate,

                           'ERROR' ,

                           sqlcode ,

                           substr ( sqlerrm , 1 , 3000 )); -- 寫日志

    commit ;

end p_house_create_data;

 

二:包 ( 圖片左邊的 package bodies 目錄 )

其實包可以理解為是對存儲過程和函數(shù)的方便管理,如果過程和函數(shù)多了,不方便查找,比較亂,哪么我們可以把相關(guān)的過程放在一起,或把業(yè)務(wù)邏輯相關(guān)的放在一起維護。

1) 包的構(gòu)成:

a. 包頭:是對包里的過程和函數(shù)的一個定義,相關(guān)于目錄

b. 包體:是對包里的過程和函數(shù)的實現(xiàn),具體代碼的邏輯實現(xiàn)。

2) 創(chuàng)建語法:

-- 包頭

create or replace package pkg_abc_create_data is

  procedure p_house_create_data(p_fm_dt date default sysdate - 1 ,

                                p_to_dt date default sysdate );

end pkg_abc_create_data;

 

-- 包體

create or replace package body pkg_abc_create_data is

 

  procedure p_house_create_data(p_fm_dt date default sysdate - 1 ,

                                p_to_dt date default sysdate ) is

    /************************************************************

      author    :hf

      created   :2018-08-08

      purpose   : 生成數(shù)據(jù)過程

      parameter        value

      p_fm_dt          2018-08-01( 昨天 )

      p_to_dt          2018-08-02( 當日 )

    *************************************************************/

    /************************************************************

      定義區(qū)間

    *************************************************************/

    v_sqlstate  varchar2 ( 500 );

    v_proc_name varchar2 ( 64 ) := 'p_house_create_data' ;

    v_fm_dt     date ;

    v_to_dt     date ;

  begin

    /************************************************************

      賦值區(qū)間

    *************************************************************/

    v_sqlstate := ' 賦值 ' ;

    v_fm_dt    := trunc (p_fm_dt, 'DD' );

    v_to_dt    := trunc (p_to_dt, 'DD' );

    /************************************************************

      計算區(qū)間

    *************************************************************/

    v_sqlstate := ' 開始 ' ;

    pkg_rpt_system.sys_log(v_proc_name, v_sqlstate, 'OK' , null , null );

    v_sqlstate := ' 刪除數(shù)據(jù) ' ;

    delete t_landlord;

    commit ;

    v_sqlstate := ' 生成房東信息數(shù)據(jù) ' ;

    insert into t_landlord

    values

      ( '001' , ' 張強 ' , ' ' , '13723870069' , '001' , '2010-03-12' );

    commit ;

    /************************************************************

      結(jié)束區(qū)間

    *************************************************************/

    v_sqlstate := ' 結(jié)束 ' ;

    pkg_rpt_system.sys_log(v_proc_name, v_sqlstate, 'OK' , null , null );

    /************************************************************

      異常區(qū)間

    *************************************************************/

  exception

    when others then

      rollback ;

      pkg_rpt_system.sys_log(v_proc_name,

                             v_sqlstate,

                             'ERROR' ,

                             sqlcode ,

                             substr ( sqlerrm , 1 , 3000 ));

      commit ;

  end p_house_create_data;

end pkg_abc_create_data;

 


向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI