繫結變數效果測試

2021-04-12 22:12:12 字數 2795 閱讀 3503

今天看了一些書關於繫結變數所以做了如下測試

資源表t_ac01內容100000左右

然後建立測試表test

create table tset as select * from t_ac01 where rownum<1;

建立測試過程1使用繫結變數

create or replace procedure test1

ascursor cur_ac01 is

select aac001

from t_ac01

where rownum < 1000;

str_aac001  varchar2(10);    --個人編號

str_excsql  varchar2(255);

begin

open cur_ac01 ;

fetch cur_ac01 into str_aac001;

while(cur_ac01%found)

loop

str_excsql:='insert into test select * from t_ac01 where aac001 = :var';

execute immediate str_excsql using str_aac001;

fetch cur_ac01 into str_aac001;

end loop;

end; 

建立測試過程2不使用繫結變數

create or replace procedure justtest

ascursor cur_ac01 is

select aac001

from t_ac01

where rownum < 1000;

str_aac001  varchar2(10);    --個人編號

str_excsql  varchar2(255);

begin

open cur_ac01 ;

fetch cur_ac01 into str_aac001;

while(cur_ac01%found)

loop

str_excsql:='insert into test select * from t_ac01 where aac001 = '||str_aac001;

execute immediate str_excsql ;

fetch cur_ac01 into str_aac001;

end loop;

end;

然後對兩個表分別執行

過程1執行時間0.204秒

過程2執行時間4.016秒 果然當使用動態sql的時候使用繫結變數對效果的提公升很明顯

當sql中乙個sql對同一變數多次使用該如何寫呢做如下測試

drop table test;

create table test (name1 varchar2(10),name2 varchar2(10),name3 varchar2(10));

create or replace procedure test_m

ascursor cur_ac01 is

select aac001

from t_ac01

where rownum < 1000;

str_aac001  varchar2(10);    --個人編號

str_excsql  varchar2(255);

begin

open cur_ac01 ;

fetch cur_ac01 into str_aac001;

while(cur_ac01%found)

loop

str_excsql:='insert into test (name1,name2,name3)values(:var1,:var1,:var1)';

execute immediate str_excsql using str_aac001;

fetch cur_ac01 into str_aac001;

end loop;

end;

執行過程

sql> exec test_m;

begin test_m; end;

ora-01008: 並非所有變數都已關聯

ora-06512: 在"medicare.test_m", line 15

ora-06512: 在line 1

這個寫法是錯的

create or replace procedure test_m

ascursor cur_ac01 is

select aac001

from t_ac01

where rownum < 1000;

str_aac001  varchar2(10);    --個人編號

str_excsql  varchar2(255);

begin

open cur_ac01 ;

fetch cur_ac01 into str_aac001;

while(cur_ac01%found)

loop

str_excsql:='insert into test (name1,name2,name3)values(:var1,:var1,:var1)';

execute immediate str_excsql using str_aac001,str_aac001,str_aac001;

fetch cur_ac01 into str_aac001;

end loop;

end;

編譯過程再次執行成功

所以多次用乙個變數也要順序寫出來

pl sql 繫結變數

在oracle 中,對於乙個提交的sql語句,存在兩種可選的解析過程,一種叫做硬解析,一種叫做軟解析.乙個硬解析需要經解析,制定執行路徑,優化訪問計畫等許多的步驟.硬解析不僅僅耗費大量的cpu,更重要的是會佔據重要的們閂 latch 資源,嚴重的影響系統的規模的擴大 即限制了系統的並發行 而且引起的...

繫結變數窺測

事物都存在兩面性,繫結變數對大多數oltp處理是適用的,但是也有例外。比如在where條件中的字段是 傾斜字段 的時候。傾斜字段 指該列中的絕大多數的值都是相同的,比如一張人口調查表,其中 民族 這列,90 以上都是漢族。那麼如果乙個sql語句要查詢30歲的漢族人口有多少,那 民族 這列必然要被放在...

oracle變數繫結

一 游標 游標可以理解為sql語句的乙個控制代碼,也叫sql語句的指標,游標指向一條sql語句,oracle會話要執行一條sql時,首先要開啟游標。二 sql解析的過程 硬解析步驟 1.對sql語句進行語法檢查,看是否有語法錯誤 2.通過資料字典,檢查sql語句中涉及的物件和列是否存在 3.檢查sq...