ql/sql 循環語句、異常處理、事務處理!

1、ql sql 循環語句?sql

/*1.loop循環  
     
    語法:
       聲明循環變量
    loop
       判斷循環條件 ,若是循環條件不成立,跳出循if 條件表達式 then
    exit;
    end if;
        語句塊;
        改變循環變量的值
    end loop;
     
舉例:輸出1到100之內的天然
*/

declare
     --聲明循環變量
     v_i number(8):=1;
begin
  loop
    if v_i>100 then-- 判斷循環條件,條件成立,跳出循環
       exit;
    end if;
    dbms_output.put_line('輸出數字:'||v_i);-- 輸出1到100之內的天然數
    v_i:=v_i+1; -- 改變循環變量的值
  end loop;
end;

--需求:輸出部門表的全部內容?
--into只能用一個或者一行的方式賦值,咱們能夠用bulk collect into來給行類型變量總體賦值,也就是說能夠一次性
--把全部數據查詢出來,爲table類型的變量賦值。

declare
-- 聲明table類型
   type dept_table_type is table of dept%rowtype
   index by binary_integer;
-- 聲明table類型的變量,用來存儲部門表的全部數據
   v_dept dept_table_type;
-- 聲明循環變量
   v_i number(8):=1;   
begin
  -- 查詢全部部門表的內容,放到v_dept變量中
  select * bulk collect into v_dept from dept;
  loop
   if v_i>v_dept.count then --設置條件 結束循環
    exit;
    end if;
    dbms_output.put_line(
      '部門編號'||v_dept(v_i).deptno||'  部門名稱'||v_dept(v_i).dname||'   部門位置'||v_dept(v_i).loc
    );
    v_i:=v_i+1; --改變循環變量的值
  end loop;
    
end;

/**2.while循環

語法:
  聲明循環變量,給循環變量賦初始值
while 條件表達式
loop
      語句塊;
      改變循環變量的值
end loop;

舉例:輸出1到100之內的天然

*/

declare

    v_i number(6):=1;-- 聲明循環變量
begin
  while v_i<101--若是條件成立,執行循環
    loop
      dbms_output.put_line(v_i);
      v_i:=v_i+1;-- 改變循環變量的值
    end loop;
end;


/**3.for 循環
     
語法:
         for 循環變量 in 循環變量的開始值..循環變量的結束值
         loop
語句塊;
         end loop;
         
注意:for循環,循環變量能夠直接使用,不用聲明。in 包含循環變量的開始值和結束值
*/
--舉例:輸出1到100之內的天然

begin
  for v_i in 1..100 -- 循環變量不用聲明  真爽!
    loop
      dbms_output.put_line(v_i);
    end loop;
end;

2、異常處理數據庫

/**2、異常處理
        直接讓用戶看到程序的信息是很差的,最好以友好的方式輸出出來。
*/
--1.內置異常  舉例:根據員工編號查詢員工姓

declare
    --聲明員工姓名的變量
  v_ename emp.ename%type;
  v_num number(5);
  
begin
  v_num:=56565;
  v_num:=465465465;
  select ename into v_ename from emp;
  dbms_output.put_line('員工姓名:'||v_ename);
  
exception
 -- 當異常發生的時候作什麼處理
 when no_data_found then 
   dbms_output.put_line('沒有找到該員工編號');
   
 --除數爲0的異常
 when zero_divide then  
   dbms_output.put_line('除數不能爲0');
 when too_many_rows then
   dbms_output.put_line('返回行數過多');
 when others then
   dbms_output.put_line('出現了其餘異常');
  
end;


/**2.自定義異常
語法:
   declare
   --聲明異常變量
變量名稱 exception;
begin
     --拋出異常
     raise 變量名稱;
exception
     -- 處理異常
     when 變量名稱 then
     業務處理
end;
*/
--舉例:根據員工編號刪除員工信息,若是刪除的員工不存在,拋出異常,在控制檯打印沒有刪除成功

declare
   -- 聲明異常變量
   v_myex exception;  

begin
  -- 根據員工編號刪除員工
  delete from emp where empno=&no;
  -- 暫時要用到隱含遊標
  if sql%notfound then 
    --拋異常
    raise v_myex;
  end if;
-- 處理異常 
exception
  when v_myex then
    dbms_output.put_line('要刪除的員工不存在');
  

end;

3、事物處理oracle

/**3、事物處理
         事物的acid特性 and 事物的死鎖
*/

--1.原子性  數據庫增刪改操做,要麼所有成功,要麼所有失敗。

/*2.一致性
  對於數據庫的操做必須符合業務邏輯。
  張三給李四轉1000元,不能出現張三的錢少了1000 李四就收到800*/

/**3.隔離性
    多個數據庫操做之間不能產生干擾
  張三給李四轉1000元,不能出現張三的錢少了1000,結果另一我的王五的錢多了1000.
*/

/**4.持久性
  數據庫的操做應該是永久持久化到物理介質(硬盤)上
  張三給李四轉1000元,不能出現今天張三的錢少了1000. 李四的增長了1000.過了一天張三的錢又回了。
*/

/**5.pl/sql中事物的操做方式
      在pl/sql中,能夠定義事物的回顧點,能夠回顧事物,也能夠定義回滾點
      savepoint 回滾點名稱;
      
      回滾事物
      rollback to 回滾點名稱;
      
      提交事物
      commit;
      
      舉例:往部門表中插入多條數據
*/
select * from dept;
begin
  -- 定義事物回滾點
  savepoint a;
  insert into dept values(1,'技術部','鄭州');
  insert into dept values(2,'公關部','鄭州');
  
  -- 回滾事物
  rollback to a;
  insert into dept values(12,'小賣部','鄭州');
  
  -- 提交事物
  commit;

end;

/**6.事物的死鎖 
      數據庫中事物若是使用不當,有可能會出現死鎖的問題。
      爸爸對兒子說,你給我成績單,我就給你玩具。
      兒子對爸爸說,你給我玩具,我就給你成績單。
      
   7.oracle中鎖的概念
       oracle中使用鎖的機制來實現事物。oracle中分兩種常見的鎖 排他鎖,共享鎖。
       增刪改數據庫記錄的時候,就會在
       操做記錄的行上加上排他鎖。查詢的時候會在查詢的記錄上加上共享鎖。
*/

select * from dept;
insert into dept values(21,'技術部','鄭州');
insert into dept values(22,'公關部','鄭州');

--模擬兩個事物都對  數據庫中的部門表1和2 的數據進行更新
update dept set dname='技術部' where deptno=1;
update dept set dname='公關部' where deptno=2;
相關文章
相關標籤/搜索