實驗五 PL/SQL程式設計基礎
一、實驗目的
1) 掌握PL/SQL程式設計基礎知識
2) 掌握PL/SQL資料型別、變數和常量的宣告
3) 掌握PL/SQL程式的控制結構
4) 掌握PL/SQL程式中游標、異常處理的方法
二、預習內容
1) PL/SQL語言的特點及功能特性是什麼?
與SQL語言緊密整合,所有的SQL語句在PL/SQL中都可以得到支援。 2. 減小網路流量,提高應用程式的執行效能。 3. 模組化的程式設計功能,提高了系統的可靠性。 4. 伺服器端程式設計的可移植性好。
2) PL/SQL程式結構及各個部分的作用是什麼?
宣告部分:以關鍵字DECLARE開始,BEGIN結束。主要用於宣告變數、常量、資料型別、遊標、異常處理名稱以及本地(區域性)子程式定義等。
執行部分:是PL/SQL塊的功能實現部分,以關鍵字BEGIN開始,EXCEPTION或END結束(如果PL/SQL塊中沒有異常處理部分,則以END結束)。該部分通過變數賦值、流程控制、資料查詢、資料操縱、資料定義、事務控制、遊標處理等實現塊的功能。
異常處理部分:以關鍵字EXCEPTION開始,END結束。該部分用於處理該塊執行過程中產生的異常。
3) 什麼是遊標?顯式遊標的操作包括哪幾個步驟?
遊標(CURSOR)是指向Oracle系統記憶體一個工作區的指標,在其中存放SELECT語句返回的查詢結果。
4) 說明PL/SQL程式中的異常處理機制。
Oracle中對執行時錯誤的處理採用了異常處理機制。一個錯誤對應一個異常,當錯誤產生時就丟擲相應的異常,並被異常處理器捕獲,程式控制權傳遞給異常處理器,由異常處理器來處理執行時錯誤。
三、實驗環境
32位Windows XP/WindowsServer2000/Windows Server2003 +Oracle10g環境
四、實驗內容
根據Oracle資料庫scott模式下的emp表和dept表,完成下列操作。
1) 編寫一個PL/SQL塊,輸出所有員工的員工姓名、員工號、工資和部門號。
DECLARE
CURSOR c_emp IS select * from emp; BEGIN
FOR v_emp IN c_emp LOOP
DBMS_OUTPUT.PUT_LINE(v_emp.ename||' '||v_emp.empno||' '||v_emp.deptno||' '||v_emp.sal); END LOOP; END;
2) 編寫一個PL/SQL塊,輸出所有比本部門平均工資高的員工資訊。
declare
cursor c_emp is select * from emp where sal>(select avg(sal) from scott.emp); v_emp c_emp%rowtype; begin
open c_emp;
loop fetch c_emp into v_emp; exit when c_emp%notfound;
dbms_output.put_line(v_emp.ename||' '||v_emp.sal); end loop; close c_emp; end;
3) 編寫一個PL/SQL塊,輸出所有員工及其部門領導的姓名、員工號及部門號。
declare
cursor c_emp is select * from emp where sal>(select avg(sal) from scott.emp); v_emp c_emp%rowtype; begin
open c_emp;
loop fetch c_emp into v_emp; exit when c_emp%notfound;
dbms_output.put_line(v_emp.ename||' '||v_emp.sal); end loop; close c_emp; end;
4) 查詢姓名為“Smith”的員工資訊,並輸出其員工號、姓名、工資、部門號。如果該員工不存在,則插入一條新記錄,員工號為2012,員工姓名為“Smith”,工資為7500元,入職日期為“2002-03-05”,部門號為50;如果存在多個名為Smith的員工,則輸出所有名為“Smith”的員工號、姓名、工資、入職日期、部門號。
Declare
v_emp emp%rowtype; begin select * into v_emp from scott.emp where ename='SMITH'; dbms_output.put_line(v_emp.empno||''||v_emp.ename||''||v_emp.sal||' '||v_emp.hiredate||''||v_emp.deptno); exception when no_data_found then
insert into scott.emp(empno,ename,sal,hiredate,deptno) values(2012,'SMITH',7500,'5-3 月-2002',50);
when too_many_rows then
for v_emp in (select * from scott.emp where ename='SMITH')LOOP dbms_output.put_line(v_emp.empno||''||v_emp.ename||''||v_emp.sal||' '||v_emp.hiredate||' '||v_emp.deptno); end loop; end;
五、實驗步驟
寫出每一項實驗內容對應的SQL語句。
六、思考題
遊標與遊標變數有什麼區別?
oracle遊標是資料庫中一個命名的工作區,當遊標被聲明後,他就與一個固定的SQL想關聯,在編譯時刻是已知的,是靜態的.它永遠指向一個相同的查詢工作區.
遊標變數可以在執行時刻與不同的SQL語句關聯,在執行時可以取不同的SQL語句.它可以引用不同的工作區.
oracle遊標和遊標變數是不能相互代替的. 如何定義遊標型別
TYPE ref_type_name IS REF CURSOR [RETURN return_type]; 宣告遊標變數
cursor_name ref_type_name;
ref_type_name 是後面宣告遊標變數時要用到遊標型別(自定義遊標型別,即CURSOR是系統預設的,ref_type_name是我們定義的 );return_type代表資料庫表中的一行,或一個記錄型別TYPE ref_type_name IS REF CURSOR RETURN employee%TYPE
RETURN 是可選的,如果有是強型別,可以減少錯誤,如果沒有return是弱引用,有較好的靈活性. 不能在包頭裡面宣告遊標變數,注意,但可以定義遊標型別,要注意這二者的區別. 可以宣告遊標變數作為函式或過程的形式引數. 6) 說明PL/SQL程式中的異常處理機制。
Oracle中對執行時錯誤的處理採用了異常處理機制。一個錯誤對應一個異常,當錯誤產生時就丟擲相應的異常,並被異常處理器捕獲,程式控制權傳遞給異常處理器,由異常處理器來處理執行時錯誤
七、實驗總結
通過本次實驗我掌握PL/SQL程式設計基礎知識,及其資料型別、變數和常量的宣告。同時思考了遊標與變數的區別。只要掌握的基本的語法,資料庫操作大致相同。