預定義例外【處理常見的oracle錯誤】
-- no_data_found
-- 編寫乙個塊,輸入雇員的編號,並顯示改雇員的姓名
-- 如果雇員的編號不存在,怎樣去處理?
declare
v_name varchar2(50);
begin
select ename into v_name from emp where empno=&emp_no;
dbms_output.put_line('雇員名是;'||v_name);
exception
when no_data_found then
dbms_output.put_line('輸入的編號不存在!');
end;
-- case_not_found
create or replace procedure case_pro(emp_no number) is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=emp_no;
case
when v_sal<1000 then
update emp set sal=sal+100 where empno=emp_no;
when v_sal<2000 then
update emp set sal=sal+200 where empno=emp_no;
end case;
exception
when case_not_found then
dbms_output.put_line('case語句沒有與'||v_sal||'匹配的條件!');
end;
-- cursor_already_open
declare
-- 定義游標變數
-- 第二種定義游標的方法
cursor emp_cursor is select ename,sal from emp;
begin
open emp_cursor;--第一次開啟游標
for emp_record in emp_cursor loop--第二次開啟游標
dbms_output.put_line(emp_record.ename);
end loop;
exception
when cursor_already_open then
dbms_output.put_line('游標已經開啟');
end;
-- dup_val_on_index
begin
insert into dept values(10,'公安部','北京');
exception
when dup_val_on_index then
dbms_output.put_line('在deptno列上不能出現重複值');
end;
-- invalid_cursor
-- 當試圖在不合法的游標上執行操作時,會觸發該例外
-- 例如:試圖從沒有開啟的游標提取資料,或是關閉沒有開啟的游標。則會觸發該例外
declare
cursor emp_cursor is select ename,sal from emp;
emp_record emp_cursor%rowtype;
begin
open emp_cursor;--開啟游標
fetch emp_cursor into emp_record;
dbms_output.put_line(emp_record.ename);
fetch emp_cursor into emp_record;
dbms_output.put_line(emp_record.ename);
close emp_cursor;
exception
when invalid_cursor then
dbms_output.put_line('請檢查游標是否開啟');
end;
-- invalid_number
-- 當輸入的資料有誤時,會觸發該例外
-- 比如:數字100,寫成1oo就會觸發該例外
begin
update emp set sal=sal+'100' where empno=7788;
exception
when invalid_number then
dbms_output.put_line('輸入的數字不正確!');
end;
-- too_many_rows
-- 當執行select into語句時,如果返回超過了一行,則會觸發該例外
declare
v_ename emp.ename%type;
begin
select ename into v_ename from emp;
exception
when too_many_rows then
dbms_output.put_line('返回多行!');
end;
-- zero_divide
-- 當執行2/0語句時,則會觸發該例外。
-- value_error
-- 當在執行賦值操作時,如果變數的長度不足以容納實際資料,則會觸發該例外value_error,比如
declare
v_ename varchar2(3);
begin
select ename into v_ename from emp where empno=&emp_no;
dbms_output.put_line(v_ename);
exception
when value_error then
dbms_output.put_line('變數尺寸不足');
end;
-- 1.
-- login_denide
-- 當使用者非法登入時,會觸發該例外
-- 2.
-- not_logged_on
-- 如果使用者沒有登入就執行dml操作,就會觸發該例外
-- 3.
-- storage_error
-- 如果超出了記憶體空間或是記憶體被損壞,就觸發該例外
-- 4.
-- 如果oracle在等待資源時,出現了超時就觸發該例外
非預定義例外【處理預定義例外不能處理的例外】
自定義例外【處理與oracle錯誤無關的其它情況】
-- 編寫乙個塊,接收乙個雇員的編號,並給該雇員工資增加1000,
-- 如果該雇員不存在,請提示。
-- 自定義例外
-- 這裡是update和之前的select的no_data_found是不一樣的
create or replace procedure ex_test(emp_no number) is
-- 定義乙個例外
my_exception exception;
begin
update emp set sal=sal+1000 where empno=emp_no;
-- sql%notfound這是表示沒有update
-- raise my_exception;觸發my_exception例外
-- 什麼時候觸發
if sql%notfound then
raise my_exception;
end if;
-- 觸發時做什麼
exception
when my_exception then
dbms_output.put_line('沒有更新任何資料');
end;
PL SQL常用例外
oracle pl sql 例外處理 1 基本結構 begin 語句 exception 例外處理 when when others end 2 常用預定義例外 exception when cursor already open then ora 06511 sqlcode 6511 游標已經開啟...
PL SQL程式之例外
什麼是例外?例外是程式語言提供的一種功能,用來增強程式的健壯性和容錯性 oracle的異常處理 系統定義例外 no data found 沒有找到資料 too many rows select into語句匹配多個行 zero divide 被零除 value error 算術或轉換錯誤 timeo...
PL SQL 例外(異常) exception
異常是程式語言提供的一種功能,用來增強程式的健壯性和容錯性。1.系統定義異常 no data found 沒有找到資料 too many rows select into語句匹配多個行 zero divide 被零除 value error 算術或轉換錯誤 timeout on resource 在...