寫給那些沒有用過oracle儲存過程但又準備學習的同志們
公司屬於外包公司,公司所用的是oracle資料庫,所以,避免不了操作oracle資料庫,而且動不動就是呼叫儲存過程,但是發現一個問題,對於儲存過程的學習還是有相對有限的系統性的學習資料。都是一些零碎的學習資料,東一榔頭西一棒槌。所以本人在這裡就給大家操作一波儲存過程,從基礎語法到java程式呼叫儲存過程。這幾篇文章只是學習的起步,但又是學習儲存過程至關重要的一個環節,相信你看完這篇文章可以說是對儲存過程已經學習了三分之一了。因為儲存過程沒有太多複雜的語法,作為plsql語言,我認為學習他可以參考一們語言來比對學習可以達到事半功倍的效果。廢話不多說了,開始學習之旅吧。
學前準備工具
- plsql開發工具
- oracle客戶端
- oracle伺服器
關於安裝oracle教程這裡就不再一一細說了,我的服務端是安裝在本機虛擬機器上的windosxp上的。因為我嘗試了不下於五次來安裝到linux。所以就放棄了linux的安裝,這個無關緊要。
基礎語法部分:
首先開啟plsql工具,點選File---->new --->Test window
-- Created on 2018/9/12 by LENOVO
declare
-- Local variables here
i integer;
begin
-- Test statements here
end;
上邊就是一個plsql能夠執行的基本架構(並不是儲存過程),其中
declare 顧名思義就是描述的意思就是在這個下邊可以對變數進行宣告。
宣告變數有大概如下兩三種方式
1. v_temp varchar(10)
2.v_temp tablename.property%type(表明屬性名%type就是該表屬性的型別,這樣可以靈活使用)
3.v_stu student%rowtype;(這種型別就是定義一個變數為表資料的行型別用於接受查詢的一行資料,注意是一行資料)
接下來可以看到begin,這裡的begin類似於我們的java中的main函式這裡可以對變數進行賦值,而且程式是從這來開始來正式執行的。所以一般我們在這裡對變數進行賦值
-- Created on 2018/9/9 by LENOVO
--宣告變數,宣告一個人的姓名,薪水,地址
declare
-- Local variables here
--姓名
v_name varchar2(50) :='張三丰';
--薪水
/* v_salary number(6,2);*/
v_salary emp.ename%type;
--地址
v_address varchar2(100);
v_stu student%rowtype;
begin
-- Test statements here
--dbms_output.put_line('hello world');
v_salary:=1500;
--語句賦值操作。
上邊這裡begin下邊就是對v_salary進行賦值,這裡有一點需要注意:plsql中的複製是:=而不是單個=,單個=是判斷是否相等意思。這一點需要大家注意。
既然變數也聲明瞭,也賦值了,那麼我們需要測試如何輸入該值。
接下來就來告訴大家一個輸出操作語句 dbms_output.put_line()
上邊這個語句類似於System.out.println()操作,是不是很像哈哈。
來個完成的程式,大家可以複製貼上進你的test窗口裡,執行它
-- Created on 2018/9/9 by LENOVO
--宣告變數,宣告一個人的姓名
declare
-- Local variables here
--姓名
v_name varchar2(50) ';
begin
v_name:=:='張三丰;
dbms_output.put_line('姓名---〉'||v_name);
end;
上邊這個程式中就可以按一下F8(快捷鍵)來執行了,執行結果可以在下邊這個方框裡查看了。
其中dbms_output.put_line是輸出的重要操作。
迴圈:
下邊講一下關於plsql中關於迴圈的使用。
loop關鍵詞就是迴圈的意思,不論大家學習哪門語言都會發現迴圈的特點就是有入口,有出口(不可能讓其死迴圈)。
這裡也不例外。下邊是一個栗子:
declare
vcc number;
begin
vcc:=1;
loop
exit when vcc>10;
dbms_output.put_line(vcc);
vcc:=vcc+1;
end loop;
end;
栗子有了,那麼就開始剖析了,宣告變數就不說了,目的就是為了給出入口,下邊就是開始寫loop,那麼既然有loop肯定要有end loop 就如你寫for(int i=0;i<10;i++){ }總不能只寫前邊這個花括號就把後邊給忘記了哈。loop與end loop 就可以真正執行迴圈了,那麼什麼時候能夠跳出迴圈呢,這裡有一個關鍵字exit 很顯然退出嘛:什麼時候退出呢,when 呀,當滿足when後邊的條件就退出了,可見when 後邊跟的是一個boolean結果的表示式。dbms_output.put_line(vcc);就是真正執行的迴圈語句。
遊標
遊標一詞我們在資料庫中估計很少聽說吧,不過你是否記得在學習jdbc操作的時候返回的結果集。ResultSet呢其實這裡的結果集就可以通過遊標來取的。如果你一臉矇蔽只能說你jdbc學的不咋地哦。那就繼續加油哦。
遊標這個是非常重要的知識點,希望大家認真學哦。
先來說說遊標的屬性:
--遊標的屬性: -- %rowcount 整型 獲得fetch語句返回的資料行數 --%found 布林型 最近的fetch語句返回一行資料則為真,否則為假 --%notfound 布林型 與%found屬性的返回值相反 --%isopen 布林型 遊標已經開啟則為真,否則為假 --其中%notfound是遊標中找不到元素時候返回true,通常用來判斷推退出迴圈。
遊標的使用需要有四個步驟,記住這四個步驟即可。
宣告------》開啟-----》取值-----》關閉
--宣告遊標:利用關鍵字 cursor + 任意名字[引數列表(可有可無)] +is +你的sql語句
eg:cursor cur is select name,age from student;
這裡就是聲明瞭一個遊標並且給其賦值。
開啟遊標:open + 遊標;
eg:open cur;
這裡沒有什麼可說的就類似於jdbc 的connection的open方法
取值:取值有一個關鍵字叫做fetch英文翻譯來就是抓取的意思 使用方法如下::
fetch +遊標名稱 into 你定義的變數;就是將抓取的遊標賦給你之前定義的其他變數。
因為既然使用了遊標肯定是有多行資料。所以一般這裡的fetch都是放在loop裡邊的。
eg:
--宣告變數接受遊標中的資料。
v_name student.name%type;
v_num student.age%type;
begin
--開啟遊標
open cur;
--遍歷取值
loop
--獲取遊標中德資料,如果有則賦值變數,否則退出
fetch cur into v_name v_num;
exit when cur%notfound dbms_output.put_line('姓名:' || v_name || '年齡:' ||v_num);
end loop;
--關閉遊標
close cur;
關閉遊標:當便利完畢關閉遊標即可:close +遊標名;
上邊有個語法叫做exit when cur%notfound dbms_output.put_line('姓名:' || v_name || '年齡:' ||v_num);
這裡的屬性cur%notfound就是如果遊標中沒有值返回true,因為每次遊標都是向下讀取的。讀到沒有資料就會返回cur%notfound為true。
儲存過程的建立
上邊只是儲存過程中的一些語法,下邊我們開始建立儲存過程:
右鍵單擊這個--->new
然後name寫上儲存過程名號曾,parameters可以不寫。
下邊就是一個模板:
然後就可以在這裡寫具體業務邏輯了。其實這裡的declare沒有了但我們宣告變數直接在begin上邊生命,begin裡進行賦值然後寫業務邏輯即可。
create or replace procedure p_hello is
--無參的儲存過程。
--宣告變數
--呼叫方法1.新建一個TEST WINDOW begin與end之間輸入 p_hello;即可執行
--在控制檯裡輸入 exec 儲存過程名
begin
dbms_output.put_line('hello world');
end p_hello;
/
上邊就是一個helloworld版本的儲存過程。儲存過程是不能直接執行的我們可以藉助上邊用的Test window來呼叫儲存過程。
declare
begin
p_hello;
end;
這樣執行f8就可以看到輸出helloworld至此呼叫儲存過程成功。
上邊是無參的儲存過程。不過不早了,明天還要上班呢,明天晚上再寫一篇。希望大家看了以後如果感覺有用還希望給個贊,不嫌棄的話就加個關注吧,最近會在儲存過程以及springboot springcloud docker上進行研究。