今天看了一些書關於繫結變數所以做了如下測試
資源表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...