日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle变量绑定代码,Oracle 绑定变量

發(fā)布時(shí)間:2024/9/18 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle变量绑定代码,Oracle 绑定变量 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

oracle?中,對(duì)于一個(gè)提交的sql語句,存在兩種可選的解析過程,一種叫做硬解析,一種叫做軟解析.https://www.cndba.cn/Dave/article/1275

一個(gè)硬解析需要經(jīng)解析,制定執(zhí)行路徑,優(yōu)化訪問計(jì)劃等許多的步驟.硬解釋不僅僅耗費(fèi)大量的cpu,更重要的是會(huì)占據(jù)重要的們閂(latch)資源,嚴(yán)重的影響系統(tǒng)的規(guī)模的擴(kuò)大(即限制了系統(tǒng)的并發(fā)行),?而且引起的問題不能通過增加內(nèi)存條和cpu的數(shù)量來解決。

之所以這樣是因?yàn)殚T閂是為了順序訪問以及修改一些內(nèi)存區(qū)域而設(shè)置的,這些內(nèi)存區(qū)域是不能被同時(shí)修改。當(dāng)一個(gè)sql語句提交后,oracle會(huì)首先檢查一下共享緩沖池(shared?pool)里有沒有與之完全相同的語句,如果有的話只須執(zhí)行軟分析即可,否則就得進(jìn)行硬分析。而唯一使得oracle能夠重復(fù)利用執(zhí)行計(jì)劃的方法就是采用綁定變量。綁定變量的實(shí)質(zhì)就是用于替代sql語句中的常量的替代變量。綁定變量能夠使得每次提交的sql語句都完全一樣。

綁定變量只是起到占位的作用,同名的綁定變量并不意味著在它們是同樣的,在傳遞時(shí)要考慮的是傳遞的值與綁定變量出現(xiàn)順序的對(duì)位,而不是綁定變量的名稱。

綁定變量是在通常情況下能提升效率,非正常的情況如下:https://www.cndba.cn/Dave/article/1275

在字段(包括字段集)建有索引,且字段(集)的集的勢(shì)非常大(也就是有個(gè)值在字段中出現(xiàn)的比例特別的大)的情況下,使用綁定變量可能會(huì)導(dǎo)致查詢計(jì)劃錯(cuò)誤,因而會(huì)使查詢效率非常低。這種情況最好不要使用綁定變量。

但是并不是任何情況下都需要使用綁定變量,下面是兩種例外情況:1.對(duì)于隔相當(dāng)一段時(shí)間才執(zhí)行一次的SQL語句,這是利用綁定變量的好處會(huì)被不能有效利用優(yōu)化器而抵消2.數(shù)據(jù)倉庫的情況下。

綁定變量不能當(dāng)作嵌入的字符串來使用,只能當(dāng)作語句中的變量來用。不能用綁定變量來代替表名、過程名、字段名等.

從效率來看,由于oracle10G放棄了RBO,全面引入CBO,因此,在10G中使用綁定變量效率的提升比9i中更為明顯。

舉例:

普通sql語句:

SELECT?fname,?lname,?pcode?FROM?cust?WHERE?id?=?674;SELECT?fname,?lname,?pcode?FROM?cust?WHERE?id?=?234;SELECT?fname,?lname,?pcode?FROM?cust?WHERE?id?=?332;含綁定變量的sql語句:SELECT?fname,?lname,?pcode?FROM?cust?WHERE?id?=?:cust_no;

Sql*plus?中使用綁定變量:

SQL>?set?timing?on

SQL>?exec?:x?:=8

PL/SQL?過程已成功完成。

已用時(shí)間:??00:?00:?00.03

SQL>?select?*?from?A;

ID

----------

3

5

已用時(shí)間:??00:?00:?00.06

SQL>?insert?into?A?values(:x);

已創(chuàng)建?1行。

已用時(shí)間:??00:?00:?00.01

SQL>?select?*?from?A;

ID

----------

3

8

5

已用時(shí)間:??00:?00:?00.01

PL/SQL很多時(shí)候都會(huì)自動(dòng)綁定變量而無需編程人員操心,即很多你寫得sql語句都會(huì)自動(dòng)利用綁定變量,如下例所示:SQL>?Set?timing?on

SQL>?declare

2??I?NUMBER;

3??BEGINhttps://www.cndba.cn/Dave/article/1275

4??FOR?I?IN?1..1000?LOOP

5??INSERT?INTO?A?VALUES(I);

6??end?loop;

7??end;

8??/https://www.cndba.cn/Dave/article/1275

PL/SQL?過程已成功完成。

已用時(shí)間:??00:?00:?00.12

https://www.cndba.cn/Dave/article/1275

這段代碼是不需要使用綁定變量的方法來提高效率的,ORACLE會(huì)自動(dòng)將其中的變量綁定。

https://www.cndba.cn/Dave/article/1275

SQL>?create?table?D?(?id?varchar(10));

表已創(chuàng)建。

已用時(shí)間:??00:?00:?00.50

SQL>?declare

2??i?number;

3??sqlstr?varchar(2000);

4??begin

5??for?i?in?1..1000?loop

6??sqlstr?:='?insert?into?d?values('||to_char(i)||')';

7??execute?immediate?sqlstr;

8??end?loop;

9??end;

10??/

已用時(shí)間:??00:?00:?00.68

這段代碼同樣是執(zhí)行了1000條insert語句,但是每一條語句都是不同的,因此ORACLE會(huì)把每條語句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用綁定變量將循環(huán)中的語句改為

2??i?number;

3??sqlstr?varchar(2000);

4??begin

6??sqlstr?:='?insert?into?d?values(:i)';

7??execute?immediate?sqlstr?using?i;

8??end?loop;

9??end;

10??/

PL/SQL?過程已成功完成。

已用時(shí)間:??00:?00:?00.18

這樣執(zhí)行的效率就高得多了。

在PL/SQL中,引用變量即是引用綁定變量。但是在pl/sql中動(dòng)態(tài)sql并不是這樣。

在vb,java以及其他應(yīng)用程序中都得顯式地利用綁定變量。對(duì)于綁定變量的支持不僅僅限于oracle,其他RDBMS向SQL?SERVER也支持這一特性。

總結(jié)

以上是生活随笔為你收集整理的oracle变量绑定代码,Oracle 绑定变量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。