Oracle存儲過程案例詳解
創(chuàng)建簡單存儲過程(Hello World)
為了方便讀者簡單易懂,我將下面使用到的表復(fù)制給大家。
具體表中的數(shù)據(jù),請大家自己填寫
-- 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)輸出到控制臺上,這樣我們一個簡單的存儲過程就完成啦
記住一句話的結(jié)束使用分號結(jié)束,存儲過程寫完一定要執(zhí)行
將它保存到數(shù)據(jù)庫中 (F8)快捷鍵,或者點擊左上角執(zhí)行*/
dbms_output.put_line('我的名字叫'||name);/*dbms_output.put_line相當(dāng)于JAVA中的System.out.println("我的名字叫"+name);*/
end firstP;
下面我們要對剛剛寫過的存儲過程進(jìn)行測試,我們開啟Test Window這個窗口

-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here /*測試名稱 名稱類型 使用 := 給參數(shù)賦值,在多說一句,分號結(jié)束本句*/ name2 varchar2(64):='數(shù)據(jù)庫'; begin -- Test statements here firstp(name2); end;
我們打開DBMS Output就可以看到執(zhí)行的存儲過程啦。


存儲過程IF判斷
create or replace procedure isifp(age in number) is
/*存儲過程if判斷以then開始,以end if; 結(jié)束*/
begin
if (age > 30) then
dbms_output.put_line('我已經(jīng)超過30歲了');
else
if (age < 10) then
dbms_output.put_line('我還是個兒童');
else
dbms_output.put_line('我正在奮斗時期');
end if;
end if;
end;
存儲過程輸出
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,但是請注意,存儲過程中可以return多個值*/ end inandout;
測試輸出代碼
-- Created on 2018/12/30 星期日 by ADMINISTRATOR declare -- Local variables here name varchar2(64):='數(shù)據(jù)庫'; age number:=06; out_p varchar2(64); begin -- Test statements here inandout(name,age,outp=>:out_p); /*這里的outp是存儲過程中的輸出參數(shù),out_p是在測試中使用的別名*/ 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;
測試游標(biāo)
第一種測試方法
-- 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é)果如下:

第二種測試方法
-- 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;

上面測試結(jié)果僅僅返回一條數(shù)據(jù)。下面我來演示返回多條數(shù)據(jù)的情況。
首先請看我表中的數(shù)據(jù)

有兩個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ù)。
由于對于初學(xué)者來說,游標(biāo)可能不是很容易理解,下面我用JAVA語言來描述一下。
我們在java程序中寫條件查詢的時候,返回出來的數(shù)據(jù)是List<泛型>。這個操作相當(dāng)于游標(biāo),說白了就是個查詢而已(大家不要誤認(rèn)為就這么一句簡單的SQL為什么要用游標(biāo),因為只是方便讀者學(xué)習(xí)游標(biāo)罷了,具體業(yè)務(wù)具體分析,請不要抬杠哦)
當(dāng)我們要使用list中的數(shù)據(jù)時,我們使用循環(huán)調(diào)用某一條數(shù)據(jù)時,是不是就要用實體類對象點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ù)雜一點存儲過程
由于朋友這里有個需求需要用存儲過程,進(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)建一個序列
-- Create sequence create sequence SEQ_CLASSES minvalue 1 maxvalue 9999999999999999999999999999 start with 2 increment by 1 cache 20;
下面創(chuàng)建存儲過程,寫的亂一些,希望不要介意
create or replace procedure proclasses(Names in varchar2,
classescs in varchar) as
/*在我們創(chuàng)建存儲過程的時候as其實是is*/
id number;/*設(shè)置變量名稱*/
c number;
seq number;
begin
select SEQ_CLASSES.nextval into id from dual;/*獲取下一個序列,使用into賦值給id這個變量名稱*/
dbms_output.put_line('classescs=' || classescs);/*打印而已*/
select count(*) into c from Classes where classesc = classescs;/*條件判斷,classesc=進(jìn)來的變量*/
if (c > 0) then/*當(dāng)數(shù)量大于0時*/
select max(seq) + 1 into seq from Classes where classesc = classescs;
dbms_output.put_line('第一個seq' || seq);
else
if (c = 0) then
seq := 0;/*如果查詢出來的數(shù)量為0的時候,我們賦值seq變量為0*/
dbms_output.put_line('c=0的時候seq' || seq);
end if;
end if;
insert into classes
(id, name, classesc, seq)
values
(id, names, classescs, seq);
/*insert插入這個不用多說了,大家都明白;注意的是我們insert之后一定要提交。
不然數(shù)據(jù)沒有持久化到數(shù)據(jù)庫,這個insert沒有任何意義了*/
end proclasses;
下面我們來調(diào)用這個存儲過程
-- 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存儲過程案例詳解的文章就介紹到這了,更多相關(guān)Oracle存儲過程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
oracle中to_date詳細(xì)用法示例(oracle日期格式轉(zhuǎn)換)
這篇文章主要介紹了oracle中to_date詳細(xì)用法示例,包括期和字符轉(zhuǎn)換函數(shù)用法、字符串和時間互轉(zhuǎn)、求某天是星期幾、兩個日期間的天數(shù)、月份差等用法2014-01-01
Oracle數(shù)據(jù)庫tnsnames.ora文件的作用和配置
這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)庫tnsnames.ora文件的作用和配置,tnsnames.ora 是一個oracle數(shù)據(jù)庫網(wǎng)絡(luò)配置文件,通過這個配置文件才能建立對數(shù)據(jù)庫的連接,需要的朋友可以參考下2024-06-06
Oracle數(shù)據(jù)庫重啟服務(wù)、監(jiān)聽程序命令詳解
本文詳細(xì)介紹了如何重啟Oracle數(shù)據(jù)庫和監(jiān)聽器的步驟,包括登錄服務(wù)器、停止和啟動數(shù)據(jù)庫及監(jiān)聽器的過程2024-12-12
oracle 虛擬專用數(shù)據(jù)庫詳細(xì)介紹
這篇文章詳細(xì)介紹了oracle 虛擬專用數(shù)據(jù)庫,對行級別和列級別分別舉了代碼實例并進(jìn)行分析,內(nèi)容比較詳細(xì),需要的朋友可以參考下。2017-09-09
Zabbix監(jiān)控Oracle歸檔日志空間的全過程
本文將介紹Zabbix監(jiān)控Oracle歸檔日志空間的全過程,Zabbix是一個開源的監(jiān)控系統(tǒng),它可以監(jiān)控各種不同類型的服務(wù)器和服務(wù),如果您想要監(jiān)控Oracle數(shù)據(jù)庫,文中是一些簡單的步驟,需要的朋友可以參考下2024-04-04

