全部的編程語言中變量是使用最頻繁的。PL/SQL做爲一個面向過程的數據庫編程語言一樣少不了變量,利用變量能夠把PL/SQL塊須要的參數傳遞進來,作到動態執行程序,同時也能夠利用變量在PL/SQL內部進行值得傳遞,甚至能夠把值傳遞出去,最終返回給用戶,因而可知,變量是PL/SQL不可或缺的一部分。
java
類型 | 子類 | 說明 |
Oracle中的範圍 |
char |
Character,Stringsql Rowid,Nchar數據庫 |
定長字符串 民族字符集 |
2000(缺省值1) |
varchar2 | varchar,String編程語言 ,Nvarchar2性能 |
可變字符串學習 民族語言字符集優化 |
4000 |
Binary_integer |
帶符號整數,爲整數計算優化性能 | ||
number(s,p) |
double,integer,int | ||
Long | 變長字符串 | 32767 | |
date | 日期型 | ||
ROWID | 存放數據庫行號 | ||
URowid | 通用行標識符,字符串類型 |
Oracle在PL/SQL中除了提供像前面介紹的各類類型外,還提供一種稱爲複合類型的類型:
spa
記錄和表
code
咱們先看下面的例子:
declare c_ename constant varchar2(50):='KING'; v_job varchar2(50); ----------------------------------------------- --備註:經過僱員姓名查找僱員的職稱 ----------------------------------------------- begin select job into v_job from emp where ename=c_ename; dbms_output.put_line('僱員'||c_ename||'的職稱爲:'||v_job); end;
假如如今emp表的job字段長度爲20 ,咱們使用varchar2(50)來接收job的值能夠,若是咱們修改emp表結構,job字段的長度爲varchar2(100),那麼是否是有可能
咱們的v_job varchar2(50) 長度不夠存儲job列的值,會報異常:numeric or value error: character string buffer too small
那咱們怎麼來避免這種狀況呢?咱們看下修改後的代碼:
declare c_ename constant varchar2(50):='KING'; v_job emp.job%type; ----------------------------------------------- --備註:經過僱員姓名查找僱員的職稱 ----------------------------------------------- begin select job into v_job from emp where ename=c_ename; dbms_output.put_line('僱員'||c_ename||'的職稱爲:'||v_job); end;
定義一個變量,其數據類型與已經定義的某個數據變量的類型相同,或者與數據庫表的某個列的數據相同,這時可使用%type
使用%type特性的優勢在於:
所引用的數據庫列的數據類型能夠沒必要知道
所引用的數據庫列的數據類型能夠實時改變
實例:
declare c_ename constant varchar2(50):='KING'; v_job emp.job%type; v_deptno emp.deptno%type; ----------------------------------------------- --備註:經過僱員姓名查找僱員的職稱,與部門編號 ----------------------------------------------- begin select job,deptno into v_job,v_deptno from emp where ename=c_ename; dbms_output.put_line('僱員'||c_ename||'的職稱爲:'||v_job||',部分編號爲:'||v_deptno); end;
上面查詢出兩個字段的值,咱們須要定義兩個變量來接收它,若是是3個,5個,10個或者更多怎麼辦,那麼咱們是否是須要定義不少的變量來接收它呢,下面咱們來看如何解決這個問題!
record 能夠當作爲多個單獨變量的集合,能夠方便咱們的查詢,INSERT,UPDATE
若建立records,須要先定義一個record類型,再用該類型聲明遍。也能夠建立或查找一個表,視圖,或PL/SQL遊標,總之是你想要的值,使用%ROWTYPE屬性來建立匹配的record。
你能夠在任何PL/SQL塊,子程序或包的聲明部分定義record類型。當你定義record類型時,不能在域上指定一個NOT NULL的約束,或給出它們的默認值。
實例:
declare type emp_record is record( job emp.job%type,--職稱 deptno emp.deptno%type --部門編號, 多個用, 隔開 ); -- 定義record類型 v_emp_record emp_record; --定義一個record類型的變量 begin select job,deptno into v_emp_record from emp where empno=7788; dbms_output.put_line('僱員職稱:'||v_emp_record.job||'僱員部門編號:'||v_emp_record.deptno); end;
record定義必須在PL/SQL塊中,格式爲: type record_name is record( cl1 ,cl2 ,cl2 ...);
使用記錄類型的變量名.字段名 (能夠這樣理解)
dbms_output.put_line('僱員職稱:'||v_emp_record.job||'僱員部門編號:'||v_emp_record.deptno);
declare v_emp_record emp%rowtype; --table_name%rowtype 自己就是一個記錄類型,全部能夠直接申明這個類型的變量就ok了 begin select * into v_emp_record from emp where empno=7788; dbms_output.put_line('僱員職稱:'||v_emp_record.job||'僱員部門編號:'||v_emp_record.deptno); end;
table_name%rowtype 自己就是一個記錄類型,全部能夠直接申明這個類型的變量就ok了
上面已經說了 table_name%ROWTYPE 自己就是一個記錄類型,這個記錄類型包含了table_name這張表中的全部的字段。
而且不須要定義記錄類型了,能夠直接定義記錄類型的變量,也能夠說是記錄類型的一種簡化吧!
declare v_dept_record dept%rowtype; --定義一個record類型的變量 begin select * into v_dept_record from dept where deptno=10; dbms_output.put_line('部門名稱:'||v_dept_record.dname||'部門編號:'||v_dept_record.deptno); end;
下面將對遊標單獨講解,未完待續 .......