sql游標狀態
❶ sql中的游標是什麼怎樣用呢
在資料庫中,游標提供了一種對從表中檢索出的數據進行操作的靈活手段。就本質而言,游標實際上是一種能從包括多條數據記錄的結果集中每次提取一條記錄的機制。
游標總是與一條SQL
選擇語句相關聯因為游標由結果集(可以是零條、一條或由相關的選擇語句檢索出的多條記錄)和結果集中指向特定記錄的游標位置組成。
游標關於資料庫中的操作會對整個行集產生影響。由 SELECT 語句返回的行集包括所有滿足該語句 WHERE 子句中條件的行。由語句所返回的這一完整的行集被稱為結果集。
應用程序,特別是互動式聯機應用程序,並不總能將整個結果集作為一個單元來有效地處理。這些應用程序需要一種機制以便每次處理一行或一部分行。游標就是提供這種機制的結果集擴展。
(1)sql游標狀態擴展閱讀:
游標通過以下方式擴展結果處理:
1.允許定位在結果集的特定行。
2.從結果集的當前位置檢索一行或多行。
3.支持對結果集中當前位置的行進行數據修改。
4.為由其他用戶對顯示在結果集中的資料庫數據所做的更改提供不同級別的可見性支持。
5.提供腳本、存儲過程和觸發器中使用的訪問結果集中的數據的 Transact-SQL 語句。
參考資料來源:搜狗網路—游標
❷ oraclePL/SQL之隱式游標和ref游標總結
游標是構建在PL/SQL中 用來查詢數據 獲取記錄集的指針 它讓開發者 一次訪問結果集中一行記錄 在oracle中提供了兩種游標 靜態游標 ref游標
靜態游標 靜態游標是在編譯的時候就被確定 然後把結果集復制到內存中 靜態游標又分為兩種 隱式游標和顯示游標
ref游標 ref游標是在運行的時候載入結果集
先來看看靜態游標中的隱式游標 在PL/SQL中為所有的SQL數據操縱語句(包括返回一行的select)隱式聲明游標 稱為隱式游標 主要原因是用戶不能直接命名和控制此類游標 當用戶在PL/SQL 中使用數據操縱語句(DML)時 oracle預先定義一個名稱為SQL的隱式游標 通過 檢查隱式游標的屬性獲取與最近執行的SQL語句相關信息 在執行DML語句之後 隱式游標屬性返回信息 隱式游標屬性包括 %found %notfound %rowcount %isopen
%found 只有DML語句影響一行或多行時 %found屬性才返回true declare num number; begin update emp set empno= where empno= ; if sql%found then dbms_output put_line( 存在記錄 ); else dbms_output put_line( 不存在記錄 ); end if; end;
%notfound %notfound屬性作用正好跟%found屬性相反 如果DML語句沒有影響任何行數 則%notfound屬性返回true declare begin delete from emp where empno= ; if sql%notfound then dbms_output put_line( 刪除失敗 ); end if; end;
%rowcount %rowcount屬性返回DML語句影響的行數 如果DML語句沒有影響任何行數 則%rowcount屬性將返回 declare num number; begin update emp set empno= where empno= ; if sql%rowcount= then dbms_output put_line( 不存在記錄 ); else dbms_output put_line( 存在記錄 ); end if; end;
%isopen %isopen屬性判斷SQL游標是否已經打開 在執行SQL語句之後 oracle自動關閉SQL 游標 所以隱式游標的%isopen屬性始終為false
在PL/SQL中向標準的select語句增加單獨的into子句 就可以將從表或視圖中查詢 記錄賦予變數或行變數 需要注意的是select into 語句結果必須有且只能有一行 如果查詢沒有返回行 PL/SQL將拋出no_data_found異常 如果查詢返回多行 則拋出 too_many_rows 異常 如果拋出異常 則停止執行 控制權轉移到異常處理部分(沒有 異常處理 則程序中斷) 在引發異常時 將不使用屬性%found %notfound %rowcount來查明DML語句是否 已影響了行數 declare num number; begin select empno into num from emp where empno= ; if sql%rowcount= or sql%notfound then dbms_output put_line( 不存在記錄 ); else dbms_output put_line( 存在記錄 ); end if; end;
顯示游標 顯示游標是由用戶顯示聲明的游標 根據在游標中定義的查詢 查詢返回的行集合可以 包含零行或多行 這些行稱為活動集 游標將指向活動集中的當前行 顯示游標的操作過程 使用顯示游標的 個步驟 ( )聲明游標 ( )打開游標 ( )從游標中獲取結果集 ( )關閉游標 cursor cursor_name [(parameter[ parameter])] [return return_type] is select_statement; cursor_name 指游標的名稱 parameter 為游標指定輸入參數 return_type 定義游標提取行的行類型 select_statement 為游標定義查詢語句 open 游標名稱 fetch 從游標中提取行 close 關閉游標
打開游標 執行游標中定義的查詢語句 綁定輸入參數 將游標指針指 向結果集的BOF位置 open cursor_name [parameters]
fetch 在打開游標之後 可以從游標中提取記錄 fetch cursor_name into variable_name; fetch 是提取結果集中一行記錄存儲在變數中 每次提取之後 結果集指針 就向前移動一行
close 在處理游標中的所有行之後 必須關閉游標 以釋放分配給游標的所有資源 close cursor_name 用戶可以通過檢查游標屬性來確定游標的當前狀態 顯示游標的屬性如下 %found 如果執行最後一條fetch語句 成功返回行 則%found屬性為true %notfound 如果執行最後一條fetch語句 未能提取行 則%notfound屬性為true %isopen:如果游標已經打開 則返回true 否則返回false %rowcount 返回到目前為止游標提取的行數 %rowcount為數字類型屬性 在第一 次獲取之前 %rowcount為零 當fetch語句返回一行時 則該數加 declare info emp%rowtype; cursor my_cur is select * from emp where empno= ; begin open my_cur; dbms_output put_line(my_cur%rowcount); loop if my_cur%isopen then fetch my_cur into info; exit when my_cur%notfound; dbms_output put_line(info empno); dbms_output put_line(my_cur%rowcount); end if; end loop; close my_cur; end;
使用顯示游標刪除或更新 使用游標時 如果處理過程中需要刪除或更新 在定義游標查詢語句時 必須使用select for update語句 而在執行delete或update時使用 where current of 子句指定游標當前行 cursor cursor_name is select_statement for update[of column] wait/nowait 在使用for update 子句聲明游標之後 可以使用以下語法更新行 update table_name set column_name=column_value where current of cursor_name; update命令中使用的列必須出現在for update of 子句中 select 語句必須只包括一個表 而且delete和update語句只有在打開游標並且提取 特定行之後才能使用 declare cursor cur_emp is select * from emp where sal< for update of sal; num emp%rowtype; begin open cur_emp; loop fetch cur_emp into num; exit when cur_emp%notfound; update emp set sal= where current of cur_emp; end loop; close cur_emp; end;
帶參數的顯示游標 PL/SQL中允許顯示游標接受輸入參數 用於聲明帶參數的顯示游標語法 cursor cursor_name[<param_name> data_type] [return <return type>] is select_statement declare dept_num emp deptno%type; emp_num emp empno%type; emp_nam emp ename%type; cursor emp_cur(deptparam number) is select empno ename from emp where deptno=deptparam; begin dept_num :=&部門編號; open emp_cur(dept_num); loop fetch emp_cur into emp_num emp_nam; exit when emp_cur%notfound; dbms_output put_line(emp_num|| ||emp_nam); end loop; close emp_cur; end;
可以使用循環游標來簡化顯示游標 循環游標隱式打開顯示游標(不需要open) 自動從結果集提取記錄 然後處理完所有記錄自動關閉游標 循環游標自動創建 %rowtype類型的變數並將此變數用做記錄的索引 循環游標語法如下 for record_index in cursor_name record_index是PL/SQL自動創建的變數 此變數的屬性聲明為%rowtype類型 作用 域for循環之內 循環游標的特性有 從游標中提取所有記錄之後自動關閉游標 提取和處理游標中每一條記錄 提取記錄之後%notfound屬性為true則退出循環 如果未有結果集 則不進入循環 declare cursor emp_cur is select * from emp; begin for temp in emp_cur loop dbms_output put_line(temp ename); end loop; end; 循環游標自動打開 提取 關閉 只適用於靜態游標
ref游標 隱式游標和顯示游標都是靜態定義的 它們在編譯的時候結果集就已經被確定 如果想在運行的時候動態確定結果集 就要使用ref游標和游標變數
創建ref游標需要兩個步驟 聲明ref cursor類型 聲明 ref cursor類型變數 語法如下 type ref_cursor_name is ref cursor [return record_type] 其中 return 用於指定游標提取結果集的返回類型 有return表示是強類型ref游標 沒有return表示是弱類型的游標 弱類型游標可以提取任何類型的結果集 定義游標變數之後 就可以在PL/SQL執行部門打開游標變數 open cursor_name for select_statement; declare type emp_cur is ref cursor; my_cur emp_cur; num number; selection varchar( ):= &請輸入編號 ; begin if selection= then dbms_output put_line( 員工信息 ); open my_cur for select deptno from emp; elsif selection= then dbms_output put_line( 部門信息 ); open my_cur for select deptno from dept; else dbms_output put_line( 請輸入員工信息( )或門部信息( ) ); end if; fetch my_cur into num; while my_cur%found loop dbms_output put_line(num); fetch my_cur into num; end loop; close my_cur; end;
在PL/SQL中可以執行動態SQL語句 execute immediate 語句只能語句處理返回單行 或沒有返回的SQL語句 ref游標則可以處理返回結果集的動態SQL ref游標的聲明 方法與普通ref游標相同 只是在open時指定了動態SQL字元串 open cursor_name for dynamic_select_string [using bind_argument_list] declare type sql_cur is ref cursor; my_cur sql_cur; emp_info emp%rowtype; sql_string varchar ( ):= &請輸入查詢字元串 ; begin open my_cur for sql_string; loop fetch my_cur into emp_info; exit when my_cur%notfound; dbms_output put_line(emp_info ename); end loop; close my_cur; end;
lishixin/Article/program/Oracle/201311/18462