rowtype的幾個注意點

2021-06-05 08:59:10 字數 1779 閱讀 4633

一、

%rowtype只是指明引用的記錄的型別,但不保證not null約束

我們知道使用

%type和%

rowtype可以分別指定引用的字段、記錄型別,但其中有乙個特別需要注意的地方:

%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欄位不能為空的情況下依然是可以執行的。二、%

rowtype記錄的賦值用%

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

但是,如果乙個型別是引用的是資料表而另乙個引用的是游標的話,那麼,即使它們表現的內容相同,也是不能相互賦值的

dept_rec2 := dept_rec3; - - not allowed

因為此處的dept_rec2引用是表,而dept_rec3引用的是游標,所以即便它們查詢的內容一樣也

方法二:我們可以使用select或fetch語句將取得的資料賦給記錄。但在表或檢視中定義的欄位名稱順序要與記錄中的名稱順序相同。

declare

dept_rec dept

%rowtype;

...begin

select * into dept_rec from dept where deptno = 30;

...end; 

但是,我們不能使用賦值語句來把字段列表中的值賦給記錄。所以,下面的語法形式是不允許的:

record_name := (value1, value2, value3, ...); -- not allowed

三、使用別名

從游標中取出的資料,如果游標定義中含有表示式時,我們就需要使用別名才能正確地為

%rowtype型別記錄賦值:

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;

rowtype的幾個注意點

一 rowtype只是指明引用的記錄的型別,但不保證not null約束 我們知道使用 type和 rowtype可以分別指定引用的字段 記錄型別,但其中有乙個特別需要注意的地方 type和 rowtype都不保證not null約束。例如 declare my empno emp.empno ty...

C 的幾個注意點

1.static全域性變數與普通的全域性變數有什麼區別 static全域性變數只初使化一次,防止在其他檔案單元中被引用 static區域性變數和普通區域性變數有什麼區別 static區域性變數只被初始化一次,下一次依據上一次結果值 靜態區域性變數是指在函式體內宣告和定義的區域性變數,它僅供本函式使用...

vertical align的幾個注意點

參考博文 1.vertical align生效場景 2.通過vertical align實現居中vertical align 屬性設定元素的垂直對齊方式。該屬性定義行內元素的基線相對於該元素所在行的基線的垂直對齊。允許指定負長度值和百分比值。這會使元素降低而不是公升高。在表單元格中,這個屬性會設定單...