Oracle游標 for loop if結合應用

2021-07-02 04:05:47 字數 1992 閱讀 2694

什麼時候會用到oracle游標,以及其中的for、loop、if呢?

先看這樣乙個需求:

有一張學生授課表t_teaching,每個學生都有數門課程:

主鍵id(自增)

課程號course_id

學號user_id101

201501202

201501303

201501401

201502501

201503601

201504702

201504

......

...但是因為某些原因,導致有的學生課程不全(本應該每個學生都有3門課),應該如何把不全的學生檢索出來,再給這些學生新增課程呢,並且要求能夠快速解決這個問題。

我們對需求進行一步步梳理:

1、我們不知道哪個學生課程不全,所以需要迴圈判斷每個學生

通常用for迴圈:for user_id in user_ids

2、迴圈判斷每個學生就要拿到所有的學號

select:select user_id from  t_teaching group by user_id;

3、有了學號,判斷這個學生是否缺少課程,然後新增這門課

(1)select:select count(*) from t_teaching where user_id=@user_id and course_id=@course_id;

(2)if else 判斷

(3)insert:insert into t_teaching(course_id,user_id) values (@course_id,@user_id)

通過分析大致的流程出來了,然後再看細節:

我們通過select ..group by獲取了授課表中所有的學號,然後就對這些學號進行迴圈獲取,關鍵在於select ..group by出來如何迴圈獲取。

在oracle中提供了「游標」

游標是什麼,游標用來處理從資料庫中檢索的多行記錄(使用select語句)。利用游標,程式可以逐個地處理和遍歷一次檢索返回的整個記錄集。

這正是我們想要的!!

結合for迴圈,我們可以使用for迴圈游標,格式如下:

--(1)定義游標

--關鍵字cursor

cursor x is select語句

---(2)定義游標變數

y x%rowtype

--(3)使用for迴圈來使用這個游標

for y in x loop

--邏輯處理

end loop;

下面我們通過sql儲存過程來完整的實現上面的需求

declare

--定義型別

cursor t_tea

isselect user_id from t_teaching group by user_id;

--定義乙個游標變數

t_row t_tea%rowtype;

--定義乙個number型別的臨時變數

v_count number;

begin

for t_row in t_tea loop

select count(*) into v_count from t_teaching where user_id=t_row.user_id and course_id=02;

if v_count = 0 then

insert into t_teaching(course_id,user_id) values (02,t_row.user_id);

end if;

end loop;

end;

oracle中的游標迴圈不只有for迴圈,oracle中提供了兩種游標,顯示游標和隱式游標,其他游標的使用方式可以在這裡了解,用到了在深入研究:

oracle 游標使用

create or replace function errortyperead return varchar2 is result varchar2 3000 type cursor type is ref cursor tempname varchar2 100 cursor testcur i...

oracle 初識游標

游標大串燒 一 游標分類 1.靜態游標 編譯時才確定elect語句。1 隱式游標 使用者不能直接控制的靜態游標 自動開,自動取,自動關 當使用者用update,delete,insert,select 帶into 時,自動產生隱式游標。游標名字為 sql 相關屬性 found,notfound,is...

oracle游標總結

1.利用游標顯示職工號 來廠日期 職位 部門號 部門名 部門所在地 工資所處的等級。declare outempno int outhiredate date outjob varchar 10 outdeptno int outloc varchar 10 outgrade int cursor ...