一、%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记录的赋值
DECLARE
dept_rec1 dept
%
ROWTYPE;
dept_rec2 dept
%
ROWTYPE;
CURSOR
c1
IS
SELECT
*
FROM
dept;
dept_rec3 c1
%
ROWTYPE;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
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可以分别指定引用的字段、记录类型,但其中有一个特别需要注意的地方:
%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作声明的时候是不可以进行初始化赋值的,但是有两种方法可以一次性为所有字段赋值。
方法一:假如两个记录类型的声明引用了同一数据表或游标,那么它们就可以相互赋值,如:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
但是,如果一个类型是引用的是数据表而另一个引用的是游标的话,那么,即使它们表现的内容相同,也是不能相互赋值的
dept_rec2 := dept_rec3; - - not allowed
因为此处的dept_rec2引用是表,而dept_rec3引用的是游标,所以即便它们查询的内容一样也
方法二:我们可以使用SELECT或FETCH语句将取得的数据赋给记录。但在表或视图中定义的字段名称顺序要与记录中的名称顺序相同。
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
但是,我们不能使用赋值语句来把字段列表中的值赋给记录。所以,下面的语法形式是不允许的:
record_name := (value1, value2, value3, ...); -- not allowed
三、使用别名
从游标中取出的数据,如果游标定义中含有表达式时,我们就需要使用别名才能正确地为%ROWTYPE类型记录赋值:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)