1. 程式人生 > >實驗五 PL/SQL程式設計基礎

實驗五 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開始,EXCEPTIONEND結束(如果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程式設計基礎知識,及其資料型別、變數和常量的宣告。同時思考了遊標與變數的區別。只要掌握的基本的語法,資料庫操作大致相同。