ORACLE 繫結變數用法總結
之前對ORACLE中的變數一直沒個太清楚的認識,比如說使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好閒下來,上網搜了搜相關的文章,彙總了一下,貼在這裡,方便學習。
==================================================================================
在oracle 中,對於一個提交的sql語句,存在兩種可選的解析過程, 一種叫做硬解析,一種叫做軟解析.
一個硬解析需要經解析,制定執行路徑,優化訪問計劃等許多的步驟.硬解釋不僅僅耗費大量的cpu,更重要的是會佔據重要的們閂(
而唯一使得oracle 能夠重複利用執行計劃的方法就是採用繫結變數。繫結變數的實質就是用於替代sql語句中的常量的替代變數。繫結變數能夠使得每次提交的sql語句都完全一樣。
1.
sqlplus中如何使用繫結變數,可以通過
從上面試驗發現繫結變數i的使用使查詢id=1和id=2的sqlselect *from tt where id=:i得以重複使用,從而避免了hard parse,這裡的PARSE_CALLS=2包括了一次soft parse
2.
前兩天看到有人在pub上問在sqlplus中通過define和variable定義的變數的區別。其實define定義的我理解不是變數而是字元常量,通過define定義之後,在通過&或者&&引用的時候不需要輸入了,僅此而已。
oracle在執行的時候自動用值進行了替換;而variable定義的是繫結變數,上面已經提到。
3.
oracle在解析sql時會把plsql中定義的變數轉為為繫結變數
另外從hard parse的資料量上其實也可以大致猜測oracle會把plsql中定義的變數轉換為繫結變數處理
這裡發現hard parse只增加了2,如果沒有使用繫結變數的話,相信hard parse會更多
4.
過程中的引數會自動轉化為繫結變數
另外也可以直觀的觀察:
在sqlplus裡執行過程不能觀察出來下面在plsql developer執行一次過程之後再來看執行的情況
很顯然oracle在執行過程時把引數轉化為繫結變量了,其實從plsql developer中執行過程時的語法就能看出來:
在輸入引數列表框上面的執行語法就是這樣的。
5.
在動態sql中使用繫結變數,動態sql中使用繫結變數非常明顯也容易理解,下面給出2個簡單的例子
=============================下面加上一些其他變數的使用方法=========================
eg001(&替換變數)
eg002(&&替換變數)
eg003
DEFINE[variable[=value]]
UNDEFINE清除定義的變數
eg004
ACCEPT variable[datatype[NUMBER|CHAR|DATE]][FORMAT format][PROMPT text][HIDE]/*variable:指定接收值的變數。該名稱的變數不存在,那麼SQL重建該變數;datatype:變數資料型別,預設為CHAR*/