oracle-day04
-- 異常 -- 唯一行約束異常 declare begin insert into dept values(10,'開發部','6樓'); exception when dup_val_on_index then dbms_output.put_line('破壞主鍵約束'); end; -- 自定義異常 declare no_delete_data exception; --宣告變數屬於異常型別 begin delete from dept where deptno=50; if sql%notfound then-- 隱含遊標 raise no_delete_data;-- raise 丟擲異常 end if; dbms_output.put_line('正常刪除資料'); exception --處理異常 when no_delete_data then dbms_output.put_line('刪除資料不存在'); end;
-- 事物 commit,rollback begin insert into dept values(1,'aaa','aa'); insert into dept values(1,'bbb','bb'); insert into dept values(3,'ccc','cc'); insert into dept values(4,'ddd','dd'); commit; exception when dup_val_on_index then rollback; end; -- 事物 savepoint,rollback to begin insert into dept values(1,'aaa','aa'); savepoint pointA;-- 儲存回滾點 insert into dept values(1,'bbb','bb'); insert into dept values(3,'ccc','cc'); rollback to pointA;--回滾到回滾點 insert into dept values(4,'ddd','dd'); end; -- 死鎖 A視窗 update dept set dname='aaa' where deptno=10;
update dept set dname='bbb' where deptno=20;--2
--B視窗 update dept set dname='aaa' where deptno=10;--1
update dept set dname='bbb' where deptno=20;--3 -------------------------------------------------------
--儲存過程 --無參儲存過程 create procedure pro_query_dept_bydno --儲存過程名稱 as --宣告部分 t_dname dept.dname%type; begin select dname into t_dname from dept where deptno=10; dbms_output.put_line('部門名稱'||t_dname); exception when no_data_found then dbms_output.put_line('部門不存在'); end;
--呼叫儲存過程方法一 begin pro_query_dept_bydno(); end; --方法二 call pro_query_dept_bydno();
-- 方法三 在命令列呼叫 exec pro_query_dept_bydno();
-- 帶有入參和出參的儲存過程 create procedure pro_query_ename_byeno(v_empno in number,v_ename out varchar2) as --in 入參 out 出參 begin select ename into v_ename from emp where empno=v_empno; exception when no_data_found then dbms_output.put_line('工號'||v_empno||'不存在'); end; -- 測試 declare t_ename emp.ename%type; begin pro_query_ename_byeno(7369,t_ename); dbms_output.put_line(t_ename); end; --------------------------------------------------
-- 動態新增資料 loop迴圈 create procedure pro_batch_add_dept(v_start number) as t_start number(2);-- v_start輸入值不能算數運算操作 t_end number(2); begin t_start:=v_start; t_end:=t_start+3; loop if t_start>t_end then exit; end if; insert into dept values(t_start,'開發'||t_start||'部',t_start||'樓'); t_start:=t_start+1; end loop; end; -- 動態新增資料 loop迴圈 帶while create procedure pro_batch_add_dept1(v_start number) as t_start number(2);-- v_start輸入值不能算數運算操作 t_end number(2); begin t_start:=v_start; t_end:=t_start+3;
while t_start <= t_end loop insert into dept values(t_start,'開發'||t_start||'部',t_start||'樓'); t_start:=t_start+1; end loop; end;
-- 動態新增資料 loop迴圈 帶for create procedure pro_batch_add_dept2(v_start number) as t_start number(2);-- v_start輸入值不能算數運算操作 t_end number(2); begin t_start:=v_start; t_end:=t_start+3;
for i in t_start..t_end loop insert into dept values(i,'開發'||i||'部',i||'樓'); end loop; end; ------------------------------------------------------
-- 函式 create or replace function fun_query_ename_byeno(v_empno emp.empno%type) return varchar2 -- 返回值型別 is t_ename emp.ename%type; begin select ename into t_ename from emp where empno = v_empno; return t_ename; exception when no_data_found then return '編號為' || v_empno || '員工不存在'; end;
-- 測試上面程式碼 declare t_ename varchar2(200); begin t_ename := fun_query_ename_byeno(7777); dbms_output.put_line(t_ename);end;
-- 函式(帶出參) create or replace function fun_query_ename_byeno1(v_empno emp.empno%type, v_job out emp.job%type) return varchar2 -- 返回值型別 is t_ename emp.ename%type; begin select ename, job into t_ename, v_job from emp where empno = v_empno; return t_ename; exception when no_data_found then return '編號為' || v_empno || '員工不存在'; end;
-- 測試 declare t_ename varchar2(200); t_job emp.job%type; begin t_ename := fun_query_ename_byeno1(7777, t_job); if t_job is null then dbms_output.put_line(t_ename); else dbms_output.put_line('姓名:' || t_ename || ' 職位:' || t_job); end if; end;