Oracle之PL/SQL學習筆記之數據類型(三)

Oracle之PL/SQL學習筆記之數據類型(三)

        全部的編程語言中變量是使用最頻繁的。PL/SQL做爲一個面向過程的數據庫編程語言一樣少不了變量,利用變量能夠把PL/SQL塊須要的參數傳遞進來,作到動態執行程序,同時也能夠利用變量在PL/SQL內部進行值得傳遞,甚至能夠把值傳遞出去,最終返回給用戶,因而可知,變量是PL/SQL不可或缺的一部分。
java


1. Oracle預約義的普通數據類型(常見的數據類型)

類型 子類 說明
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
通用行標識符,字符串類型


2. 複合類型

        Oracle在PL/SQL中除了提供像前面介紹的各類類型外,還提供一種稱爲複合類型的類型:
spa

      記錄和表
code


2.1 使用%type

        咱們先看下面的例子:

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個或者更多怎麼辦,那麼咱們是否是須要定義不少的變量來接收它呢,下面咱們來看如何解決這個問題!


2.2 記錄類型(record)

        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;


2.2.1 record 定義

    record定義必須在PL/SQL塊中,格式爲: type record_name is record( cl1 ,cl2 ,cl2 ...);

2.2.2 record 使用

    使用記錄類型的變量名.字段名 (能夠這樣理解)

dbms_output.put_line('僱員職稱:'||v_emp_record.job||'僱員部門編號:'||v_emp_record.deptno);

2.2.3 record的經常使用場景

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了


2.3 %ROWTYPE

   上面已經說了    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;

  

下面將對遊標單獨講解,未完待續 .......

相關文章
相關標籤/搜索