1. 程式人生 > >ORACLE 繫結變數用法總結

ORACLE 繫結變數用法總結

之前對ORACLE中的變數一直沒個太清楚的認識,比如說使用:、&、&&、DEIFINE、VARIABLE……等等。今天正好閒下來,上網搜了搜相關的文章,彙總了一下,貼在這裡,方便學習。

==================================================================================

oracle 中,對於一個提交的sql語句,存在兩種可選的解析過程, 一種叫做硬解析,一種叫做軟解析.

一個硬解析需要經解析,制定執行路徑,優化訪問計劃等許多的步驟.硬解釋不僅僅耗費大量的cpu,更重要的是會佔據重要的們閂(

latch)資源,嚴重的影響系統的規模的擴大(即限制了系統的併發行),而且引起的問題不能通過增加記憶體條和cpu的數量來解決。之所以這樣是因為門閂是為了順序訪問以及修改一些記憶體區域而設定的,這些記憶體區域是不能被同時修改。當一個sql語句提交後,oracle會首先檢查一下共享緩衝池(shared pool)裡有沒有與之完全相同的語句,如果有的話只須執行軟分析即可,否則就得進行硬分析。

而唯一使得oracle 能夠重複利用執行計劃的方法就是採用繫結變數。繫結變數的實質就是用於替代sql語句中的常量的替代變數。繫結變數能夠使得每次提交的sql語句都完全一樣。

1.

sqlplus中如何使用繫結變數,可以通過

variable來定義

從上面試驗發現繫結變數i的使用使查詢id=1id=2sqlselect *from tt where id=:i得以重複使用,從而避免了hard parse,這裡的PARSE_CALLS2包括了一次soft parse

2.

前兩天看到有人在pub上問sqlplus中通過definevariable定義的變數的區別。其實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*/