1.1,Oracle存儲過程簡介:
存儲過程是事先經過編譯并存儲在數據庫中的一段SQL語句的集合,調用存儲過程可以簡化應用開發人員的很多工作,
減少數據在數據庫和應用服務器之間的傳輸,對于提高數據處理的效率是有好處的。
優點:
- 允許模塊化程序設計,就是說只需要創建一次過程,以后在程序中就可以調用該過程任意次。
- 允許更快執行,如果某操作需要執行大量SQL語句或重復執行,存儲過程比SQL語句執行的要快。
- 減少網絡流量,例如一個需要數百行的SQL代碼的操作有一條執行語句完成,不需要在網絡中發送數百行代碼。
- 更好的安全機制,對于沒有權限執行存儲過程的用戶,也可授權他們執行存儲過程。
1.2,創建存儲過程的語法:
create [or replace] procedure 存儲過程名(param1 in type,param2 out type)
as
變量1 類型(值范圍);
變量2 類型(值范圍);
begin
select count(*) into 變量1 from 表A where列名=param1;
if (判斷條件) then
select 列名 into 變量2 from 表A where列名=param1;
dbms_output.Put_line('打印信息');
elsif (判斷條件) then
dbms_output.Put_line('打印信息');
else
raise 異常名(NO_DATA_FOUND);
end if;
exception
when others then
rollback;
end;
參數的幾種類型:
in 是參數的默認模式,這種模式就是在程序運行的時候已經具有值,在程序體中值不會改變。
out 模式定義的參數只能在過程體內部賦值,表示該參數可以將某個值傳遞回調用他的過程
in out 表示高參數可以向該過程中傳遞值,也可以將某個值傳出去
1.3,示范一些存儲過程
[下面一些存儲過程的操作根據自己數據庫中的內容進行內容顯示,只要顯示內容就正確,報錯除外- -,還有存儲過程盡量不要粘貼代碼,很容易報錯]:
1.3.1,不帶參數的存儲過程:
CREATE OR REPLACE PROCEDURE MYDEMO02
AS
name VARCHAR(10);
age NUMBER(10);
BEGIN
name := 'xiaoming';--:=則是對屬性進行賦值
age := 18;
dbms_output.put_line ( 'name=' || name || ', age=' || age );--這條是輸出語句
END;
--存儲過程調用(下面只是調用存儲過程語法)
BEGIN
MYDEMO02();
END;
1.3.2,帶參數的存儲過程:
CREATE OR REPLACE procedure MYDEMO03(name in varchar,age in int)
AS
BEGIN
dbms_output.put_line('name='||name||', age='||age);
END;
--存儲過程調用
BEGIN
MYDEMO03('姜煜',18);
END;
1.3.3,出現異常的輸出存儲過程:
CREATE OR REPLACE PROCEDURE MYDEMO04
AS
age INT;
BEGIN
age:=10/0;
dbms_output.put_line(age);
EXCEPTION when others then --處理異常
dbms_output.put_line('error');
END;
--調用存儲過程
BEGIN
MYDEMO04;
END;
- Oracle常見的三大異常分類[沒有詳細陳述,有興趣的同學可以自行查下]
- 預定義異常:由PL/SQL定義的異常。由于它們已在standard包中預定義了,因此,這些預定義異常可以直接在程序中使用,而不必再定義部分聲明。
- 非預定義異常:用于處理預定義異常所不能處理的Oracle錯誤。
- 自定義異常:用戶自定義的異常,需要在定義部分聲明后才能在可執行部分使用。用戶自定義異常對應的錯誤不一定是Oracle錯誤,例如它可能是一個數據錯誤。
1.3.4,獲取當前時間和總人數:
CREATE OR REPLACE PROCEDURE TEST_COUNT01
IS
v_total int;
v_date varchar(20);
BEGIN
select count(*) into v_total from EMP_TEST WHERE ENAME ='燕小六'; --into是賦值的關鍵字
select to_char(sysdate,'yyyy-mm-dd')into v_date FROM EMP_TEST WHERE ENAME ='郭芙蓉';
DBMS_OUTPUT.put_line('總人數:'||v_total);
DBMS_OUTPUT.put_line('當前日期'||v_date);
END;
--調用存儲過程
BEGIN
TEST_COUNT01();
END;
1.3.5,帶輸入參數和輸出參數的存儲過程:
CREATE OR REPLACE PROCEDURE TEST_COUNT04(v_id in int,v_name out varchar2)
IS
BEGIN
SELECT ENAME into v_name FROM EMP_TEST WHERE EMPNO = v_id;
dbms_output.put_line(v_name);
EXCEPTION
when no_data_found then dbms_output.put_line('no_data_found');
END;
--調用存儲過程
DECLARE
v_name varchar(200);
BEGIN
TEST_COUNT04('1002',v_name);
END;
1.3.6,查詢存儲過程以及其他:
CREATE OR REPLACE PROCEDURE job_day04(de in varchar,name out varchar,App_Code out varchar,error_Msg out varchar)
AS
BEGIN
SELECT ENAME into name FROM EMP_TEST WHERE ENAME=de;
EXCEPTION WHEN others THEN
error_Msg:='未找到數據';
END;
--調用存儲過程
DECLARE
de varchar(10);
ab varchar(10);
appcode varchar(20);
ermg varchar(20);
BEGIN
de:= '張三豐';
JOB_DAY04(de,ab,appcode,ermg);
dbms_output.put_line(ermg);
END;
1.3.7,向數據庫中添加數據的存儲過程
CREATE OR REPLACE PROCEDURE job_day05(do1 in varchar,dn1 in varchar,eo1 in number,en1 in varchar,App_Code out varchar,error_Msg out varchar)
AS
BEGIN
INSERT INTO STUDENT(NAME,CLASS)VALUES(do1,dn1);
INSERT INTO COMPANY(EMPID,NAME,DEPARNAME)VALUES(eo1,en1,do1);
COMMIT;
EXCEPTION WHEN OTHERS THEN
App_Code:=-1;
error_Msg:='插入失敗';
END;
--調用存儲過程
DECLARE
do1 varchar(10);
dn1 varchar(10);
eo1 number(20);
App_Code varchar(20);
error_Msg varchar(20);
BEGIN
do1:= '張三豐';
dn1:='新橋';
eo1:=1001;
JOB_DAY04(do1,dn1,App_Code,error_Msg);
dbms_output.put_line(ermg);
END;
這個比較麻煩,做的時候假如報錯就別找了- -我找了好久也沒找到,,,
2.0,游標的使用,看到的一段解釋很好的概念,如下:
- 游標是SQL的一個內存工作區,由系統或用戶以變量的形式定義。游標的作用就是用于臨時存儲從數據庫中提取的數據塊。在某些情況下,需要把數據從存放
- 在磁盤的表中調到計算機內存中進行處理,最后將處理結果顯示出來或最終寫回數據庫。這樣數據處理的速度才會提高,否則頻繁的磁盤數據交換會降低效率。
- 游標有兩種類型:顯式游標和隱式游標。在前述程序中用到的SELECT...INTO...查詢語句,一次只能從數據庫中提取一行數據,對于這種形式的查詢和DML操作,
- 系統都會使用一個隱式游標。但是如果要提取多行數據,就要由程序員定義一個顯式游標,并通過與游標有關的語句進行處理。顯式游標對應一個返回結果為多
- 行多列的SELECT語句。
- 游標一旦打開,數據就從數據庫中傳送到游標變量中,然后應用程序再從游標變量中分解出需要的數據,并進行處理。
- 在我們進行insert、update、delete和select value into variable 的操作中,使用的是隱式游標
- 隱式游標的屬性 返回值類型意義
- SQL%ROWCOUNT 整型 代表DML語句成功執行的數據行數
- SQL%FOUND 布爾型 值為TRUE代表插入、刪除、更新或單行查詢操作成功
- SQL%NOTFOUND 布爾型 與SQL%FOUND屬性返回值相反
- SQL%ISOPEN 布爾型 DML執行過程中為真,結束后為假
2.1,修改雇員薪資:
CREATE OR REPLACE PROCEDURE job_day06(epo in number)
AS
BEGIN
UPDATE EMPS SET SAL=(SAL+100) WHERE empno = epo;
IF SQL%FOUND --SQL%FOUND是隱式游標 作用:判斷SQL語句是否成功執行,當有作用行時則成功執行為true,否則為false。 6 THEN
DBMS_OUTPUT.PUT_LINE('成功修改雇員工資!');
commit;
else
DBMS_OUTPUT.PUT_LINE('修改雇員工資失敗!');
END IF;
END;
--調用存儲過程
declare
e_number number;
begin
e_number:=1001;
job_day06(e_number);
end;
2.2,查詢編號為1001信息
CREATE OR REPLACE PROCEDURE job_day07
IS
BEGIN
DECLARE
cursor emp_sor is select name,sal FROM EMPS WHERE EMPNO = '1001'; --聲明游標
cname EMPS.NAME%type; --%type 作用: 聲明的變量ename與EMPS表的NAME列類型一樣
csal EMPS.SAL%type;
BEGIN
open emp_sor; --打開游標
loop
-- 取游標值給變量
FETCH emp_sor into cname,csal;
dbms_output.put_line('name:'||cname);
exit when emp_sor%notfound;
end loop;
close emp_sor; --關閉游標
end;
end;
--調用存儲過程
BEGIN
job_day07();
END;
總結:
存儲過程通俗的理解就是就是一個執行過程,調用的時候給他所需要的需求就會對數據庫進行操作,相當于我們自己手寫Sql,只不過有了存儲過程
只要調用一下傳給他參數他就會幫我們寫,比較方便,靈活的運用存儲過程會讓我們開發很方便
到此這篇關于Oracle數據庫創建存儲過程的示例詳解的文章就介紹到這了,更多相關Oracle數據庫創建存儲過程內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Oracle 區塊鏈表創建過程詳解
- Oracle多表查詢中間表的創建實例教程
- Oracle數據庫scott用戶創建view視圖權限的操作方法
- Navicat Premium中Oracle創建主鍵自增的方法
- Navicat for oracle創建數據庫的方法
- 通過PLSQL Developer創建Database link,DBMS_Job,Procedure,實現Oracle跨庫傳輸數據的方法(推薦)
- oracle創建dblink方法示例
- Oracle 給rac創建單實例dg并做主從切換功能
- Oracle創建設置查詢權限用戶的方法
- Oracle創建新undo表空間最佳實踐(包含段檢查)
- 使用sqlplus命令行工具為oracle創建用戶和表空間
- Oracle創建只讀賬號的詳細步驟