無憂無鹵

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

          [轉] %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 閱讀(697) 評論(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

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 馆陶县| 霍邱县| 仲巴县| 仙游县| 交城县| 西安市| 崇仁县| 武强县| 社旗县| 平安县| 红桥区| 德兴市| 陆丰市| 永兴县| 许昌市| 昌宁县| 宜章县| 平利县| 疏附县| 黄龙县| 岑溪市| 兰西县| 竹北市| 福贡县| 博白县| 葫芦岛市| 漳浦县| 克山县| 昆明市| 肇东市| 津市市| 拜城县| 旬邑县| 洪泽县| 谢通门县| 大洼县| 罗源县| 喜德县| 庄浪县| 镇沅| 收藏|