国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

詳解ORACLE中游標的生命周期

2019-11-02 15:52:50
字體:
來源:轉載
供稿:網友

 在網絡或者書籍中,我們可以非常容易的了解到ORACLE中游標的生命周期包括如下部分:

1,打開游標-- open cursor,此步驟在 UGA 里申請一塊內存給游標使用,這個時候游標還沒有與sql語句關聯。
2,解析游標-- sql與游標關聯起來,解析sql的內容(包括執行計劃),解析后的內容會被加載到共享池中(share pool-- library cache)。在UGA申請的內存用來保存指向這個共享游標(share cursor)在library cache中的位置。
3,定義輸出變量-- 如果sql語句返回數據,必須先定義接收數據的變量。這一點不僅對查詢語句很重要,對于使用returning 自居的delete、insert和update 語句也很重要。
4,綁定輸入變量-- 如果sql語句使用了綁定變量,必須提供他們的值。綁定的過程是不做什么檢查。如果指定了無效的數據,執行的過程中會爆出一個運行時錯誤。
5,執行游標-- 執行跟游標關聯的sql。注意 數據庫并非總是在這一步做重要的事情。事實上,對于很多類型的查詢語句來說,真正的處理過程通常會被推遲到fetch數據階段。
6,獲取游標-- 如果sql語句返回數據,這一步會接受這些數據。特別是在查詢語句中,大部分的處理工作都是在這一步進行的。在查詢語句中,可能只會讀取部分記錄,換句話講,游標有可能在取到所有記錄前被關閉。
7,關閉游標-- 釋放UGA中與這個游標有關的資源,從而這些資源可供其他的游標使用。在library cache中的share cursor不會被清除,它會繼續保留在library cache 中,等待被重用(軟解析重用)。

重復的內容,我們不做過多介紹,今天我們來看一下游標生命周期中各個部分所扮演的角色,以及如何利用它們來優化我們的程序。

借鑒《oracle性能診斷藝術》中的代碼片段,我們來研究一下游標的生命周期;

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 create or replace procedure cursor_test as   l_ename  emp.ename%TYPE := 'SCOTT';   l_empno  dbms_sql.Number_Table;   l_cursor INTEGER;   l_retval INTEGER;   cnt integer := 1;   indx integer := 1;   res varchar2(4000); BEGIN   for i in 1 .. 1000 loop     l_cursor := DBMS_SQL.open_cursor;     DBMS_SQL.parse(l_cursor,                    'select empno from emp where ename <> :ename and 0 <> '||i , DBMS_SQL.native);     l_empno.delete();     DBMS_SQL.define_array(l_cursor, 1, l_empno,cnt,indx);     DBMS_SQL.bind_variable(l_cursor, ':ename', to_char(i));     l_retval := DBMS_SQL.execute(l_cursor);       while DBMS_SQL.fetch_rows(l_cursor) > 0 loop       dbms_sql.column_value(l_cursor, 1, l_empno);     end loop;     res :='';     for j in 1 .. l_empno.count() loop         res := res || L_EMPNO(j);      end loop;      DBMS_OUTPUT.PUT_LINE(res);     dbms_sql.close_cursor(l_cursor);   end loop; end; 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三原县| 金寨县| 荣成市| 岳阳县| 太谷县| 钦州市| 钟祥市| 北海市| 精河县| 象山县| 尼木县| 永顺县| 太康县| 沾化县| 仁化县| 青浦区| 和林格尔县| 莱西市| 永顺县| 扎鲁特旗| 柯坪县| 淅川县| 桂林市| 辉县市| 龙陵县| 太谷县| 山东省| 厦门市| 柘城县| 高青县| 茌平县| 喜德县| 商南县| 宕昌县| 江津市| 无锡市| 灵宝市| 从化市| 阿拉善盟| 分宜县| 新津县|