1. 程式人生 > >oracle-day04

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;