Oracle儲存過程完整結構講解

2021-07-04 14:45:51 字數 3155 閱讀 9949

一、弄清我們和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...