1. 程式人生 > 實用技巧 >個人總結——千里之行,始於足下

個人總結——千里之行,始於足下

*儲存過程*

*概念:*

之前我們編寫的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