Oracle 資料庫的繫結變數特性及應用

2021-05-17 18:16:32 字數 3994 閱讀 9193

繫結變數(binding variable),共享池(shared buffer pool), sga(system global area);

在開發乙個資料庫系統前,有誰對oracle 系統了解很多,尤其是它的特性,好象很少吧;對初學者來講,這更是不可能的事情;僅僅簡單掌握了sql的寫法,就開始了資料庫的開發,其結果只能是開發乙個沒有效率,也沒有可擴充套件的系統;

j8m*ua$_g*t[`u0 因此,我寫這個主題也是希望讓大家更多地掌握oracle資料庫的特性,從而在架構乙個新系統時,能考慮系統的可擴充套件,可伸縮性,也兼顧系統的效率和穩定;itpub個人空間'm/jsi'b /'^h

vm e#u!v/[0 使用繫結變數是oracle資料庫的特性之一;於是大家要問,為什麼使用,怎樣使用,它的使用限制條件是什麼?我會按照這樣的想法去解答大家的疑問,我也會以舉例子的方式來回答這些問題;

1. 為什麼使用繫結變數?itpub個人空間 mh,tmh%@ v/f

這是解決oracle應用程式可伸縮性的乙個關鍵環節;而oracle的共享池就決定了開發人員必須使用繫結變數;如果想要oracle 執行減慢,甚至完全終止,那就可以不用繫結變數;itpub個人空間ao/}4e&qu]

這裡舉例說明上述問題;itpub個人空間 t:ug)y]

為了查詢乙個員工代號是123,你可以這樣查詢:

asb$c&gx dr,k0 select * from emp where empno=』123』;itpub個人空間9k9ki^0s w

你也可以這樣查詢:itpub個人空間gu'pp8m @j5eb-kg'xaq

set echo on;(把執行結果顯示出來)

8hl!o�f.z c0 alter system flush shared_pool;itpub個人空間8k,v0y#no6n+c

這條語句是清空共項池,每次都必須使用,確保共享池是空的,以提高執行效率;itpub個人空間&jr%d&jzxy.x

set timing on(開啟記時器.)

declare

$`8q�n|cw [0 type rc is ref cursor;itpub個人空間.i9bm [`w,e

l_rc rc;itpub個人空間eyg3zc6g"u.n0m`

l_dummy all_objects.object_name%type;itpub個人空間 fi(x,n|l

l_start number default dbms_utility.get_time;

-_yo1kb+}�/0 beginitpub個人空間#v'hvx:m�e

for i in 1 .. 1000

g.ot&h `&p`!g4v s0 loopitpub個人空間a�oe ]+]6wn

open l_rc foritpub個人空間hfk(uxy9l| y�m.y

'select object_name

t/}f(fu9l@(zx0 from all_objects

i)t1g bq1k0r)~0 where object_id = ' || i;itpub個人空間c r,p@ e

fetch l_rc into l_dummy;itpub個人空間p)jk4?h}+j

close l_rc;

9t/y(gy)~1zw@0 end loop;

ihdzfg5j&c0 dbms_output.put_lineitpub個人空間q*c"t4w u

( round( (dbms_utility.get_time-l_start)/100, 2 ) ||itpub個人空間|fa,n~m

' seconds...' );itpub個人空間.jgu_y#zva

end;

rnd%s/w9i0 /

~r k6x#]"b.y0 pl/sql 過程已成功完成。

0wxp%t x&ou+};j0 這是乙個使用的繫結變數(吃藥後):

i fbi)? x1j0 set echo on

alter system flush shared_pool;itpub個人空間}w"kp!do6t'l|uk x

declareitpub個人空間k.y4/-o#d%oo

type rc is ref cursor;

_ra^1m0l#v*_0 l_rc rc;

*vou;wb c/a|'b1|0 l_dummy all_objects.object_name%type;itpub個人空間/mp8i�lj3o"]dn

l_start number default dbms_utility.get_time;itpub個人空間s|.l$wy�q8d0[1d

beginitpub個人空間�xl&lv hsw#b9wh

for i in 1 .. 1000itpub個人空間;p(wuhta.a

loop

'f5?(z8[?9q0 open l_rc for

oi*g,fx^)n ko0 'select object_nameitpub個人空間*o5fo-j y%m]f3f

from all_objects

l8gi4z@u7]a"~|0 where object_id = :x'itpub個人空間/r�^gk s y*{

using i;

fln%x z0 fetch l_rc into l_dummy;itpub個人空間u~-z| y#ws

close l_rc;

wl/#braq.r0 end loop;itpub個人空間)a)/"gtr

dbms_output.put_lineitpub個人空間/fd uy8j+u.t

( round( (dbms_utility.get_time-l_start)/100, 2 ) ||itpub個人空間c(zmb(eec

' seconds...' );itpub個人空間imq8al:fa

end;itpub個人空間r4lhs7c'f y

pl/sql 過程已成功完成。

大家自己比較結果,相差就是乙個數量級;使用繫結變數不僅僅是執行快,而且允許多個使用者同時使用;

上述的環境是在資料庫oracle 8.1.7, 作業系統: windowsserver2003,記憶體 1g , cpu: p4 3.4ghz ; 電腦配置不同,執行的結果是有差異的;

2. 怎樣使用繫結變數?

9`y? t;on9o f0 下面舉例說明:

!o~5o.m&zi0 2.1.讓oracle自己繫結變數(也叫靜態繫結變數)

set serverout on;

0qz6v"yg*i8m0 set timing on;

.ca,_ [.e"d^"n0 declareitpub個人空間i7q~5l*[f�r

l_sql varchar2(2000);itpub個人空間c|(^v!a�m

l_count number;itpub個人空間 hdvg o;f#cg

l_param1 varchar2(100);

"?%h l2i"z's,v0 l_param2 varchar2(100);itpub個人空間6c5g2@!ecb)@

begin

;o8b;g pbh4[(t:t%m)[0 l_param1:='a';

vp6h-?x"r ks@ e7p0 l_param2:='b';

xvn'pyle.n/n x0 select count(*) into l_count from table1 where col_1=l_param1 and col_2=l_param2;itpub個人空間xr ]8zevc

dbms_output.put_line(l_count);

$za ozq.t0 end;itpub個人空間vp�t7qb"o!u

//t @ ](rmd qv0 在上面的情況,oracle會自己繫結變數,即,如果引數儲存在乙個陣列中,select語句放在乙個迴圈中,

%wh%djc,a0 select 語句只會編譯一次。

2.2 .動態繫結變數

cb+x*bx)kpq$c0 set serverout on;itpub個人空間:v[q�ri&p

資料庫優化 ORACLE動態繫結變數

oracle 將已解析 已編譯的sql 連同其他內容儲存在共享池 shared pool 中,這是系統全域性區 system global area sga 中乙個非常重要的共享記憶體結構。但是已解析,已編譯的sql要想實現其復用有乙個前提,要求開發人員在大多數情況下都會使用繫結變數。繫結變數 bi...

資料庫開發之繫結變數

對於每個程式開發人員來說,資料庫的知識都是或多或少的了解些,都能編寫一些sql語句,即使不會也可以使用一些工具來生成sql語句,因此資料庫在很多時候被認為是沒有必要研究的。隨著系統使用人數增加,系統也遇到了瓶頸,於是開發人員高呼 給我記憶體與cpu,系統將會faster 可是作為盈利性企業,投入與回...

oracle 繫結變數的用法

1.前言。oracle10g後,使用繫結變數更能提高效率。以下 的文章。讓oracle自己繫結變數 set serverout on set timing on declare l sql varchar l count number l param varchar l param varchar ...