Oracle數據庫中的變量


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 NUMBER

SQL>

還有一類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進程再進入就沒有了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM