無憂無鹵

          鳥在籠中,恨關(guān)羽不能張飛;人處世上,要八戒更需悟空

          [轉(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記錄的賦值

          用%ROWTYPE作聲明的時(shí)候是不可以進(jìn)行初始化賦值的,但是有兩種方法可以一次性為所有字段賦值。

          方法一:假如兩個(gè)記錄類型的聲明引用了同一數(shù)據(jù)表或游標(biāo),那么它們就可以相互賦值,如:

          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

          但是,如果一個(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ù)賦給記錄。但在表或視圖中定義的字段名稱順序要與記錄中的名稱順序相同。

          DECLARE
            dept_rec dept
          %ROWTYPE;
            ...
          BEGIN
            
          SELECT * INTO dept_rec FROM dept WHERE deptno = 30;
            ...
          END

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

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


           三、
          使用別名

          從游標(biāo)中取出的數(shù)據(jù),如果游標(biāo)定義中含有表達(dá)式時(shí),我們就需要使用別名才能正確地為%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 閱讀(697) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

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

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆檔案

          相冊(cè)

          搜索

          最新評(píng)論

          • 1.?re: 近期任務(wù)
          • 大哥 等著你的drools5翻譯呢 drools4把我搞死了 如果你有關(guān)于drools4的心得的話請(qǐng)指教 感覺自己使用的不是很好 望賜教 QQ:53816565 謝謝
          • --sunnidy
          • 2.?re: Mysql遷移到Oracle
          • 不錯(cuò),看樣子支持大多數(shù)數(shù)據(jù)庫遷移到oracle,不知道是否支持從oracle轉(zhuǎn)出?
          • --FastUnit

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 安阳市| 青神县| 安康市| 博湖县| 双流县| 和静县| 新蔡县| 南陵县| 舒兰市| 大竹县| 衢州市| 游戏| 太和县| 富平县| 深泽县| 仁化县| 衡山县| 安达市| 荥经县| 临漳县| 华亭县| 奈曼旗| 嘉兴市| 烟台市| 邹平县| 广昌县| 芦山县| 奈曼旗| 巴林左旗| 慈溪市| 陇西县| 霞浦县| 新晃| 岗巴县| 建阳市| 教育| 丹阳市| 大理市| 台中县| 延津县| 专栏|