一、弄清我們和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_***xx(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_***(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)
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,其它地方無區別
MySQL 儲存過程精講
在實際開發中,程式設計師相較於 dba 來說,對資料庫的理解不是特別的深。儲存過程相比於一般的 sql,可以做複雜的邏輯判斷,實現更加複雜表操作,比如根據一張表的資料去更新另一張表的資料 多張表資料比較結果等。本文將對 mysql 的儲存過程從零開始講解,結合實際案例,讓你從入門到實際運用 主要包括...
Oracle儲存過程呼叫儲存過程
oracle儲存過程呼叫有返回結果集的儲存過程一般用光標的方式,宣告乙個游標,把結果集放到游標裡面,然後迴圈游標 declare newcs sys refcursor cs1 number cs2 number cstype table rowtype table列的個數和newcs返回的個數一樣...
ORACLE儲存過程
自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...