綁定變量是指在sql語句的條件中使用變量而不是常量。好比shared pool裏有兩條sql語句,算法
select * from tab1 where col1=1;sql
select * from tab1 where col1=2;數據庫
對oracle數據庫來講,這是兩條徹底不一樣的SQL,對這兩條語句都須要進行hard parse。由於oracle會根據sql語句的文本去計算每一個字符在內存裏的hash值,所以雖然上述兩條SQL只有一個字符不同,oracle根據hash算法在內存中獲得的hash地址就不同,因此oracle就會認爲這是兩條徹底不一樣的語句。而若是將上述SQL改寫成select * from tab1 where col1=:var1;,而後經過對變量var1的賦值去查詢,那麼oracle對這條語句第一次會進行hard parse,之後就只進行soft parse。假設某條語句被重複執行了幾十萬次,那麼使用bind var帶來的好處是巨大的。oracle
下面給你們列舉一個在存儲過程當中使用綁定變量的例子ide
SQL> declare 視頻
2 v_sql_text varchar2(1000);教程
3 empno_no varchar2(10);內存
4 dept_no varchar2(10); get
5 beginhash
6 empno_no:=7788;
7 dept_no:=30;
v_sql_text:='update emp set comm=10000 where empno=:1 and deptno=:2';
execute immediate v_sql_text using empno_no,dept_no;
10 end;
11 /
PL/SQL procedure successfully completed.
執行完畢以後,查看v$sql這個視圖,查詢執行狀況
SQL> select SQL_TEXT,SQL_ID,PARSE_CALLS,EXECUTIONS from v$sql where sql_text like 'update emp set comm=10000 where empno=%';
SQL_TEXT SQL_ID PARSE_CALLS EXECUTIONS
------------------------------------------------------------ -------------------- ----------- ----------
update emp set comm=10000 where empno=:1 and deptno=:2 1zrg4pnp8td77 1 1
而後更改查詢謂語,將empno=7788,deptno=30改成empno=7369,deptno=20,而後執行上面的存儲過程
SQL> declare
2 v_sql_text varchar2(1000);
3 empno_no varchar2(10);
4 dept_no varchar2(10);
5 begin
6 empno_no:=7369;
7 dept_no:=20;
v_sql_text:='update emp set comm=10000 where empno=:1 and deptno=:2';
execute immediate v_sql_text using empno_no,dept_no;
10 end;
11 /
PL/SQL procedure successfully completed.
執行完畢以後,查看v$sql這個視圖,查詢執行狀況
SQL> select SQL_TEXT,SQL_ID,PARSE_CALLS,EXECUTIONS from v$sql where sql_text like 'update emp set comm=10000 where empno=%';
SQL_TEXT SQL_ID PARSE_CALLS EXECUTIONS
------------------------------------------------------------ -------------------- ----------- ----------
update emp set comm=10000 where empno=:1 and deptno=:2 1zrg4pnp8td77 2 2
從上面能夠看出第二次執行存儲過程時候,oracle沒有再進行硬解析,而是調用sql_id爲「1zrg4pnp8td77」生成的執行計劃
oracle視頻教程請關注:http://down.51cto.com/4202939/up