oracle技術之如何綁定變量

綁定變量是指在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

相關文章
相關標籤/搜索