乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      顯式游標(biāo)和隱式游標(biāo)的區(qū)別

       愛(ài)吃魚(yú)的俊懶貓 2019-05-08

      在每個(gè)用戶(hù)會(huì)話(huà)中,可以同時(shí)打開(kāi)多個(gè)游標(biāo),其數(shù)量由數(shù)據(jù)庫(kù)初始化參數(shù)文件中的OPEN_CURSORS參數(shù)定義。

      對(duì)于不同的SQL語(yǔ)句,游標(biāo)的使用情況不同:

      SQL語(yǔ)句

      游標(biāo)

      非查詢(xún)語(yǔ)句

      隱式的

      結(jié)果是單行的查詢(xún)語(yǔ)句

      隱式的或顯示的

      結(jié)果是多行的查詢(xún)語(yǔ)句

      顯示的


      處理顯式游標(biāo)

      例:

      1. DECLARE  
      2.    CURSOR c4(dept_id NUMBER, j_id VARCHAR2) --1、聲明游標(biāo),有參數(shù)沒(méi)有返回值  
      3.    IS  
      4.       SELECT first_name f_name, hire_date FROM employees  
      5.       WHERE department_id = dept_id AND job_id = j_id;  
      6.   
      7.     --基于游標(biāo)定義記錄變量,比聲明記錄類(lèi)型變量要方便,不容易出錯(cuò)  
      8.     v_emp_record c4%ROWTYPE;  
      9. BEGIN  
      10.    OPEN c4(90, 'AD_VP');             --2、打開(kāi)游標(biāo),傳遞參數(shù)值  
      11.    LOOP  
      12.       FETCH c4 INTO v_emp_record;    --3、提取游標(biāo)fetch into  
      13.       IF c4%FOUND THEN  
      14.          DBMS_OUTPUT.PUT_LINE(v_emp_record.f_name||'的雇傭日期是'  
      15.                             ||v_emp_record.hire_date);  
      16.       ELSE  
      17.          DBMS_OUTPUT.PUT_LINE('已經(jīng)處理完結(jié)果集了');  
      18.          EXIT;  
      19.       END IF;  
      20.    END LOOP;  
      21.    CLOSE c4;                         --4、關(guān)閉游標(biāo)  
      22. END;  

      退出LOOP或者用:

      EXIT WHEN c4%NOTFOUND;


      游標(biāo)屬性:

       Cursor_name%FOUND     布爾型屬性,當(dāng)最近一次提取游標(biāo)操作FETCH成功則為 TRUE,否則為FALSE;

       Cursor_name%NOTFOUND   布爾型屬性,與%FOUND相反;——注意區(qū)別于DO_DATA_FOUND(select into拋出異常)

       Cursor_name%ISOPEN     布爾型屬性,當(dāng)游標(biāo)已打開(kāi)時(shí)返回 TRUE

       Cursor_name%ROWCOUNT   數(shù)字型屬性,返回已從游標(biāo)中讀取的記錄數(shù)。

      游標(biāo)的for循環(huán)

      PL/SQL語(yǔ)言提供了游標(biāo)FOR循環(huán)語(yǔ)句,自動(dòng)執(zhí)行游標(biāo)的OPENFETCH、CLOSE語(yǔ)句和循環(huán)語(yǔ)句的功能;

      1. 當(dāng)進(jìn)入循環(huán)時(shí),游標(biāo)FOR循環(huán)語(yǔ)句自動(dòng)打開(kāi)游標(biāo),并提取第一行游標(biāo)數(shù)據(jù);
      2. 當(dāng)程序處理完當(dāng)前所提取的數(shù)據(jù)而進(jìn)入下一次循環(huán)時(shí),游標(biāo)FOR循環(huán)語(yǔ)句自動(dòng)提取下一行數(shù)據(jù)供程序處理;
      3. 當(dāng)提取完結(jié)果集合中的所有數(shù)據(jù)行后結(jié)束循環(huán),并自動(dòng)關(guān)閉游標(biāo)。

      格式:

        FOR index_variable IN cursor_name[(value[, value]…)] LOOP
          
      -- 游標(biāo)數(shù)據(jù)處理代碼
        END LOOP;

      其中:

      index_variable為游標(biāo)FOR 循環(huán)語(yǔ)句隱含聲明的索引變量,該變量為記錄變量,其結(jié)構(gòu)與游標(biāo)查詢(xún)語(yǔ)句返回的結(jié)構(gòu)集合的結(jié)構(gòu)相同。在程序中可以通過(guò)引用該索引記錄變量元素來(lái)讀取所提取的游標(biāo)數(shù)據(jù),index_variable中各元素的名稱(chēng)與游標(biāo)查詢(xún)語(yǔ)句選擇列表中所制定的列名相同。如果在游標(biāo)查詢(xún)語(yǔ)句的選擇列表中存在計(jì)算列,則必須為這些計(jì)算列指定別名后才能通過(guò)游標(biāo)FOR 循環(huán)語(yǔ)句中的索引變量來(lái)訪問(wèn)這些列數(shù)據(jù)。

      例:

      1. DECLARE  
      2.   CURSOR c_cursor(dept_no NUMBER DEFAULT 10)   
      3.   IS  
      4.     SELECT department_name, location_id FROM departments WHERE department_id <= dept_no;  
      5. BEGIN  
      6.     --當(dāng)dept_no參數(shù)值為30  
      7.     FOR c1_rec IN c_cursor(30) LOOP          
      8.          DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);  
      9.     END LOOP;  
      10.      
      11.     --使用默認(rèn)的dept_no參數(shù)值10  
      12.     FOR c1_rec IN c_cursor LOOP         
      13.          DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);  
      14.     END LOOP;  
      15. END;  

      或者可以在游標(biāo)FOR循環(huán)語(yǔ)句中使用子查詢(xún)
      1. BEGIN  
      2.     FOR c1_rec IN(SELECT department_name, location_id FROM departments) LOOP   
      3.        DBMS_OUTPUT.PUT_LINE(c1_rec.department_name||'---'||c1_rec.location_id);  
      4.     END LOOP;  
      5. END;  

      處理隱式游標(biāo)

      顯式游標(biāo)主要是用于對(duì)查詢(xún)語(yǔ)句的處理,尤其是在查詢(xún)結(jié)果為多條記錄的情況下;

      而對(duì)于非查詢(xún)語(yǔ)句,如修改、刪除操作,則由ORACLE 系統(tǒng)自動(dòng)地為這些操作設(shè)置游標(biāo)并創(chuàng)建其工作區(qū),隱式游標(biāo)的名字為SQL,這是由ORACLE 系統(tǒng)定義的。

      對(duì)于隱式游標(biāo)的操作,如定義、打開(kāi)、取值及關(guān)閉操作,都由ORACLE 系統(tǒng)自動(dòng)地完成,無(wú)需用戶(hù)進(jìn)行處理。用戶(hù)只能通過(guò)隱式游標(biāo)的相關(guān)屬性,來(lái)完成相應(yīng)的操作。在隱式游標(biāo)的工作區(qū)中,所存放的數(shù)據(jù)是與用戶(hù)自定義的顯示游標(biāo)無(wú)關(guān)的、最新處理的一條SQL 語(yǔ)句所包含的數(shù)據(jù)。

      格式調(diào)用為: SQL%
      1. DECLARE  
      2.    v_rows NUMBER;  
      3. BEGIN  
      4.    --更新數(shù)據(jù)  
      5.    UPDATE employees SET salary = 30000  
      6.      WHERE department_id = 90 AND job_id = 'AD_VP';  
      7.    --獲取默認(rèn)游標(biāo)的屬性值  
      8.    v_rows := SQL%ROWCOUNT;  
      9.    DBMS_OUTPUT.PUT_LINE('更新了'||v_rows||'個(gè)雇員的工資');  
      10.      
      11.     --刪除指定雇員;如果部門(mén)中沒(méi)有雇員,則刪除部門(mén)  
      12.     DELETE FROM employees WHERE department_id=v_deptno;  
      13.     IF SQL%NOTFOUND THEN  
      14.         DELETE FROM departments WHERE department_id=v_deptno;  
      15.     END IF;  
      16. END;  

      更新或刪除當(dāng)前游標(biāo)數(shù)據(jù)

      游標(biāo)查詢(xún)語(yǔ)句中必須使用FOR UPDATE選項(xiàng),以便在打開(kāi)游標(biāo)時(shí)鎖定游標(biāo)結(jié)果集合在表中對(duì)應(yīng)數(shù)據(jù)行的所有列和部分列。

      如果另一個(gè)會(huì)話(huà)已對(duì)活動(dòng)集中的行加了鎖,那么SELECT FOR UPDATE操作一直等待到其它的會(huì)話(huà)釋放這些鎖后才繼續(xù)自己的操作;對(duì)于這種情況,當(dāng)加上NOWAIT子句時(shí),如果這些行真的被另一個(gè)會(huì)話(huà)鎖定,則OPEN立即返回并給出:

      ORA-0054 :resource busy  and  acquire with nowait specified.

      1. DECLARE   
      2.     V_deptno employees.department_id%TYPE :=&p_deptno;  
      3.     CURSOR emp_cursor   
      4.   IS   
      5.   SELECT employees.employee_id, employees.salary   
      6.     FROM employees WHERE employees.department_id=v_deptno  
      7.   FOR UPDATE NOWAIT;                    --1、for update  
      8. BEGIN  
      9.     FOR emp_record IN emp_cursor LOOP  
      10.       IF emp_record.salary < 1500 THEN  
      11.         UPDATE employees SET salary=1500  
      12.             WHERE CURRENT OF emp_cursor; --2、WHERE CURRENT OF cursor_name子句  
      13.       END IF;  
      14.     END LOOP;  
      15. END;   

      動(dòng)態(tài)游標(biāo)

      與游標(biāo)一樣,動(dòng)態(tài)游標(biāo)(游標(biāo)變量)也是一個(gè)指向多行查詢(xún)結(jié)果集合中當(dāng)前數(shù)據(jù)行的指針。但與游標(biāo)不同的是,游標(biāo)變量是動(dòng)態(tài)的,而游標(biāo)是靜態(tài)的。

      游標(biāo)只能與指定的查詢(xún)相連,即固定指向一個(gè)查詢(xún)的內(nèi)存處理區(qū)域,而游標(biāo)變量則可與不同的查詢(xún)語(yǔ)句相連,它可以指向不同查詢(xún)語(yǔ)句的內(nèi)存處理區(qū)域(但不能同時(shí)指向多個(gè)內(nèi)存處理區(qū)域,在某一時(shí)刻只能與一個(gè)查詢(xún)語(yǔ)句相連),只要這些查詢(xún)語(yǔ)句的返回類(lèi)型兼容即可。

      1. DECLARE  
      2.    --定義一個(gè)游標(biāo)數(shù)據(jù)類(lèi)型  
      3.    TYPE emp_cursor_type IS REF CURSOR;  
      4.    --聲明一個(gè)游標(biāo)變量  
      5.    c1 EMP_CURSOR_TYPE;  
      6.    --聲明兩個(gè)記錄變量  
      7.    v_emp_record employees%ROWTYPE;  
      8.    v_reg_record regions%ROWTYPE;  
      9.   
      10. BEGIN  
      11.    OPEN c1 FOR SELECT * FROM employees WHERE department_id = 20;  
      12.    LOOP  
      13.       FETCH c1 INTO v_emp_record;  
      14.       EXIT WHEN c1%NOTFOUND;  
      15.       DBMS_OUTPUT.PUT_LINE(v_emp_record.first_name||'的雇傭日期是'  
      16.                             ||v_emp_record.hire_date);  
      17.    END LOOP;  
      18.    --將同一個(gè)游標(biāo)變量對(duì)應(yīng)到另一個(gè)SELECT語(yǔ)句  
      19.    OPEN c1 FOR SELECT * FROM regions WHERE region_id IN(1,2);  
      20.    LOOP  
      21.       FETCH c1 INTO v_reg_record;  
      22.       EXIT WHEN c1%NOTFOUND;  
      23.       DBMS_OUTPUT.PUT_LINE(v_reg_record.region_id||'表示'  
      24.                             ||v_reg_record.region_name);  
      25.    END LOOP;  
      26.    CLOSE c1;  
      27. END;

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多