程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle變量定義的三種方式(define,variable,declare)學習筆記

Oracle變量定義的三種方式(define,variable,declare)學習筆記

編輯:Oracle教程

Oracle變量定義的三種方式(define,variable,declare)學習筆記


1、define(即host變量)

Host變量主要作用是起到一個替代變量的作用,是主機環境可以和oracle進行交互的一個媒介。 通過define定義host變量的時候必須指定變量名和變量的值,如果變量名已經存在於host變量中,則自動覆蓋,這個值不可以指定類型,一律按char存儲。 DEFINE 變量只在當前session環境中有效。

(1).語法:

define variable_name = value

(2).聲明和初始化DEFINE變量

//聲明define變量的時候必須同時初始化賦值變量
SQL> define num=1;

另外可以使用define命令顯示單個(define variable_name,不能顯示多個)或全部(define)的host變量的值和類型(類型都是char)。


(3).顯示指定的DEFINE變量值和類型

//使用define def_name命令顯示指定DEFINE變量的值和類型(DEFINE變量類型都為char)
SQL> define num;
DEFINE num              = "1" (CHAR)

(4).顯示所有的DEFINE變量值和類型

//使用define顯示所有DEFINE變量的值和類型(DEFINE變量類型都為char)
SQL> define
DEFINE _CONNECT_IDENTIFIER = "TOPPROD" (CHAR)
DEFINE _SQLPLUS_RELEASE = "902000100" (CHAR)
DEFINE _EDITOR         = "Notepad" (CHAR)
DEFINE _O_VERSION      = "Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Producti
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (CHAR)
DEFINE _O_RELEASE      = "1102000300" (CHAR)

了解對於host變量啟用和關閉的命令是:set define on和set define off。


(5).關閉DEFINE變量定義功能

//關閉define
SQL> set define off;
SQL> define num=1;
SQL> select * from occ_file where rownum=#

select * from occ_file where rownum=&num

ORA-01008: 並非所有變量都已綁定

(6).開啟DEFINE變量定義功能

//打開define
SQL> set define on;
SQL> define num=1;
SQL> select * from occ_file where rownum=#

OCC01      OCC02
---------- ---------------
020040     松榮五金-SRWJ

(7).引用DEFINE變量

這在sqlplus和plsql developer的command window中都可以使用,在sql或plsql中引用host變量,使用&符號,相當於一個簡單的替換動作,比如

//錯誤案例
SQL> define x=occ_file;
SQL> select * from '&x' where rownum=1;

select * from 'occ_file' where rownum=1

ORA-00903: 表名無效

SQL>

報錯是因為x被替換為occ_file,語句變為select * from ’occ_file’,’occ_file’表是不存在的,多了個單引號。

//正確案例
SQL> define x=occ_file;
SQL> select * from &x where rownum=1;

OCC01      OCC02
---------- ---------------
020040     松榮五金-SRWJ

SQL>

(8).引用臨時DEFINE變量

可以不預先聲明初始化define變量,直接在sql或plsql中在字符串前面加&符號,會提示你輸入變量的值,然後替換。這種情況下是臨時的變量,define命令查不到

//不預先聲明和初始化define變量直接使用&引用

SQL> select * from &y where rownum=1;

//彈框提示輸入變量y的值,輸入occ_file,後打印出一下信息

OCC01      OCC02
---------- ---------------
020040     松榮五金-SRWJ 

SQL>

經常使用host變量的場合是在寫腳本的時候,腳本的有些地方經常變化,其他地方固定,那麼可以使用&引用。



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> 

(4).顯示所有綁定變量

//var命令顯示所有綁定變量的變量名稱、數據類型
SQL> var
variable num1
datatype NUMBER

variable num2
datatype NUMBER

(5).使用PL/SQL初始化綁定變量

//給綁定變量賦值
SQL> begin 
     :num1:=1;
     :num2:=2;
     end;
     /

PL/SQL procedure successfully completed
num1
---------
1
num2
---------
2

SQL>

(6).使用EXECUTE初始化綁定變量

//使用execute初始化,初始化多個用分號隔開 
SQL> exec :num1:=1;:num2:=2

PL/SQL procedure successfully completed
num1
---------
1
num2
---------
2

SQL> 

(7).顯示指定的綁定變量的值

//使用print var_name命令輸出指定的綁定變量值
SQL> print num1;
num1
---------
1

SQL> print num2;
num2
---------
2

(8).顯示所有綁定變量的值

//print 命令輸出所有綁定變量的值
SQL> print
num1
---------
1

num2
---------
2

SQL> 

(9).引用綁定變量

//使用:var_name引用綁定變量
SQL> select :num1 from dual;

     :NUM1
----------
         1
num1
---------
1

SQL> 

(10).存儲過程初始化綁定變量

//聲明綁定變量m
SQL> var m number;

//創建一個帶輸出參數的存儲過程test_pro
SQL> create or replace procedure test_pro(num out number)
     as
     begin
     num:=10;
     end;
     /

Procedure created

//使用存儲過程返回變量(引用綁定變量記得帶上:)
SQL> exec test_pro(num=>:m);

PL/SQL procedure successfully completed
m
---------
10

//輸出綁定變量m的值
SQL> print m
m
---------
10

(11).游標初始化綁定變量

綁定變量是REFCURSOR類型。一個參數使用refcursor,通過綁定變量類型定義為REFCURSOR,然後傳入過程,打印綁定變量(效果和查詢語句一樣)。

//聲明游標類型的綁定變量
//注意:在plsql dev的command window無法使用以下聲明,需要再sqlplus中才有效
SQL> var curinfo refcursor

//創建帶輸出參數,參數類型為sys_refcursor的存儲過程
SQL> create or replace procedure cur_pro(cur_msg out sys_refcursor)
     as
     begin
     open cur_msg for select occ01,occ02 from occ_file where rownum<3;
     end;
     /

Procedure created

//exec執行存儲過程
SQL> exec cur_pro(cur_msg=>:cur_info);

PL/SQL 過程已成功完成。

//輸出綁定變量cur_info的值
SQL> print cur_info

OCC01          OCC02
---------------------------
020040         松榮五金-SRWJ
---------------------------
020041         路得記-LDJ

由上面可以知道,print可以直接把refcursor的結果打印出來,不需要迭代查找。


(12).函數初始化綁定比那裡

//創建函數
SQL> create or replace function test_fun(a in varchar2,b in varchar2) return varchar2
     as
     c varchar2(255);
     begin
     c:=a||b;
     return c;
     end;
     /

Function created

//聲明綁定變量fun_info
SQL> var fun_info varchar2(255);

//使用call調用函數將返回值賦值給綁定變量
SQL> call test_fun('a','b') into :fun_info;

Method called
fun_info
---------
ab

//顯示綁定變量的值

SQL> print fun_info
fun_info
---------
ab

當然也可以將函數的參數定義為out模式來初始化,我們這裡使用call命令調用函數把結果傳給綁定變量,

語法

call function(參數列表) into :綁定變量

pl/sql中的參數和定義的變量(包括全局變量和臨時變量)都會內部轉為綁定變量,所以盡量在pl/sql中盡量使用靜態sql,而不要使用動態sql,如果使用動態sql,要盡量加上綁定變量。


(13).綁定變量的基本作用

綁定變量主要是sql的執行過程中,在解析sql之後會進行共享池(SGA)的檢查,看優化器有沒有分析優化過這個sql,環境必須完全一致才可以(包括大小寫的一致,session情況一致等)。那麼可以達到一次分析,多次執行的目的,這就是軟解析,否則要經過解析,優化,行資源生成等一系列sql執行的過程,因為sql優化需要耗費很多資源,如果硬解析,sql性能會下降。

如果查詢一跑幾個小時,根本沒必要做綁定變量,因為解析的消耗微乎其微,而且綁定變量對優化器判斷執行路徑也有負面影響。

看SGA中的sql是否是軟解析被調用多次,可以查看vsql或vsqlarea視圖,查看列sql_text,executions,如:

select sql_text,executions from v$sql where sql_text like '%trademark%'; 

SQL_TEXT                              EXECUTIONS<被執行的次數> 
select * from trademark where id=:tid        6


3、declare

查看Oracle PL/SQL語句基礎學習筆記(上)-3、聲明部分

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved