Oracle %TYPE

 

%TYPE 是定義變數的一種方法

 

V_StudentID students.id%TYPE 表示的含義:變數V_StudentID 與students表中id的欄位資料類型一致,長度也一致,當students中id的資料類型改變時,那麼V_StudentID的資料類型也會跟著改變。

 

%rowtype

 

表示該類型為行資料類型,存儲的是一行資料,一行資料裡可以有多列,類似于表裡的一行資料,也可以是游標裡的一行資料,如:
vs_row1 表%rowtype;
vs_row2 游標%rowtype;

 

Oracle %type和%rowtype小實例

 

%type
如果聲明的變數是直接映射到資料庫的某一列上,那麼就可以使用%type關鍵字將變數
錨定到這個列上。這樣做有什麼好處呢?
比如:
declare v_ename scott.emp.ename%type;
當資料類型發生變化時,此方法顯得非常靈活。


 

如果更改了列的長度,那麼錨定到該列上的所有變數都會自動更改其長度;
假設我們將v_ename定義為Varchar2(10),那麼當emp表中的ename列發生變化時,
我們得手動將v_enam更改為emp.ename相同的資料長度;
當我們使用錨定類型後,變數就會自動進行調整。
%rowtype
%rowtype與%type相似;不過它將變數錨定到表的所有列,而不是錨定到某一列;
更多關於%rowtype與%type,
請參考:HTTP://blog.csdn.net/BOBO12082119/archive/2010/12/02/6051367.aspx
下面是一個實例:
create table dept(
deptno Varchar2(5),
dname Varchar2(20),
loc Varchar2(20)
);
create or replace procedure pro_insert(
deptno_in in dept.deptno%type,
dname_in in dept.dname%type,
loc_in in dept.loc%type
)
as
v_dept dept%rowtype;
begin
begin
insert into dept
select deptno_in,dname_in,loc_in
from dual;
commit;
dbms_output.put_line('inserting successed');
exception
when others then
rollback;
end;
begin
select deptno_in,dname_in,loc_in
into v_dept from dual;
dbms_output.put_line(
'The data having been inserted.'||
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end;
end pro_insert;
//
上面的過程中,使用到了嵌套塊;
所謂嵌套塊就是塊中包含其他子塊;
嵌套塊允許出現在代碼塊的異常處理部分和執行部分,
但是不允許出現在聲明中。
//
SQL> set serveroutput on;
SQL> exec pro_insert('111','財務部','福州');
inserting successed
The data having been inserted.deptno:111,dname:財務部,loc:福州
PL/SQL procedure successfully completed
//
從這裡看出來,%rowtype定義的變數作用有點相似游標,
但是我們不能將%rowtype定義的變數當做游標來使用,
否則我們將會得到下面的錯誤:
ORA-01422: exact fetch returns more than requested number of rows
declare v_dept dept%rowtype;
begin
select deptno,dname,loc
into v_dept
from dept;
dbms_output.put_line(
'The data having been inserted.'||
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end;
//
下面我們用游標來實現上面的操作,具體看下面的匿名塊:
declare
cursor cv_dept is
select *
from dept;
begin
變數v_dept不必我們顯示聲明
for迴圈會為我們隱式的打開和關閉游標,不必我們現實的打開和關閉游標
for v_dept in cv_dept loop
dbms_output.put_line(
'deptno:'||v_dept.deptno||
',dname:'||v_dept.dname||
',loc:'||v_dept.loc
);
end loop;
end;
//
deptno:111,dname:財務部,loc:福州
deptno:120,dname:銷售部,loc:大連
deptno:130,dname:科研部,loc:北京
PL/SQL procedure successfully completed

 

 

創作者介紹
創作者 戮克 的頭像
戮克

自由手記

戮克 發表在 痞客邦 留言(0) 人氣()