替換變量可看作是占位符
一、 單個&符號替換
SQL語句中最基本、最普遍元素替換形式是單個&符號替換。&符號是用來在語句中指定替換變量的符號。當執行語句時,Oracle服務器處理語句,發現替換變量,並嘗試用下面兩種方法之一來解析變量的值。首先,它檢查在用戶會話中是否定義了該變量(DEFINE命令)。倘若沒有,用戶進程會提示輸入一個值,這個值會替換變量。
如下所示:
SQL> select ename,sal from emp where empno=&number; Enter value for number: 7934 old 1: select ename,sal from emp where empno=&number new 1: select ename,sal from emp where empno=7934 ENAME SAL ---------- ---------- MILLER 1300
二、&&符號替換
倘若在多次查詢中用到同一替換變量,且該替換變量的值不變,可用&&替換。當oracle服務器遇到&&替換變量時,用進程會提示輸入一個值,該值即為該變量的會話值,當后續查詢引用該替換變量時,會直接替換為該變量會話值,用戶進程不再提示輸入值。
如下所示:
SQL> select ename,sal from emp where empno=&&number; -->> 注意,&&符號替換,第一次出現,會提示輸入值 Enter value for number: 7934 -->> 輸入值 old 1: select ename,sal from emp where empno=&&number new 1: select ename,sal from emp where empno=7934 ENAME SAL ---------- ---------- MILLER 1300 SQL> select ename,sal from emp where empno=&number; -->> 直接引用,不再提示輸入新值 old 1: select ename,sal from emp where empno=&number new 1: select ename,sal from emp where empno=7934 ENAME SAL ---------- ---------- MILLER 1300 SQL> select ename,sal from emp where empno=&&number; -->> 第二次出現,同樣不再提示輸入值,number在整個會話期間始終有效 old 1: select ename,sal from emp where empno=&&number new 1: select ename,sal from emp where empno=7934 ENAME SAL ---------- ---------- MILLER 1300
三、替換列名
上述替代變量替代的基本上是where子句中的元素,但實際上SQL語句中的任何元素都是可以替換的對象。如下所示,第三列被替換:
SQL> select empno,ename,&&col from emp order by &col; -->> 第三列即為替換變量 Enter value for col: sal -->> 在這里,我們既可以選sal,也可以選擇hiredate old 1: select empno,ename,&&col from emp order by &col new 1: select empno,ename,sal from emp order by sal EMPNO ENAME SAL ----- ---------- ---------- 7369 SMITH 800 7900 JAMES 950 7876 ADAMS 1100 7521 WARD 1250 ...
四、 替換表達式和文本
在運行時幾乎可以替換SQL語句的任何元素。條件是Oracle要求至少第一個單詞是靜態的。在SELECT語句中,至少需要SELECT關鍵字不變,如下所示:
SQL> select &rest_of_statements; Enter value for rest_of_statements: ename from emp where empno=7839 old 1: select &rest_of_statements new 1: select ename from emp where empno=7839 ENAME ---------- KING
五、 DEFINE
當相同變量在語句中多次出現時,可以使用&&替換來避免重復輸入。當出現&&替換時,變量被保存為會話變量。隨着語句的進行,會使用保存的會話變量自動解析所有后續出現的該變量。這不一定是用戶需要的,此時,可以使用UNDEFINE variable來解除,如上文中的UNDEFINE col,UNDEFINE number。
DEFINE命令有兩個目的:它可用來檢索SQL會話中當前定義的所有變量列表;還可用來顯式定義會話期間在一個或者多個語句中作為替換變量引用的變量的值。語法分別如下所示:
DEFINE;
DEFINE variable=value;
替換變量使用的前綴通常是 & 或者 &&。這是標識替換變量的默認字符。在SQL*PLus中,使用一個特殊的SET命令選項,就可以把默認的字符(&)修改為其他字符,或者禁用替換變量特性。SET命令的語法如下:
SET DEFINE character;
SET DEFINE ON;
SET DEFINE OFF;
第一個SET命令選項會把替換變量的前綴從&修改為其他字符。這個字符不能為數字或者空白字符。第二個命令選項和第三個命令選項控制SQL*Plus是否會查找替換變量。除此之外,ON選項會把替換字符重修修改為&。
六、 VERIFY命令
操作Oracle服務器時可以使用兩類命令:SQL語言命令和SQL客戶控制命令。SELECT語句是語言命令,而SET命令控制SQL客戶環境。有許多不同的語言和控制命令可用,但與替換有關的控制命令是DEFINE和VERIFY。
VERIFY命令控制提交的替換變量是否顯示到屏幕上,以便驗證替換是否正確。顯示的消息由舊子句和包含替換變量的輸入值的新子句組成。如下所示:
SQL> select ename,sal from emp where empno=&number; Enter value for number: 7788 old 1: select ename,sal from emp where empno=&number new 1: select ename,sal from emp where empno=7788 ENAME SAL ---------- ---------- SCOTT 3000 SQL> set verify off SQL> select ename,sal from emp where empno=&number; Enter value for number: 7788 ENAME SAL ---------- ---------- SCOTT 3000