Oracle儲存過程完整結構講解
一、弄清我們和oracle的主僕角色關係
我們是主人,oracle是僕人。
它具備建立、執行和管理儲存過程的能力,而我們除了下命令其它什麼都不會
我們只需要向oracle講清楚需要幹什麼,便能夠得到我們想要的東西
二、告訴oracle我們想建立一個什麼樣的儲存過程
create or replace procedure prc_test(i_param1 in varchar2,i_param2 in date,i_param3 IN number ,o_result_code out varchar2)
1、要幹嘛?:create or replace 建立或替換一樣東西(加“or replace”是需要修改時省去先刪除再重新建立的麻煩)
2、要建立或替換什麼東西?:procedure 儲存過程(oracle還支援建立表table、表空間tablespace、同義詞synonym、序列sequence等等)
3、給這個儲存過程取什麼名字?:prc_xxxxx(prc_開頭是為了便於一眼看出是個儲存過程)
4、這個儲存過程執行時需不需要引數?:i_param_name in type
i_param_name引數名,i開頭便於一眼看出是入參;
in標識是入參,出參用out;
type是型別,如varchar2,date,number等,多個引數用“;”隔開)
5、這個儲存過程執行結束需不需要返回結果?:o_param_name out type,同入參
三、告訴oracle需要這個儲存過程幹什麼事
我們知道做什麼事,但是不會做;oracle提供了很多工具和做事能力,但是不知道做什麼事。
因此我們先得了解清楚oracle提供的工具和幹事的能力,然後加以組裝從而指導oracle幫我們把事幹掉
3.1 存放臨時資料的容器
在處理事情的過程中,總會臨時產生或得到一些資料,暫時不用,但又不能扔,因為後面又會用到,怎麼辦?oracle提供了幾種臨時存放的容器
儲存過程定義和begin之間,用is/as標識
create or replace procedure prc_xxx(in,out)
as/is
臨時變數列表;
begin
3.1.1 存放單個值——基本型別臨時變數
a、寫明具體變數型別
字串:t_param_name varchar2(20),注意,臨時變數必須指明大小,入參不用;
數字:t_param_name number(9);整型數字,最大9位數
t_param_name number(9,4);帶小數的數字,最大9位,其中小數部分4位,整數部分5位(9-4)
時間:t_param_name date;
b、指定跟現存的某張表的某個一致
t_name user.name%type; 現存有一張user表,含有欄位name,該臨時變數跟該表的name的型別一致
這樣寫的目的:如果要把user表的name的值臨時存放,就不需要關心到底該欄位是什麼型別,保持一致就ok了
3.1.2 存放一條記錄——複合臨時變數
如果要存放的是一條記錄,比如一個使用者user,該記錄含有使用者名稱、密碼、年齡、部門等,放在一個物件變數會簡單很多
a、根據單張表定義複合變數
t_user_info user%rowtype; 當前存在一張user表,該物件變數跟user一致,即欄位相同,每個欄位的型別和長度相同
b、根據多表關聯查詢定義複合變數
可以直接根據各表的相應欄位確定型別
type user_info is record(
u_name user.name%type,
u_dept_no depet.dept_no%type
);
t_user_info user_info;
c、自定義複合變數
type user_info is record(
u_name varchar2(20),
u_age varchar2(500)
);
t_user_info user_info;
3.1.3 存放多條記錄—— 遊標(陣列)臨時變數
遊標臨時存放一個sql的查詢結果集,可以通過對該結果集進行遍歷,從而逐條處理。此處只是定義遊標,並不執行,真正的執行時開啟遊標時
cursor c_ps_action is select * from tab_user a,tab_dept b where a.dept_no=b.dept_no and t.age >20;
ok,oracle提供的臨時儲存變數的容器介紹完畢,支援我們存放單個值(簡單變數)、單條記錄(複合變數)、一組記錄(遊標),下面講解如何處理業務。
3.2 使用臨時變數和入/出參
3.2.1 使用臨時變數
無需新增任何額外識別符號,直接使用即可,比如定義了臨時變數t_param,使用的時候直接用t_param即可;符合物件t_user_info.u_name,即".“+屬性
3.2.2 給臨時變數賦值
a、手工賦值“:=”
簡單變數 t_param :=11;
b、通過查詢sql賦值
普通的sql語句,查詢結果欄位後面加”into 臨時變數“
單個變數賦值:select user_name into t_u_name from tab_user ; t_u_name為臨時變數
多個變數賦值:select user_name, user_age into t_u_name,t_u_age from tab_user ; 兩個變數,按先後順序賦值
符合物件賦值:select user_name, user_age into t_user_info from tab_user ; t_user_info含有t_u_name和t_u_age欄位,若順序顛倒,可以用".屬性"指定
3.3 執行開始和結束
begin 開始
return; 強制結束
commit; 提交執行結果(若有增刪改,必須寫commit提交,否則白做)
end 儲存過程名; 結束
關於as和is的區別:檢視只能用as,遊標只能用is,其它地方無區別