Oracle儲存過程語法學習

2021-05-21 14:06:18 字數 4653 閱讀 7252

儲存過程建立語法:

(1)無參

create or replace procedure 儲存過程名

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

變數2 型別(值範圍);

begin

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

exception

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

end;

(2)帶參

create or replace procedure 儲存過程名(param1intype,param2outtype)

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(『列印資訊』);

elsif (判斷條件) 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;

說明:

(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儲存過程語法學習(Procedure)

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

markdown語法學習

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

schema語法學習

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