一、
%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 屬性設定元素的垂直對齊方式。該屬性定義行內元素的基線相對於該元素所在行的基線的垂直對齊。允許指定負長度值和百分比值。這會使元素降低而不是公升高。在表單元格中,這個屬性會設定單...