Oracle存儲(chǔ)過(guò)程案例詳解
創(chuàng)建簡(jiǎn)單存儲(chǔ)過(guò)程(Hello World)
為了方便讀者簡(jiǎn)單易懂,我將下面使用到的表復(fù)制給大家。
具體表中的數(shù)據(jù),請(qǐng)大家自己填寫
-- Create table create table EMP ( empno NUMBER(4) not null, ename VARCHAR2(10), job VARCHAR2(9), mgr NUMBER(4), hiredate DATE, sal NUMBER(7,2), comm NUMBER(7,2), deptno NUMBER(2) )
create or replace procedure firstP(name in varchar2) is /*這里name為的參數(shù),in為輸入,varchar2為類型*/ begin /* dbms_output.put_line(); 相當(dāng)輸出到控制臺(tái)上,這樣我們一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程就完成啦 記住一句話的結(jié)束使用分號(hào)結(jié)束,存儲(chǔ)過(guò)程寫完一定要執(zhí)行 將它保存到數(shù)據(jù)庫(kù)中 (F8)快捷鍵,或者點(diǎn)擊左上角執(zhí)行*/ dbms_output.put_line('我的名字叫'||name);/*dbms_output.put_line相當(dāng)于JAVA中的System.out.println("我的名字叫"+name);*/ end firstP;
下面我們要對(duì)剛剛寫過(guò)的存儲(chǔ)過(guò)程進(jìn)行測(cè)試,我們開啟Test Window這個(gè)窗口
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here /*測(cè)試名稱 名稱類型 使用 := 給參數(shù)賦值,在多說(shuō)一句,分號(hào)結(jié)束本句*/ name2 varchar2(64):='數(shù)據(jù)庫(kù)'; begin -- Test statements here firstp(name2); end;
我們打開DBMS Output就可以看到執(zhí)行的存儲(chǔ)過(guò)程啦。
存儲(chǔ)過(guò)程IF判斷
create or replace procedure isifp(age in number) is /*存儲(chǔ)過(guò)程if判斷以then開始,以end if; 結(jié)束*/ begin if (age > 30) then dbms_output.put_line('我已經(jīng)超過(guò)30歲了'); else if (age < 10) then dbms_output.put_line('我還是個(gè)兒童'); else dbms_output.put_line('我正在奮斗時(shí)期'); end if; end if; end;
存儲(chǔ)過(guò)程輸出
create or replace procedure inandout(name in varchar2, age in number,outp out varchar2) is /*in 代表輸入,out 代表輸出*/ begin outp:='my name is '|| name ||',my age is '||age;/*相當(dāng)于JAVA中的return outp,但是請(qǐng)注意,存儲(chǔ)過(guò)程中可以return多個(gè)值*/ end inandout;
測(cè)試輸出代碼
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here name varchar2(64):='數(shù)據(jù)庫(kù)'; age number:=06; out_p varchar2(64); begin -- Test statements here inandout(name,age,outp=>:out_p); /*這里的outp是存儲(chǔ)過(guò)程中的輸出參數(shù),out_p是在測(cè)試中使用的別名*/ end;
返回游標(biāo)
create or replace procedure sysrefcursor(id in number, columnss out sys_refcursor) as /*columnss out sys_refcursor 為輸出游標(biāo)*/ begin open columnss for select * from emp where empno=id; end;
測(cè)試游標(biāo)
第一種測(cè)試方法
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where empno=7934; begin -- Test statements here for e in ee loop dbms_output.put_line('deptno:'||e.deptno); end loop; end;
輸出結(jié)果如下:
第二種測(cè)試方法
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where empno=7934; cur ee % rowtype; begin -- Test statements here open ee; loop fetch ee into cur; exit when ee%notfound; dbms_output.put_line('name:'||cur.ename); end loop; close ee; end;
上面測(cè)試結(jié)果僅僅返回一條數(shù)據(jù)。下面我來(lái)演示返回多條數(shù)據(jù)的情況。
首先請(qǐng)看我表中的數(shù)據(jù)
有兩個(gè)job中內(nèi)容為CLERK的數(shù)據(jù)。
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here cursor ee is select * from emp where job='CLERK'; begin -- Test statements here for e in ee loop dbms_output.put_line('deptno:'||e.deptno); end loop; end;
游標(biāo)返回多條數(shù)據(jù)。
由于對(duì)于初學(xué)者來(lái)說(shuō),游標(biāo)可能不是很容易理解,下面我用JAVA語(yǔ)言來(lái)描述一下。
我們?cè)趈ava程序中寫條件查詢的時(shí)候,返回出來(lái)的數(shù)據(jù)是List<泛型>。這個(gè)操作相當(dāng)于游標(biāo),說(shuō)白了就是個(gè)查詢而已(大家不要誤認(rèn)為就這么一句簡(jiǎn)單的SQL為什么要用游標(biāo),因?yàn)橹皇欠奖阕x者學(xué)習(xí)游標(biāo)罷了,具體業(yè)務(wù)具體分析,請(qǐng)不要抬杠哦)
當(dāng)我們要使用list中的數(shù)據(jù)時(shí),我們使用循環(huán)調(diào)用某一條數(shù)據(jù)時(shí),是不是就要用實(shí)體類對(duì)象點(diǎn)get字段??梢岳斫鉃閒or e in ee loop dbms_output.put_line('deptno:'||e.deptno); end loop;
這里面的e.deptno。
獲取table中的column
create or replace procedure intop(id in number, print2 out varchar2) as e_name varchar2(64); begin select ename into e_name from emp where empno = id; if e_name ='ALLEN' then dbms_output.put_line(e_name); print2:='my name is '||e_name; else if e_name ='SMITH' then print2:='打印sql'||e_name; else print2:='打印其他'; end if; end if; end intop;
稍微復(fù)雜一點(diǎn)存儲(chǔ)過(guò)程
由于朋友這里有個(gè)需求需要用存儲(chǔ)過(guò)程,進(jìn)而更新一下博客。
首先我們先創(chuàng)建一張表
-- Create table create table CLASSES ( id NUMBER not null, name VARCHAR2(14), classesc VARCHAR2(10), seq NUMBER(5) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key constraints alter table CLASSES add constraint PK_CLASSES primary key (ID) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );
下面我們創(chuàng)建一個(gè)序列
-- Create sequence create sequence SEQ_CLASSES minvalue 1 maxvalue 9999999999999999999999999999 start with 2 increment by 1 cache 20;
下面創(chuàng)建存儲(chǔ)過(guò)程,寫的亂一些,希望不要介意
create or replace procedure proclasses(Names in varchar2, classescs in varchar) as /*在我們創(chuàng)建存儲(chǔ)過(guò)程的時(shí)候as其實(shí)是is*/ id number;/*設(shè)置變量名稱*/ c number; seq number; begin select SEQ_CLASSES.nextval into id from dual;/*獲取下一個(gè)序列,使用into賦值給id這個(gè)變量名稱*/ dbms_output.put_line('classescs=' || classescs);/*打印而已*/ select count(*) into c from Classes where classesc = classescs;/*條件判斷,classesc=進(jìn)來(lái)的變量*/ if (c > 0) then/*當(dāng)數(shù)量大于0時(shí)*/ select max(seq) + 1 into seq from Classes where classesc = classescs; dbms_output.put_line('第一個(gè)seq' || seq); else if (c = 0) then seq := 0;/*如果查詢出來(lái)的數(shù)量為0的時(shí)候,我們賦值seq變量為0*/ dbms_output.put_line('c=0的時(shí)候seq' || seq); end if; end if; insert into classes (id, name, classesc, seq) values (id, names, classescs, seq); /*insert插入這個(gè)不用多說(shuō)了,大家都明白;注意的是我們insert之后一定要提交。 不然數(shù)據(jù)沒(méi)有持久化到數(shù)據(jù)庫(kù),這個(gè)insert沒(méi)有任何意義了*/ end proclasses;
下面我們來(lái)調(diào)用這個(gè)存儲(chǔ)過(guò)程
-- Created on 2019/1/7 星期一 by ADMINISTRATOR declare -- Local variables here names varchar2(32):='曉明'; classescs varchar2(32):='一班'; begin -- Test statements here proclasses(names,classescs); end;
到此這篇關(guān)于Oracle存儲(chǔ)過(guò)程案例詳解的文章就介紹到這了,更多相關(guān)Oracle存儲(chǔ)過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows系統(tǒng)下Oracle?11g完全卸載教程(推薦!)
安裝軟件是首要,雖然不是特別重要,但是錯(cuò)誤的安裝也是相當(dāng)費(fèi)勁和抓狂的,所以這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Oracle?11g完全卸載的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),要的朋友可以參考下2024-06-06oracle數(shù)據(jù)庫(kù)如何查詢所有用戶
這篇文章主要給大家介紹了關(guān)于oracle數(shù)據(jù)庫(kù)如何查詢所有用戶的相關(guān)資料, Oracle數(shù)據(jù)庫(kù)中存儲(chǔ)元數(shù)據(jù)的系統(tǒng)表提供了查詢所有用戶的方法,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-09-09巧妙解決Oracle NClob讀寫問(wèn)題(經(jīng)驗(yàn)分享)
下面小編就為大家?guī)?lái)一篇巧妙解決Oracle NClob讀寫問(wèn)題(經(jīng)驗(yàn)分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10自動(dòng)備份Oracle數(shù)據(jù)庫(kù)
自動(dòng)備份Oracle數(shù)據(jù)庫(kù)...2007-03-03Oracle如何更改表空間的數(shù)據(jù)文件位置詳解
這篇文章主要給大家介紹了關(guān)于Oracle如何更改表空間的數(shù)據(jù)文件位置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11Orcle的package中訪問(wèn)其它Schema的表報(bào)錯(cuò)ORA-00942解決方法
package要訪問(wèn)其它Schema的表,但編譯報(bào)錯(cuò)ORA-00942,經(jīng)過(guò)搜索了一下找到了解決方法下面與大家分享下2013-05-05Oracle數(shù)據(jù)的插入insert、更新update、刪除delete、truncate舉例詳解
SQL語(yǔ)法是所有操作的基礎(chǔ),包括創(chuàng)建、查詢、更新和刪除數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)的插入insert、更新update、刪除delete、truncate的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07