激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle中的游標和函數詳解

Oracle中的游標和函數詳解

2020-01-12 16:28lqh Oracle

這篇文章主要介紹了 Oracle中的游標和函數詳解的相關資料,需要的朋友可以參考下

 Oracle中的游標和函數詳解

1.游標

游標是一種 PL/SQL 控制結構;可以對 SQL 語句的處理進行顯示控制,便于對表的行數據

逐條進行處理。 游標并不是一個數據庫對象,只是存留在內存中。

操作步驟:

   聲明游標
   打開游標

   取出結果,此時的結果取出的是一行數據

   關閉游標 到底那種類型可以把一行的數據都裝進來

   此時使用 ROWTYPE 類型,此類型表示可以把一行的數據都裝進來。 例如:查詢雇員編號為 7369 的信息(肯定是一行信息)。

例:查詢雇員編號為 7369 的信息(肯定是一行信息)。

?
1
2
3
4
5
6
7
8
9
DECLARE
  eno emp.empno%TYPE ; 
  empInfo emp%ROWTYPE ; 
BEGIN
  eno := &en ;
  SELECT * INTO empInfo FROM emp WHERE empno=eno ; 
  DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ; 
  DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ; 
END ;

使用 for 循環操作游標(比較常用)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE
  -- 聲明游標
  CURSOR mycur IS SELECT * FROM emp where empno=-1;
  empInfo emp%ROWTYPE ;
  cou NUMBER ; 
BEGIN
  -- 游標操作使用循環,但是在操作之前必須先將游標打開
  FOR empInfo IN mycur 
  LOOP
    --ROWCOUNT 對游標所操作的行數進行記錄
    cou := mycur%ROWCOUNT ; 
    DBMS_OUTPUT.put_line(cou||'雇員編號:'||empInfo.empno) ; 
    DBMS_OUTPUT.put_line(cou||'雇員姓名:'||empInfo.ename) ; 
  END LOOP ;
END

我們可以看到游標FOR循環確實很好的簡化了游標的開發,我們不在需要open、fetch和close語句,不在需要用%FOUND屬性檢測是否到最后一條記錄,這一切Oracle隱式的幫我們完成了。 

編寫第一個游標,輸出全部的信息。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
  -- 聲明游標
  CURSOR mycur IS SELECT * FROM emp ; -- 相當于一個List (EmpPo)
  empInfo emp%ROWTYPE ; 
BEGIN
  -- 游標操作使用循環,但是在操作之前必須先將游標打開
  OPEN mycur ;
  -- 使游標向下一行
  FETCH mycur INTO empInfo ;
  -- 判斷此行是否有數據被發現
  WHILE (mycur%FOUND) 
    LOOP 
      DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ; 
      DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ;
      -- 修改游標,繼續向下
      FETCH mycur INTO empInfo ; 
    END LOOP ;
END ;

也可以使用另外一種方式循環游標:LOOP…END LOOP;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DECLARE
  -- 聲明游標
  CURSOR mycur IS SELECT * FROM emp ;
  empInfo emp%ROWTYPE ; 
BEGIN
  -- 游標操作使用循環,但是在操作之前必須先將游標打開
  OPEN mycur ; 
  LOOP
    -- 使游標向下一行
    FETCH mycur INTO empInfo ;
    EXIT WHEN mycur%NOTFOUND ; 
    DBMS_OUTPUT.put_line('雇員編號:'||empInfo.empno) ; 
    DBMS_OUTPUT.put_line('雇員姓名:'||empInfo.ename) ;
  END LOOP ; 
END ;

注意 1: 在打開游標之前最好先判斷游標是否已經是打開的。

通過 ISOPEN 判斷

格式:

?
1
2
3
4
5
游標%ISOPEN IF mycur%ISOPEN THEN
null
ELSE
OPEN mycur ; 
END IF ;

注意 2:可以使用 ROWCOUNT 對游標所操作的行數進行記錄。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE
  -- 聲明游標
  CURSOR mycur IS SELECT * FROM emp ;
  empInfo emp%ROWTYPE ;
  cou NUMBER ; BEGIN
  -- 游標操作使用循環,但是在操作之前必須先將游標打開
  IF mycur%ISOPEN THEN
    null
  ELSE
    OPEN mycur ; 
  END IF ; 
  LOOP
    -- 使游標向下一行
    FETCH mycur INTO empInfo ;
    EXIT WHEN mycur%NOTFOUND ;
    cou := mycur%ROWCOUNT ; 
    DBMS_OUTPUT.put_line(cou||'雇員編號:'||empInfo.empno) ; 
    DBMS_OUTPUT.put_line(cou||'雇員姓名:'||empInfo.ename) ; 
  END LOOP ;
END ;

2.函數

函數就是一個有返回值的過程。

定義一個函數:此函數可以根據雇員的編號查詢出雇員的年薪

?
1
2
3
4
5
6
CREATE OR REPLACE FUNCTION myfun(eno emp.empno%TYPE) 
  RETURN NUMBER AS rsal NUMBER ; 
BEGIN
  SELECT (sal+nvl(comm,0))*12 INTO rsal FROM emp WHERE empno=eno ;
  RETURN rsal ; 
END ;

直接寫 SQL 語句,調用此函數:

?
1
SELECT myfun(7369) FROM dual ;

寫一個函數  輸入一個員工名字,判斷該名字在員工表中是否存在。存在返回 1,不存在返回 0

?
1
2
3
4
5
6
create or replace function empfun(en emp.ename%type) 
  return number as is_exist number;
begin
  select count(*) into is_exist from emp where ename=upper(en);
  return is_exist;
end;

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/smile_from_2015/article/details/53635276

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本不卡一二三区 | 精品一区二区久久久久久按摩 | 国产三级在线视频观看 | av色先锋 | 久久精品日韩一区 | 国产精品久久久久久久娇妻 | 男男啪羞羞视频网站 | 一级做受大片免费视频 | 精品久久久久久国产三级 | 香蕉在线看 | 护士hd老师fre0性xxx | 日韩精品中文字幕一区二区 | 亚洲天堂一级片 | 91精选视频在线观看 | 日韩色视频在线观看 | www.三区| 国产精品18久久久久久久 | 天天干干| 久久久久91视频 | 欧美日韩精品一区二区三区蜜桃 | 丁香桃色网 | 精品中文字幕在线播放 | 午夜视频免费播放 | 色网站免费观看 | 欧美激情视频一区二区免费 | 久久久久久久免费视频 | 欧日韩在线视频 | 免费1级做55爰片l在线观看 | 黄色片视频观看 | 黄色片免费看网站 | 狠狠婷婷综合久久久久久妖精 | 91中文字幕在线观看 | 国产日韩在线观看一区 | 精品亚洲免费 | 亚洲看片网 | 亚洲第一男人天堂 | 中国产一级毛片 | 亚洲第一色婷婷 | 亚洲成人黄色片 | 最新日韩在线观看视频 | 久草在线免费看 |