儲存過程建立語法:
(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 關鍵字明確的指出是可選 或是必需 ...