Oracle儲存過程語法學習(Procedure)

2021-08-30 18:44:52 字數 3962 閱讀 6177

儲存過程建立語法:

(1)無參

create or replace procedure 儲存過程名

as變數1 型別(值範圍);

變數2 型別(值範圍);

begin

........................

exception

........................

end;

(2)帶參

create or replace procedure 儲存過程名(param1 in type,param2 out type)

as 變數1 型別(值範圍);

變數2 型別(值範圍);

begin

select count(*) into 變數1 from 表a where列名=param1;

if (判斷條件) then

select 列名 into 變數2 from 表a where列名=param1;

dbms_output.put_line(『列印資訊』);

elseif (判斷條件) then

dbms_output.put_line(『列印資訊』);

else

raise 異常名(no_data_found);

end if;

exception

when others then

rollback;

end;

注意事項:

1, 儲存過程引數不帶取值範圍,in表示傳入,out表示輸出

2, 變數帶取值範圍,後面接分號

3, 在判斷語句前最好先用count(*)函式判斷是否存在該條操作記錄

4, 用select 。。。into。。。給變數賦值

5, 在**中拋異常用 raise+異常名

以命名的異常

命名的系統異常 產生原因

access_into_null 未定義物件

case_not_found case 中若未包含相應的 when ,並且沒有設定

else 時

collection_is_null 集合元素未初始化

curser_already_open 游標已經開啟

dup_val_on_index 唯一索引對應的列上有重複的值

invalid_cursor 在不合法的游標上進行操作

invalid_number 內嵌的 sql 語句不能將字元轉換為數字

no_data_found 使用 select into 未返回行,或應用索引表未初始化的

too_many_rows 執行 select into 時,結果集超過一行

zero_divide 除數為 0

subscript_beyond_count 元素下標超過巢狀表或 varray 的最大值

subscript_outside_limit 使用巢狀表或 varray 時,將下標指定為負數

value_error 賦值時,變數長度不足以容納實際資料

login_denied pl/sql 應用程式連線到 oracle 資料庫時,提供了不正確的使用者名稱或密碼

not_logged_on pl/sql 應用程式在沒有連線 oralce 資料庫的情況下訪問資料

program_error pl/sql 內部問題,可能需要重灌資料字典& pl./sql系統包

rowtype_mismatch 宿主游標變數與 pl/sql 游標變數的返回型別不相容

self_is_null 使用物件型別時,在 null 物件上呼叫物件方法

storage_error 執行 pl/sql 時,超出記憶體空間

sys_invalid_id 無效的 rowid 字串

timeout_on_resource oracle 在等待資源時超時

例子:

1 create or replace procedure runbyparmeters (isal in emp.sal%type,

sname out varchar,sjob in out varchar)

2 as icount number;

3 begin

4 select count(*) into icount from emp where sal>isal and job=sjob;

5 if icount=1 then

6 ....

9 else

10 ....

12 end if;

13 exception

14 when too_many_rows then

15 dbms_output.put_line('返回值多於1行');

16 when others then

17 dbms_output.put_line('在runbyparmeters過程中出錯!');

18 end;

過程呼叫

方式一1 declare

2 realsal emp.sal%type;

3 realname varchar(40);

4 realjob varchar(40);

5 begin

6 realsal:=1100;

7 realname:='';

8 realjob:='clerk';

9 runbyparmeters(realsal,realname,realjob); --必須按順序

10 dbms_output.put_line(realname||' '||realjob);

11 end;

12方式二

1 declare

2 realsal emp.sal%type;

3 realname varchar(40);

4 realjob varchar(40);

5 begin

6 realsal:=1100;

7 realname:='';

8 realjob:='clerk';

9 runbyparmeters(sname=>realname,isal=>realsal,sjob=>realjob); --指定值對應變數順序可變

10 dbms_output.put_line(realname||' '||realjob);

11 end;

說明:(1)使用%type

在許多情況下,pl/sql變數可以用來儲存在資料庫表中的資料。在這種情況下,變數應該擁有與表列相同的型別。例如,students表的first_name列的型別為varchar2(20),我們可以按照下述方式宣告乙個變數

declare

v_firstname varchar2(20);

這時,你可以使用」%type」屬性而不是將變數型別硬性編碼。

(2)使用%rowtype (相當於定義乙個struct 來進行存放,以物件來看對資料)

在pl/sql中將乙個記錄宣告為具有相同型別的資料庫行的作法是很常見的。pl/sql提供了%rowtype運算子,使得這樣的操作更為方便。

例如:declare

v_studentrecord students%rowtype;

將定義乙個記錄,該記錄中的字段將與students表中的列相對應。

例如:declare

v_jobs hr.jobs%rowtype;

begin

select

*into

v_jobs

from

hr.jobs

where job_id ='&aa';

dbms_output.put_line('序號'||v_jobs.job_id );

dbms_output.put_line('名稱'||v_jobs.job_title);

end;

執行,我們輸入aa變數的值:ad_vp

輸出結果為:

序號ad_vp

名稱administration vice president

Oracle儲存過程語法學習

儲存過程建立語法 1 無參 create or replace procedure 儲存過程名 as 變數1 型別 值範圍 變數2 型別 值範圍 begin exception end 2 帶參 create or replace procedure 儲存過程名 param1intype,param...

markdown語法學習

markdown是純文字格式的語法,支援轉換為html,可以幫助整理知識 學習筆記 markdown的段落是由若干行文字組成,前後由空行隔開 普通段落不該用空格或製表符縮排 markdown支援兩種標題樣式 setext和atx setext風格的標題用符號 first level 和 second...

schema語法學習

xml schema 學習總結 簡單型別 1 簡單元素 指只能包含文字內容,不能夠包含子元素,也沒有屬性的元素。格式 例子 2 屬性 所有的元素屬性均被宣告為簡單型別。只有複雜型別的元素才可以擁 有屬性。格式 例子 所有的屬性預設都是可選的,我們可以通過使用use 關鍵字明確的指出是可選 或是必需 ...