[轉(zhuǎn)] %rowtype的幾個(gè)注意點(diǎn)收藏
一、%rowtype只是指明引用的記錄的類型,但不保證NOT NULL約束
我們知道使用%type和%rowtype可以分別指定引用的字段、記錄類型,但其中有一個(gè)特別需要注意的地方:
%type和%rowtype都不保證NOT NULL約束。例如:
DECLARE
my_empno emp.empno%TYPE; --emp.empno should not be null
...
BEGIN
my_empno := NULL; - - this works well
以上這段代碼在emp表的empno字段不能為空的情況下依然是可以執(zhí)行的。
二、%rowtype記錄的賦值
DECLARE
dept_rec1 dept%ROWTYPE;
dept_rec2 dept%ROWTYPE;
CURSOR c1 IS SELECT * FROM dept;
dept_rec3 c1%ROWTYPE;

BEGIN
.. .
dept_rec1 := dept_rec2 --this works well
DECLARE
dept_rec dept%ROWTYPE;
...
BEGIN
SELECT * INTO dept_rec FROM dept WHERE deptno = 30;
...
END;
DECLARE
CURSOR my_cursor IS
SELECT sal + NVL(comm, 0) wages, ename FROM emp;
my_rec my_cursor%ROWTYPE;
BEGIN
OPEN my_cursor;
LOOP
FETCH my_cursor
INTO my_rec;
EXIT WHEN my_cursor%NOTFOUND;
IF my_rec.wages > 2000 THEN
INSERT INTO temp VALUES (NULL, my_rec.wages, my_rec.ename);
END IF;
END LOOP;
CLOSE my_cursor;
END;
我們知道使用%type和%rowtype可以分別指定引用的字段、記錄類型,但其中有一個(gè)特別需要注意的地方:
%type和%rowtype都不保證NOT NULL約束。例如:
DECLARE
my_empno emp.empno%TYPE; --emp.empno should not be null
...
BEGIN
my_empno := NULL; - - this works well
以上這段代碼在emp表的empno字段不能為空的情況下依然是可以執(zhí)行的。
二、%rowtype記錄的賦值
用%ROWTYPE作聲明的時(shí)候是不可以進(jìn)行初始化賦值的,但是有兩種方法可以一次性為所有字段賦值。
方法一:假如兩個(gè)記錄類型的聲明引用了同一數(shù)據(jù)表或游標(biāo),那么它們就可以相互賦值,如:









但是,如果一個(gè)類型是引用的是數(shù)據(jù)表而另一個(gè)引用的是游標(biāo)的話,那么,即使它們表現(xiàn)的內(nèi)容相同,也是不能相互賦值的
dept_rec2 := dept_rec3; - - not allowed
因?yàn)榇颂幍膁ept_rec2引用是表,而dept_rec3引用的是游標(biāo),所以即便它們查詢的內(nèi)容一樣也
方法二:我們可以使用SELECT或FETCH語句將取得的數(shù)據(jù)賦給記錄。但在表或視圖中定義的字段名稱順序要與記錄中的名稱順序相同。







但是,我們不能使用賦值語句來把字段列表中的值賦給記錄。所以,下面的語法形式是不允許的:
record_name := (value1, value2, value3, ...); -- not allowed
三、使用別名
從游標(biāo)中取出的數(shù)據(jù),如果游標(biāo)定義中含有表達(dá)式時(shí),我們就需要使用別名才能正確地為%ROWTYPE類型記錄賦值:
















posted on 2009-02-25 15:49 beyond 閱讀(697) 評(píng)論(0) 編輯 收藏