ORACLE中的繫結變數 講的不錯

2021-10-24 02:26:41 字數 2974 閱讀 3736

oracle中的繫結變數

一、繫結變數的作用

:variable_name(字母,數字,或者字母數字組合)

有效降低硬解析

二、繫結變數的典型用法

sql中

var x number;

exec :x :=7876;

select * from emp where empno = :x;

pl/sql中,例如

declare

vc_name varchar2(10);

begin

execute immediate 'select ename from emp where empno= :1' into vc_name using 7876;

dbms_output.put_line(vc_name);

end;

所以在pl/sql中繫結變數的標準語法為:

execute immediate 【使用繫結變數的語句】 using 對應繫結變數的具體輸入值;

pl/sql中dml語句的繫結變數典型用法

declare

v_sql1 varchar2(50);

v_sql2 varchar2(50);

v_num1 number;

v_num2 number;

begin

v_sql1 := 『insert into emp(empno,ename,sal) values(:1,:1,:1)』;

execute immediate v_sql1 using 8001,『jack』,1000;

v_num1 :=sql%rowcount; – sql%rowcount中的sql是oracle的內部游標,rowcount的意思是之前的dml sql語句影響的多少行資料

execute immediate v_sql1 using 8002,『mike』,2000;

v_num2 :=sql%rowcount;

dbms_output.put_line(v_num1+v_num2);

end;

動態sql中也可以使用繫結變數,returning 這個關鍵字可以和帶繫結變數的sql聯用,其作用是將受該sql影響的行記錄字段取出來。

三、pl/sql中批量繫結的典型用法

批量繫結:一次性處理一批資料

pl/sql引擎是指在oracle在資料庫中處理pl/sql**中除了sql語句外所有剩餘部分(如變數,迴圈,陣列,賦值)的子系統

批量繫結可以有效減少sql引擎和pl/sql引擎的互動次數

理論上來說,pl/sql中只要執行sql語句,就會有這兩個引擎的互動,實際上這兩個引擎互動產生的效能影響主要體現在以下兩個方面

1、當顯式游標或者參考游標需要迴圈執行fetch操作時,這時迴圈由pl/sql執行,fetch中的sql由sql引擎執行,這樣每fetch一條記錄,就需要兩個引擎互動一次

2、 當顯式游標或者參考游標的迴圈內部需要執行sql語句,跟上面一樣,也是每執行一次,需要互動一次

所以當fetch一批記錄,或者一次執行一批sql,就會大大提高pl/sql的效率

批量fetch對應的語法

fetch cursorname bulk colletc into 【自定義的陣列】

pl/sql中批量執行一批sql的語法

forall i in 1…[自定義陣列長度】

execute immediate [帶繫結變數的sql] using [繫結變數輸入值】

declare

cur_emp sys_refcursor;

v_sql varchar2(4000);

type namelist is table of varchar2(10);

enames namelist;

cn_batch_size constant pls_integer :=1000;

begin

v_sql:= 『select ename from emp where empno> :1』;

open cur_emp for v_sql using 7900;

loop

fetch cur_emp bulk collect into enames limit cn_batch_size;

for i in 1..enames.count loop

dbms_output.put_line(enames(i));

end loop;

exit when enames.count四、繫結變數分級(bind graduation)

根據文字型繫結變數的定義長度而將這些繫結變數分成四級

1、32位元組(bytes)以內第一級 分配32位元組

2、33–128位元組第二級 分配120位元組

3、129–2000位元組第** 分配2000位元組

4、2000位元組以上第四級 ,按實際繫結變數大小,小於等於2000則分配2000位元組,大於2000則分配4000位元組

注意 oracle只對文字型繫結變數分級,數值型的統一分配22位元組,另外乙個重要知識點,在pl/sql中,要是文字繫結變數的定義長度發生了變化,因為child cursor 裡儲存了該繫結變數的長度和型別,所以這個sql就會新做硬解析。因此,為了避免不必要的硬解析, 在pl/sql中,定義文字繫結變數是,最好統一定義長度,比如varchar2(4000);

五、目標sql中的繫結變數不宜過多

六、如何得到已執行sql中繫結變數的值

v$sql_bind_capture,如果已經被aged out 除shared pool,則可以看另外兩張dba_hist_sqlstat,dba_hist_sqlbind

滿足下列條件之一,含有繫結變數的目標sql中的繫結變數值會**獲,然後可以從v$sql_bind_capture中查詢到

1、該sql做的是硬解析

2、該sql做的是軟解析或軟軟解析,這是每隔15分鐘,捕獲一次值

注意對繫結變數值的捕獲只在where 語句中的繫結變數,其他比如insert中的值不會**獲

在oracle中繫結變數的使用

不使用繫結變數而使用硬編碼是oracle效能問題的主要原因和可伸縮性的主要障礙 而且這種障礙是除了使用繫結變數以外很難改變的!下面根據乙個簡單的試驗來檢視硬編碼與使用繫結變數對效能的影響 在乙個查詢中我們可以使用兩種方式 比如查詢個人編號 select from ac01 where aac001 ...

oracle 繫結變數的用法

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

ns2中變數的繫結

asrmagnet asrmagent bind pdistance pdistance 實變數 bind requerstor requestor 整形變數 bind time lastsent lastsesssent 時間變數 bind bw ctrlimit ctrlbwlimit 帶框變數...