plsql(轻量版)_游标的使用1
生活随笔
收集整理的這篇文章主要介紹了
plsql(轻量版)_游标的使用1
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
叫游標(biāo)的使用,游標(biāo),以前沒有聽過這個名,什么是游標(biāo),他的作用是什么,如何來聲明,怎么來使用,主要是你要掌握他是干嘛的,怎么用,游標(biāo),在PL/SQL程序當(dāng)中,對于處理多行記錄的事務(wù),經(jīng)常使用游標(biāo)來實(shí)現(xiàn),處理多行的
在PL/SQL程序當(dāng)中,對于處理多行記錄的事務(wù),經(jīng)常使用游標(biāo)來實(shí)現(xiàn),處理多行的,我們剛才寫的程序,你像這打印80號部門的,這里涉及到很多人了,我們考慮說使用游標(biāo),用于處理多行記錄,你看我們上面用的時候其實(shí)并沒有用著這個概念,某個人的情況,如果變量多的話,我們用記錄類型,來存儲你這個變量,然后分別再打印,相當(dāng)于只是一條數(shù)據(jù),如果你想處理多條數(shù)據(jù)的話,就要使用到游標(biāo)這樣一個概念,游標(biāo)是一個指向上下文的一個句柄或者指針,有點(diǎn)像我們的iterator這個
顯示的游標(biāo),還有隱式的,顯示的游標(biāo)處理,需要四個PL/SQL的步驟,對應(yīng)這個藍(lán)色的,第一步叫定義一個游標(biāo),叫cursor什么什么,肯定select一個什么東西,給他定義好了,定義好了以后,我就打開一個游標(biāo),打開這個游標(biāo)就是open,游標(biāo)名,就完了,程序不能用open重復(fù)打開一個游標(biāo),就打開一次,然后提取游標(biāo)的數(shù)據(jù),JAVA里面用next返回一個游標(biāo)的數(shù)據(jù),提取游標(biāo)使用的的是fetch,游標(biāo)的名,into放在一個變量里,或者放在一個記錄類型里,一個變量,一個記錄類型,都可以,最后游標(biāo)還需要關(guān)閉,對游標(biāo)使用的四個步驟,然后不能有into了
12.1 使用游標(biāo)要求: 打印出 80 部門的所有的員工的工資:salary: xxxdeclare--1. 定義游標(biāo)cursor salary_cursor is select salary from employees where department_id = 80;v_salary employees.salary%type;
begin--2. 打開游標(biāo)open salary_cursor;--3. 提取游標(biāo)fetch salary_cursor into v_salary;--4. 對游標(biāo)進(jìn)行循環(huán)操作: 判斷游標(biāo)中是否有下一條記錄
while salary_cursor%found loopdbms_output.put_line('salary: ' || v_salary);fetch salary_cursor into v_salary;
end loop; --5. 關(guān)閉游標(biāo)close salary_cursor;
end;如果打印一個人直接定義一個 變量就是,操作這個,declare,然后,begin,最后一個end,打印80號部門的員工的工資,格式是這樣子的,這個肯定是我定義一個變量,把這個工資給他放在變量里,那我們先定義一個,v_sal,employees這個表里的,salary跟他是一樣的,然后下邊我們要使用游標(biāo)了,因?yàn)橛卸鄠€人,首先要定義一個游標(biāo),定義游標(biāo),cursor起個名,emp_sal_cursor,is select salary from employees where department_id,id等于80,把80號部門員工的salary給他定義成一個游標(biāo),那這個就寫完了,定義游標(biāo),第二步,叫打開游標(biāo),打開就是open,把它打開,第三步叫提取游標(biāo),fetch叫獲取這個游標(biāo),你看看這個格式,fetch什么什么into,因?yàn)槟氵@個游標(biāo)只記錄一條salary,把它into到一個變量里,fetch到這里面,因?yàn)檫@里面有多條記錄的,那你就肯定有多個值,怎么來表示這多個值,這里面我們要用到一個循環(huán),while你游標(biāo)的這個變量,他百分號found,一旦你這個游標(biāo),看你這里面是否還有值,有點(diǎn)像我們的hasNext,判斷下一個是否還有值,found本身這個時候是否還有值,如果有值的話,執(zhí)行這樣一個循環(huán),循環(huán)的結(jié)果是把他的工資給他輸出出來,打印一下,打印這個,直到你沒有,你得取完一次之后,while你得有一個迭代條件,取完之后,你得再取一次,取下一次,再取一次,然后再取再取直到?jīng)]有了,end loop,結(jié)束,這個時候打印的效果就是把80號部門的所有的工資都打印了declarev_sal employees.salary%type;cursor emp_sal_cursor is select salary from employees where department_id = 80;beginopen emp_sal_cursor;fetch emp_sal_cursor into v_sal;while emp_sal_cursor%found loopdbms_output.put_line('salary:'||v_sal);fetch emp_sal_cursor into v_sal;end loop;end;
這個肯定是80號部門的,這個感覺不太理想,那你就再加上一個id唄,光有工資,不知道人是誰,忘了這個啥,關(guān),關(guān)閉游標(biāo),就是close,這個是一個完整的使用游標(biāo)的代碼,定義一個游標(biāo),然后打開,然后取,取到哪兒,你要是只select一個東西,那相應(yīng)的還得定義一個變量,把select這個東西放到變量里,然后這個變量我僅僅是輸出了一下,在提取游標(biāo)的時候,因?yàn)樗嵌鄺l記錄,需要我們使用一個循環(huán)的結(jié)構(gòu),依次的給他取出來,直到他沒有,所以使用的是百分號found,他是否還有值,當(dāng)然最后給他關(guān)閉游標(biāo)declare v_sal employees.salary%type;cursor emp_sal_cursor is select salary from employees where department_id = 80;beginopen emp_sal_cursor;fetch emp_sal_cursor into v_sal;while emp_sal_cursor%found loop;dbms_output.put_line('salary:'||v_sal);fetch emp_sal_cursor into v_sal;end loop;close emp_sal_cursor;end;
如果我想看誰的工資是多少,那你相應(yīng)的還得定義一個變量,v_empid,然后select salary,employee_id,from這個,然后into v_sal逗號v_empid,放到這兩個變量里,然后打印一下,然后打印一下id,就這樣唄,然后fetch的時候他是取兩個變量declarev_sal employees.salary%type;v_empid employees.employee_id%type;cursor emp_sal_cursor is select salary,employee_id from employees where department_id = 80;beginopen emp_sal_cursor;fetch emp_sal_cursor into v_sal,v_empid;while emp_sal_cursor%found loopdbms_output.put_line('empid:'||v_empid||'salary:'||v_sal);fetch emp_sal_cursor into v_sal,v_empid;end loop;close emp_sal_cursor;end;
這就是誰他的工資是多少,你要是用SQL語句的話,select employee_id,salary from,employss,where department_id等于,80,select employee_id,salary from employees where employee_id = 80;
你用PL/SQL寫的話要使用游標(biāo),分別定義兩個變量來存那兩個值,里邊還可以用到循環(huán),這就是這個例子,然后呢,如果我想再想除了打印employee_id和salary之外,還想打印hire_date,email,什么department_id,變量是不是有很多了,多的時候用什么,得用記錄類型,我們現(xiàn)在就使用一個記錄類型,我在這上面改,聲明一個記錄類型,type,emp_record is record,然后是一個小括號,括起來,分號結(jié)束,這里邊把他兩扔進(jìn)來,你也可以再加上一個變量,這個用逗號隔開,這聲明一個記錄類型,然后聲明一個記錄類型的變量,記錄類型的變量,v_emp_record,emp_record這個類型的,一個變量,然后定義游標(biāo),該有的還是有,打開游標(biāo),提取游標(biāo),提取的時候,不是into到這里,而是into到記錄類型的變量里,放到變量里,然后這個放的時候,因?yàn)槟氵@里取,取的時候是先取的salary,再取的id,放的時候是先放他再放他,你這個定義這個的時候,也是先定義salary,再定義id,它會依次的按照從前往后的順序,格式對應(yīng),打印就是打印他的,記錄類型變量的,然后你再去取,再去into到記錄類型的變量里,能理解不,然后最后關(guān)閉游標(biāo)declaretype emp_record is record(v_sal employees.salary%type,v_empid employees.employee_id%type);v_emp_record emp_record;cursor emp_sal_curosr is select salary,employee_id from employees where department_id = 80;beginopen emp_sal_cursor;fetch emp_sal_cursor into v_emp_record;while emp_sal_cursor%found loopdbms_output.put_line('empid:'||v_emp_record.v_empid||'salary:'||v_sal);fetch emp_sal_cursor into v_emp_record;end loop;close emp_sal_cursor;end;
declaretype emp_record is record(v_sal employees.salary%type,v_empid employees.employee_id%type, v_hiredate employees.hire_date%type);v_emp_record emp_record;cursor emp_sal_cursor is select employee_id,salary from employees where department_id = 80;beginopen emp_cursor_record;fetch emp_sal_record into v_emp_record;while emp_sal_cursor%found loopdbms_output.put_line('empid:'||v_emp_record.v_empid||'salary:'||v_emp_record.v_sal||'hire_date:'||v_emp_record.v_hiredate);end loop;close emp_sal_cursor;end;
這就是三個變量,相當(dāng)于把游標(biāo)和記錄類型給結(jié)合起來了,他兩的作用不一樣,一個是用于存儲多個變量的,叫記錄類型,一個是用來輸出多行記錄的游標(biāo),就是這樣一個概念,游標(biāo)對應(yīng)的有4步,就這四步,布爾類型的,判斷你是否還有記錄,有found,也有not found,已經(jīng)被打開了,使用這個比較多
游標(biāo)的for循環(huán)要注意,我們剛才是使用while循環(huán)來實(shí)現(xiàn)的,while你這個游標(biāo)的變量,然后他是否是found的,for循環(huán)啊,他就能夠把我們剛才的四步減省減省,我們這里說的是這樣四步,while循環(huán)這樣來用
使用for的時候可以簡寫,PL/SQL還提供了for循環(huán)語句,自動的執(zhí)行open,fetch,close,和循環(huán)語句的功能,當(dāng)進(jìn)入循環(huán)的時候,游標(biāo)for循環(huán)會自動的打開游標(biāo),然后并提取第一行記錄,當(dāng)程序處理完當(dāng)前鎖提取的數(shù)據(jù),而進(jìn)入下一次循環(huán)時,游標(biāo)for循環(huán)也會自動的提取下一行數(shù)據(jù)供程序處理,當(dāng)提取完結(jié)果集中所有數(shù)據(jù)的時候,并自動的關(guān)閉,for什么什么in,相當(dāng)于我這個程序里邊,就正常還是有這樣四步的,這四步還是有的,只不過使用for循環(huán)的時候,這三步能自動的來做一些事了,現(xiàn)在給他改成for循環(huán),使用for循環(huán)同樣實(shí)現(xiàn)剛才的這個,這個怎么來做,它能夠自動的打開,我就直接for了,for指定一個局部變量,是吧,這個局部變量我就定義成一個,c,in,in就是in游標(biāo)的變量,然后loop,loop完了以后,這個想干什么,想打印這個東西,先打印這個,打印完了以后,也會自動去取,然后直到你結(jié)束,end loop結(jié)束,結(jié)束完了,關(guān)也不用關(guān)了,然后在end,這個得改一改,我select這個,for他,他就相當(dāng)于是一個局部變量,c的salarydeclaretype emp_record is record(v_sal employees.salary%type,v_empid employees.employee_id%type,v_hiredate employees.hire_date%type);v_emp_record emp_record;cursor emp_sal_cursor is select from salary,employee_id,hire_date from employees where department_id = 80;beginfor c in emp_sal_cursor loopdbms_output.put_line('empid:'||c.employee_id||'salary:'||c.salary||'hire_date:'||c.hire_date);end loop;end;
這個游標(biāo)他本身是指向employees的三個字段,記錄類型我們就不要了,我們就定義一個游標(biāo)就可以了,然后就直接打印,因?yàn)槲覀冮_始是把游標(biāo)放到記錄類型里,這個都已經(jīng)給刪了,所以當(dāng)然這個就不合適了,這是這種方式,就是理解上要難一點(diǎn),本身他也是有這樣四步的,只不過后三步給for循環(huán)給解決了,這就是使用游標(biāo)的概念,這個就大同小異了13. 使用游標(biāo)的練習(xí):
打印出 manager_id 為 100 的員工的 last_name, email, salary 信息(使用游標(biāo), 記錄類型)declare --聲明游標(biāo) cursor emp_cursor is select last_name, email, salary from employees where manager_id = 100;--聲明記錄類型type emp_record is record(name employees.last_name%type,email employees.email%type,salary employees.salary%type);-- 聲明記錄類型的變量v_emp_record emp_record;
begin--打開游標(biāo)open emp_cursor;--提取游標(biāo)fetch emp_cursor into v_emp_record;--對游標(biāo)進(jìn)行循環(huán)操作while emp_cursor%found loopdbms_output.put_line(v_emp_record.name || ', ' || v_emp_record.email || ', ' || v_emp_record.salary ); fetch emp_cursor into v_emp_record;end loop;--關(guān)閉游標(biāo)close emp_cursor;
end;
(法二:使用for循環(huán))
declarecursor emp_cursor is select last_name,email,salaryfrom employeeswhere manager_id = 100;beginfor v_emp_record in emp_cursor loopdbms_output.put_line(v_emp_record.last_name||','||v_emp_record.email||','||v_emp_record.salary); end loop;
end;打印出manager_id為100的員工的信息,使用游標(biāo),記錄類型,你就看一下這個題,使用一個游標(biāo)和記錄類型,因?yàn)檫@里面聲明了三個變量,有點(diǎn)不少,不少我就可以把他們放到一個記錄類型里,這樣來聲明,就沒問題,然后聲明記錄類型,就要定義一個記錄類型的變量,然后把游標(biāo)的變量放到into的這個記錄類型里,然后聲明一個游標(biāo),他選擇了employees表里的信息,id是他的條件的,然后打開游標(biāo),提取游標(biāo),這個游標(biāo)放到記錄類型變量里面去,一旦你這個游標(biāo)能夠找到值的時候,把相應(yīng)的記錄類型的這幾個屬性給他打出來,然后再取,這個一定不要忘了,再取end,關(guān)閉,如果使用for循環(huán)就簡單了,for循環(huán)記錄類型也沒了,我就直接指向你那個表就完了,聲明一個cursor,就選擇employees的那三列,直接一個for循環(huán),in這個定義的cursor他,loop來執(zhí)行,直接打印這個變量的,對應(yīng)employees表里的,沒有再定義記錄類型,跟我們剛才寫的大同小異的
?
總結(jié)
以上是生活随笔為你收集整理的plsql(轻量版)_游标的使用1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: plsql(轻量版)_流程控制
- 下一篇: plsql(轻量版)_游标的使用2