ORACLE中聲明變量:define variable declare


在sqlplus 環境中,聲明變量的關鍵字:define variable declare

一、define關鍵字(host變量)

host變量的作用是一個替換作用,是主機環境與oracle進行交互的變量,定義host變量時必須同時指定變量名和變量的值,定義變量不可以指定數據類型,define定義的變量默認其數據類型都是char。該變量只在當前session起作用

1、定義語法:

define var_name =value
2、define命令

>查看已定義的所有變量及其值:define

SQL> define
DEFINE _DATE = "10-3月 -00" (CHAR)
DEFINE _CONNECT_IDENTIFIER = "orcl" (CHAR)
DEFINE _USER = "user" (CHAR)
DEFINE _PRIVILEGE = "" (CHAR)
DEFINE _SQLPLUS_RELEASE = "1102000100" (CHAR)
DEFINE _EDITOR = "Notepad" (CHAR)
DEFINE _O_VERSION = "Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options" (CHAR)
DEFINE _O_RELEASE = "1102000100" (CHAR)
>查看已定義的某一個變量

SQL> define num
DEFINE NUM = "3" (CHAR)
 

3、變量的引用

定義變量后,可在sql語句中直接使用,需要在變量前加“&”符號

 

 

4、關閉打開define變量定義。

SQL> set define on
SQL> define b=10
SQL> select * from user_tables where rownum=&b;
原值 1: select * from user_tables where rownum=&b
新值 1: select * from user_tables where rownum=10

SQL> set define off;
SQL> define a=10
SQL> select * from user_tables where rownum=&a;
SP2-0552: 未聲明綁定變量 "A"。
5、臨時變量

上述是顯示的定義變量方式,另一種是隱式定義的臨時變量,臨時變量只是當前sql語句可用。

SQL> select * from user_tables where rownum=&var;
輸入 var 的值: 10
原值 1: select * from user_tables where rownum=&var
新值 1: select * from user_tables where rownum=10

SQL> select * from user_tables where rownum=&var;
輸入 var 的值:
二、variable關鍵字

variable定義的變量即綁定變量,一般用於存儲過程有out類型的參數時。定義時需要定於變量的數據數據類型,支持的數據類型如下。同define一樣,只在當前會話中有效。

SQL> help variable

VARIABLE
--------

Declares a bind variable that can be referenced in PL/SQL, or
lists the current display characteristics for a single variable
or all variables.

VAR[IABLE] [variable [type]]

where type represents one of the following:

NUMBER CHAR CHAR (n [CHAR|BYTE])
NCHAR NCHAR (n) VARCHAR2 (n [CHAR|BYTE])
NVARCHAR2 (n) CLOB NCLOB
REFCURSOR BINARY_FLOAT BINARY_DOUBLE
1、定於語法:

 

var[iable] var_name type;
簡寫var,(sqlplus支持不少於三個字符的表示命令)。var定於的變量,必須同時指定數據類型,定義時var變量不能賦值。
 

2、引用

引用var定義變量,需要在前面加“:”。

3、var命令,同define。

4、var變量的初始化。

使用存儲過程初始化、函數初始化。

call命令調用函數把結果傳給綁定變量,

函數初始化:call function(參數列表) into :綁定變量1

存儲過程初始化:exec pro_name(var_name=>:綁定變量);

三、declare--聲明部分

plsql程序塊的聲明部分,內部變量,只在當前程序塊有效。常量、變量、游標的聲明都在declare部分。

 

Oracle定義變量的方式有3種:
聲明並使用變量;
使用%TYPE聲明變量類型;
使用%ROWTYPE聲明變量類型
可以通過sys登錄,使用"v$reserved_words"數據字典查看全部關鍵字
  

聲明並使用變量
變量聲明基本規則:
PL/SQL是強類型語言,變量都必須在它聲明之后才可以使用;
變量不區分大小寫;
變量都要在DECLARE部分聲明;
變量名稱可以由字母,數字,_(下划線),$,#組成;
所有的變量名稱要求以字母開頭,不能是Oracle保留字(關鍵字);
可以通過sys登錄,使用"v$reserved_words"數據字典查看全部關鍵字
變量的長度最多30個字符;
所有的變量均為局部作用域,它們只在給定的PL/SQL塊中有效;
變量的默認值為NULL;
示例:
定義變量不設置默認值

DECLARE

v_result VARCHAR2(30) ; -- 此處沒有賦值

BEGIN

DBMS_OUTPUT.put_line('v_result的內容〖' || v_result || '〗') ;

END ;

/

輸出結果為空

變量聲明語法:
 

變量名稱 [constant] 類型 [not null] [:=value];

語句解析:
constant:定義常量,必須在聲明時為其賦予默認值;
not null:表示此變量不允許為null;
:=value:在變量聲明示,設置初始數據;

  

示例:定義變量
DECLARE

v_resultA NUMBER := 100 ; -- 定義一個變量同時賦值

v_resultB NUMBER ; -- 定義一個變量沒有設置內容

BEGIN

v_resultb := 30 ; -- 沒有區分大小寫

DBMS_OUTPUT.put_line('計算的結果是:' || (v_resultA + v_resultB) ) ;

END ;

/

運行結果:130
分析:此程序采用了兩種方式為聲明的變量進行賦值:
1.在DECLARE中定義變量的時候直接賦值:v_resultA number := 100;
2.在DECLARE中定義變量,而后在BEGIN中為變量賦值:v_resultb:=30;
3.v_resultB在賦值時寫成了v_resultb依然不影響執行結果;

定義非空變量:
DECLARE

v_resultA NUMBER NOT NULL := 100 ; -- 定義一個非空變量v_resultA,同時賦值

BEGIN

DBMS_OUTPUT.put_line('v_resultA變量內容:' || (v_resultA) ) ;

END ;

/

運行結果:v_resultA變量內容:100

定義常量:
DECLARE

v_resultA CONSTANT NUMBER NOT NULL := 100 ; -- 定義一個常量同時賦值

BEGIN

DBMS_OUTPUT.put_line('v_resultA常量內容:' || (v_resultA) ) ;

END ;

/

運行結果:v_resultA變量內容:100
1.使用constant定義的常量不能在程序中對其參數進行修改。此sql使用了NOT NULL進行定義,實際上是沒有任何實際意義的。

使用%TYPE聲明變量類型
該聲明方式,可以使某一個變量與指定數據表中某一列的類型一樣;
語法:
變量定義表名稱.字段名稱%TYPE

示例:使用"%TYPE"定義變量

DECLARE

v_eno emp.empno%TYPE ; -- 與empno類型相同

v_ename emp.ename%TYPE ; -- 與ename類型相同

BEGIN

DBMS_OUTPUT.put_line('請輸入雇員編號:') ;

v_eno := &empno ; -- 由鍵盤輸入雇員編號

SELECT ename INTO v_ename FROM emp WHERE empno= v_eno ;

DBMS_OUTPUT.put_line('編號為:' || v_eno || '雇員的名字為:'|| v_ename) ;

END ;

/

運行:輸入empno的值:7369
輸出結果:編號為:7369雇員的名字為:SMITH
分析:此程序主要演示了%TYPE變量的使用方式。定義的eno和ename兩個變量的數據類型參考了emp表的empno和ename兩個字段

使用%ROWTYPE聲明變量類型
此標記可以定義表中一行記錄的類型;
使用"select…..into…."將表中的一行記錄設置到了ROWTYPE類型的變量中時,可以利用"rowtype變量.表字段"的方式取得表中每行的對應列數據
示例:使用ROWTYPE裝載一行記錄
DECLARE

v_deptRow dept%ROWTYPE ; -- 裝載一行dept記錄

BEGIN

SELECT * INTO v_deptRow FROM dept WHERE deptno=10 ;

DBMS_OUTPUT.put_line('部門編號:'|| v_deptRow.deptno || ',名稱:' || v_deptRow.dname || ',位置:' || v_deptRow.loc) ;

END ;

/

運行結果:部門編號:10,名稱:ACCOUNTING,位置:NEW YORK
分析:此sql定義了deptRow的ROWTYPE類型變量,之后使用限定查詢,查詢出10部門的完整信息,並將此行信息設置到deptRow變量中,然后分別利用列名稱取得此行中的每列內容。

補充:通過定義專門的集合類型也可以完成與ROWTYPE類型的功能
通過自定義類型接收一行記錄:
DECLARE

TYPE dept_type IS RECORD (

dno dept.deptno%TYPE ,

dna dept.dname%TYPE ,

dlo dept.loc%TYPE) ; -- 定義一個新的類型

v_deptRow dept_type ; -- 裝載一行dept記錄

BEGIN

SELECT * INTO v_deptRow FROM dept WHERE deptno=10 ;

DBMS_OUTPUT.put_line('部門編號:'|| v_deptRow.dno || ',名稱:' || v_deptRow.dna || ',位置:' || v_deptRow.dlo) ;

END ;

/

查看Oracle數據庫SQL執行歷史

 
-- 找出哪個數據庫用戶用什么程序在最近三天執行過delete或truncate table的操作
  SELECT c.username,
         a.program,
         b.sql_text,
         b.command_type,
         a.sample_time
    FROM dba_hist_active_sess_history a
         JOIN dba_hist_sqltext b
            ON a.sql_id = b.sql_id
         JOIN dba_users c
            ON a.user_id = c.user_id
   WHERE     a.sample_time BETWEEN SYSDATE - 3 AND SYSDATE
         AND b.command_type IN (7, 85)
ORDER BY a.sample_time DESC;


免責聲明!

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



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