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;