共計(jì) 2568 個(gè)字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。
這篇文章主要講解了“怎么使用 ORACLE 中的綁定變量”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“怎么使用 ORACLE 中的綁定變量”吧!
一、綁定變量的作用
:variable_name(字母,數(shù)字,或者字母數(shù)字組合)
有效降低硬解析
二、綁定變量的典型用法
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 中綁定變量的標(biāo)準(zhǔn)語法為:
execute immediate【使用綁定變量的語句】 using 對(duì)應(yīng)綁定變量的具體輸入值;
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 的內(nèi)部游標(biāo),rowcount 的意思是之前的 dml sql 語句影響的多少行數(shù)據(jù)
execute immediate v_sql1 using 8002, mike ,2000;
v_num2 :=sql%rowcount;
dbms_output.put_line(v_num1+v_num2);
end;
動(dòng)態(tài) sql 中也可以使用綁定變量,returning 這個(gè)關(guān)鍵字可以和帶綁定變量的 SQL 聯(lián)用,其作用是將受該 SQL 影響的行記錄字段取出來。
三、pl/sql 中批量綁定的典型用法
批量綁定:一次性處理一批數(shù)據(jù)
pl/sql 引擎是指在 Oracle 在數(shù)據(jù)庫中處理 pl/sql 代碼中除了 SQL 語句外所有剩余部分(如變量,循環(huán),數(shù)組,賦值)的子系統(tǒng)
批量綁定可以有效減少 SQL 引擎和 pl/sql 引擎的交互次數(shù)
理論上來說,pl/sql 中只要執(zhí)行 SQL 語句,就會(huì)有這兩個(gè)引擎的交互,實(shí)際上這兩個(gè)引擎交互產(chǎn)生的性能影響主要體現(xiàn)在以下兩個(gè)方面
1、當(dāng)顯式游標(biāo)或者參考游標(biāo)需要循環(huán)執(zhí)行 fetch 操作時(shí),這時(shí)循環(huán)由 pl/sql 執(zhí)行,fetch 中的 SQL 由 SQL 引擎執(zhí)行,這樣每 fetch 一條記錄,就需要兩個(gè)引擎交互一次
2、當(dāng)顯式游標(biāo)或者參考游標(biāo)的循環(huán)內(nèi)部需要執(zhí)行 SQL 語句,跟上面一樣,也是每執(zhí)行一次,需要交互一次
所以當(dāng) fetch 一批記錄,或者一次執(zhí)行一批 SQL,就會(huì)大大提高 pl/sql 的效率
批量 fetch 對(duì)應(yīng)的語法
fetch cursorname bulk colletc into【自定義的數(shù)組】limit cn_batch_size
pl/sql 中批量執(zhí)行一批 SQL 的語法
forall i in 1..[自定義數(shù)組長度】
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 cn_batch_size;
end loop;
close cur_emp;
end;
四、綁定變量分級(jí)(bind graduation)
根據(jù)文本型綁定變量的定義長度而將這些綁定變量分成四級(jí)
1、32 字節(jié)(bytes) 以內(nèi)第一級(jí) 分配 32 字節(jié)
2、33–128 字節(jié)第二級(jí) 分配 120 字節(jié)
3、129–2000 字節(jié)第三級(jí) 分配 2000 字節(jié)
4、2000 字節(jié)以上第四級(jí),按實(shí)際綁定變量大小,小于等于 2000 則分配 2000 字節(jié),大于 2000 則分配 4000 字節(jié)
注意 oracle 只對(duì)文本型綁定變量分級(jí),數(shù)值型的統(tǒng)一分配 22 字節(jié),另外一個(gè)重要知識(shí)點(diǎn),在 pl/sql 中,要是文本綁定變量的定義長度發(fā)生了變化,因?yàn)?child cursor 里存儲(chǔ)了該綁定變量的長度和類型,所以這個(gè) sql 就會(huì)新做硬解析。因此,為了避免不必要的硬解析,在 pl/sql 中,定義文本綁定變量是,最好統(tǒng)一定義長度,比如 varchar2(4000);
五、目標(biāo) sql 中的綁定變量不宜過多
六、如何得到已執(zhí)行 sql 中綁定變量的值
V$SQL_BIND_CAPTURE,如果已經(jīng)被 aged out 除 shared pool, 則可以看另外兩張 dba_hist_sqlstat,dba_hist_sqlbind
滿足下列條件之一,含有綁定變量的目標(biāo) sql 中的綁定變量值會(huì)被捕獲,然后可以從 v$sql_bind_capture 中查詢到
1、該 sql 做的是硬解析
2、該 SQL 做的是軟解析或軟軟解析,這是每隔 15 分鐘,捕獲一次值
注意對(duì)綁定變量值的捕獲只在 where 語句中的綁定變量,其他比如 insert 中的值不會(huì)被捕獲
感謝各位的閱讀,以上就是“怎么使用 ORACLE 中的綁定變量”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)怎么使用 ORACLE 中的綁定變量這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!