個人總結——千里之行,始於足下
阿新 • • 發佈:2021-01-07
*儲存過程*
*概念:*
之前我們編寫的plsql程式可以進行表的操作,判斷、迴圈邏輯處理的工作,但無法重複呼叫。
可以理解之前的程式碼全部編寫在了main方法中,是匿名程式,java可以通過封裝物件和方法來解決複用問題。
Plsql是將一個個plsql的業務員處理過程儲存起來進行復用,這些被儲存起來的plsql程式稱之為儲存過程。
*儲存過程作用:*
\1. 在開發程式中,為了一個特定的業務功能,會向資料庫進行多次連線關閉(連線關閉是很消費資料庫資源的),需要對資料庫進行多次i/o讀寫,效能比較低,如果把這些業務放到plsql中,在應用程式中只需要呼叫plsql就可以做到連線關閉一次資料庫就可以實現我們的業務,可以大大提高效率。
\2. Oracle官方給的建議:能夠讓資料庫操作的不要放在程式中。在資料庫中實現基本上不會出現錯誤,在程式中操作可能會存在錯誤,(如果在資料庫中操作資料,可以有一定的日誌恢復等功能)
*語法*
Create or replace procedure 過程名稱[(引數列表)] is
Begin
End [過程名稱]
根據引數的型別,我們將其分為3類講解:
不帶引數的
帶有輸入引數的
帶輸入輸出引數(返回值)的
*不帶引數的儲存過程:*
*小案例(熱身)**列印輸出:hello world*
create or replace procedure p_hello is begin dbms_output.put_line('hello world'); end p_hello;
呼叫儲存過程:
begin
p_hello;
end;
我們剛才建立的儲存過程:
注意:***
第一個問題:is 和 as是可以互相使用的,用哪個關鍵字是沒有關係的
第二個問題:過程中沒有declare關鍵字,declare用在語句塊中
*帶有輸入引數的儲存過程*
【示例】查詢並列印某個員工(如7839號員工)的姓名和薪水-儲存過程:要求,呼叫的時候傳入員工編號,自動控制臺列印。
create or replace procedure p_querynameandsal(i_empno in emp.empno%type) as --宣告變數 v_name emp.ename%type; v_sal emp.sal%type; begin --查詢emp表中某個員工的姓名和薪水並賦值給變數 select ename,sal into v_name,v_sal from emp where empno=i_empno; dbms_output.put_line(v_name||'-'||v_sal); end; --end 後面的儲存過程名字必須和前面宣告的名字保持一致,要不就不要寫
執行:
begin
p_querynameandsal(7839);
end;
執行結果:KING-5000
*帶輸入輸出引數的儲存過程*
小案例;查詢7839號員工的薪水,並將薪水結果返回並且輸出。
create or replace procedure p_querysal_out(i_empno in emp.empno%type,o_sal out emp.sal%type) as
begin
--查詢emp表中某個員工的薪水並將查詢返回
select sal into o_sal from emp where empno=i_empno;
end;
--end 後面的儲存過程名字必須和前面宣告的名字保持一致,要不就不要寫
執行該儲存過程:
declare
--宣告變數接收儲存過程中的輸出引數
v_sal emp.sal%type;
begin
p_querysal_out(7839,v_sal);
dbms_output.put_line('薪水:'||v_sal);
end;
*執行結果:
薪水:5000