Oracle數據庫中的變量
來源:https://blog.csdn.net/wahaa591/article/details/46772769
1、define(即host變量)
define variable_name = value
顯示指定的DEFINE變量值和類型:
//使用define def_name命令顯示指定DEFINE變量的值和類型(DEFINE變量類型都為char) SQL> define num; DEFINE num = "1" (CHAR)
2、Variable(即綁定變量)
綁定變量主要是在sql中使用,達到sql解析一次,執行多次,從而提高效率的目的。綁定變量和host變量一樣,也有定義的,也有臨時性的。(臨時性的在動態sql或動態plsql中通過占位符和using使用),其他的如sql會自動使用綁定變量的情況,此處不專門討論。定義的綁定變量也是在當前session中有效。 綁定變量以下特點:
綁定變量在sql和plsql中直接引用必須加前綴 :。如要引用綁定變量a,則是 :a;
在真正運行的PLSQL程序中,比如自動運行,有自己的一套機制;
初始化和應用綁定變量,初始化定義的綁定變量,可以使用過程和函數,其中過程可以內部給綁定變量賦值、也可以參數是綁定變量,參數模式為out返回。使用函數和過程差不多,還可以使用call
函數來賦值。sqlplus中可以使用大於等於3個字符表示一個命令,這里我們用var,var命令是聲明一個綁定變量,只能給予名稱和類型,定義的時候不能賦值,賦值可以在plsql中或者采用函數賦值(而host變量定義的時候必須賦值)。
(1).語法:var var_name type
(2).聲明綁定變量//使用var聲明兩number類型的變量num1、num2
SQL> var num1 number;
SQL> var num2 number;(3).顯示指定綁定變量
//var num1命令顯示指定綁定變量名稱、數據類型
SQL> var num1
variable num1
datatype NUMBERSQL>
還有一類SQLPLUS中的變量叫substitution variables,直接翻譯過來是替代變量。一個使用替代變量的例子(來源:https://docs.oracle.com/cd/F49540_01/DOC/server.815/a66736/ch33.htm):
SQL> CLEAR BUFFER SQL> INPUT 1 SELECT &GROUP_COL, 2 MAX(&NUMBER_COL) MAXIMUM 3 FROM &TABLE 4 GROUP BY &GROUP_COL 5 SQL> SAVE STATS Created file STATS
Now run the command file STATS and respond as shown below to the prompts for values:
SQL> @STATS Enter value for group_col: JOB old 1: SELECT &GROUP_COL, new 1: SELECT JOB, Enter value for number_col: SAL old 2: MAX(&NUMBER_COL) MAXIMUM new 2: MAX(SAL) MAXIMUM Enter value for table: EMP old 3: FROM &TABLE new 3: FROM EMP Enter value for group_col: JOB old 4: GROUP BY &GROUP_COL new 4: GROUP BY JOB
這類我之前在筆記中也寫過:https://www.cnblogs.com/jiading/p/11578484.html。但是這類還有更多的文章可做,這也是我看了Oracle的官方文檔才知道的。
如果上面的例子中,我們不僅要求最大值,還要求最小值、平均值,那么SQL腳本寫出來應該是這樣的:
select &Group_col,
max(&number_col1)maximun,min(&number_col1)minimum,avg(&number_col1)average
from &table
group by &group_col
這里我試的時候給number_col改了個名,原因后面見。
那么實際輸入的時候是:
Enter value for group_col: JOB
old 1: select &Group_col,
new 1: select JOB,
Enter value for number_col1: SAL
Enter value for number_col1: SAL
Enter value for number_col1: SAL
old 2: max(&number_col1)maximun,min(&number_col1)minimum,avg(&number_col1)average
new 2: max(SAL)maximun,min(SAL)minimum,avg(SAL)average
Enter value for table: EMP
old 3: from &table
new 3: from EMP
Enter value for group_col: JOB
old 4: group by &group_col
new 4: group by JOB
可以看到,number_col1輸入了三次。
為了簡化操作,SQLPLUS提供了另外一種方式,如果將聲明中的&變成&&,它就變成了一個變量(鑒於官方文檔也沒有給它起名字,我這里也就不起了吧):
select &Group_col,
max(&&number_col1)maximun,min(&&number_col1)minimum,avg(&&number_col1)average
from &table
group by &group_col
之后輸入變成了這樣:
Enter value for group_col: JOB
old 1: select &Group_col,
new 1: select JOB,
Enter value for number_col1: SAL
old 2: max(&&number_col1)maximun,min(&&number_col1)minimum,avg(&&number_col1)average
new 2: max(SAL)maximun,min(SAL)minimum,avg(SAL)average
Enter value for table: EMP
old 3: from &table
new 3: from EMP
Enter value for group_col: JOB
old 4: group by &group_col
new 4: group by JOB
可以看到,number_col1只需要輸入一次了。
這里聲明的變量在當前回話一直有效,再次運行STATS就會發現,&&number_col1不需要輸入,而是自動填充了。這就是為什么我上面舉例子為什么要改名的原因。
消除這一個變量聲明的方法也很簡單,退出現在的SQLPLUS進程再進入就沒有了。