无忧无卤

鸟在笼中,恨关羽不能张飞;人处世上,要八戒更需悟空

[转] %rowtype的几个注意点收藏

一、%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, 0wages, 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;

 

posted on 2009-02-25 15:49 beyond 阅读(670) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

统计

常用链接

留言簿(1)

随笔档案

相册

搜索

最新评论

  • 1. re: 近期任务
  • 大哥 等着你的drools5翻译呢 drools4把我搞死了 如果你有关于drools4的心得的话请指教 感觉自己使用的不是很好 望赐教 QQ:53816565 谢谢
  • --sunnidy
  • 2. re: Mysql迁移到Oracle
  • 不错,看样子支持大多数数据库迁移到oracle,不知道是否支持从oracle转出?
  • --FastUnit

阅读排行榜

评论排行榜