• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    軟件測試數據庫中基于Oracle的高性能動態SQL程序開發

    發布: 2010-6-25 08:15 | 作者: 不詳 | 來源: 領測軟件測試網采編 | 查看: 21次 | 進入軟件測試論壇討論

    領測軟件測試網

    過程三:

    create or replace procedure find_emp(p_salary number) as

    r_emp emp%rowtype;

    type c_type is ref cursor;

    c1 c_type;

    begin

    open c1 for '

    select * from emp

    where salary >:1'

    using p_salary;

    loop

    fetch c1 into r_emp;

    exit when c1%notfound;

    dbms_output.put_line('薪水大于‘||to_char(p_salary)||’的員工為:‘);

    dbms_output.put_line('ID為'to_char(r_emp)||' 其姓名為:'||r_emp.name);

    end loop;

    close c1;

    end create_table;

    注意:在過程二中的動態SQL語句使用了占位符“:1“,其實它相當于函數的形式參數,使用”:“作為前綴,然后使用using語句將p_id在運行時刻將:1給替換掉,這里p_id相當于函數里的實參。另外過程三中打開的游標為動態游標,它也屬于動態SQL的范疇,其整個編譯和開發的過程與execute immediate執行的過程很類似,這里就不在贅述了。

    3. 動態SQL語句開發技巧

    前面分析到了,動態SQL的執行是以損失系統性能來換取其靈活性的,所以對它進行一定程度的優化也是必要的,筆者根據實際開發經驗給出一些開發的技巧,需要指出的是,這里很多經驗不僅局限于動態SQL,有些也適用于靜態SQL,在描述中會給予標注。

    技巧一:盡量使用類似的SQL語句,這樣Oracle本身通過SGA中的共享池來直接對該SQL語句進行緩存,那么在下一次執行類似語句時就直接調用緩存中已解析過的語句,以此來提高執行效率。

    技巧二:當涉及到集合單元的時候,盡量使用批聯編。比如需要對id為100和101的員工的薪水加薪10%,一般情況下應該為如下形式:

    declare

    type num_list is varray(20) of number;

    v_id num_list :=num_list(100,101);

    begin

    ...

    for i in v_id.first .. v_id.last loop

    ...

    execute immediate 'update emp

    set =salary*1.2

    where id=:1 '

    using v_id(i);

    end loop;

    end;

    對于上面的處理,當數據量大的時候就會顯得比較慢,那么如果采用批聯編的話,則整個集合首先一次性的傳入到SQL引擎中進行處理,這樣比單獨處理效率要高的多,進行批聯編處理的代碼如下:

    declare

    type num_list is varray(20) of number;

    v_id num_list :=num_list(100,101);

    begin

    ...

    forall i in v_id.first .. v_id.last loop

    ...

    execute immediate 'update emp

    set =salary*1.2

    where id=:1 '

    using v_id(i);

    end loop;

    end;

    這里是使用forall來進行批聯編,這里將批聯編處理的情形作一個小結:

    1) 如果一個循環內執行了insert,delete,update等語句引用了集合元素,那么可以將其移動到一個forall語句中。

    2) 如果select into,fetch into 或returning into 子句引用了一個集合,應該使用bulk collect 子句進行合并。

    3) 如有可能,應該使用主機數組來實現在程序和數據庫服務器之間傳遞參數。

    技巧三:使用NOCOPY編譯器來提高PL/SQL性能。缺省情況下,out類型和in out類型的參數是由值傳遞的方式進行的。但是對于大的對象類型或者集合類型的參數傳遞而言,其希望損耗將是很大的,為了減少損耗,可以采用引用傳遞的方式,即在進行參數聲明的時候引用NOCOPY關鍵字來說明即可到達這樣的效果。比如創建一個過程:

    create or replace procedure test(p_object in nocopy square)

    ...

    end;

    其中square為一個大的對象類型。這樣只是傳遞一個地址,而不是傳遞整個對象了。顯然這樣的處理也是提高了效率。

    4. 小結

    本文對動態SQL的編譯原理、開發過程以及開發技巧的討論,通過本文的介紹后,相信讀者對動態SQL程序開發有了一個總體的認識,為今后深入的工作打下一個良好的基礎。

    前面代碼部分已經在下列環境中調試成功:

    服務器端:UNIX+ORACLE9.2

    客戶端:WINDOWS2000 PRO+TOAD

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    22/2<12

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>