PL/SQL 結構與實例

 
    PL/SQL程序由三個塊組成:聲明部分、執行部分、異常處理部分。 PL/SQL有下列程序單元:過程,函數,包說明,包體  存儲過程是做爲對象存在於oracle數據庫的程序單元。oracle實現存儲過程做爲過程、函數和包。  PL/SQL 不能調用包,能夠調用包中可見部分的過程和函數。包是封裝同子程序同樣持久數據的程序單元。 
參數模式有:IN OUTIN OUT
 
PL/SQL的結構以下:
DECLARATIVE 
 ----聲明部分:在此聲明PL/SQL中使用到的變量、類型、及遊標,以及局部變量中的存儲過程和函數
BEGIN
 ----執行部分:過程及SQL語句,及程序的主要部分
EXCPTION
 ----執行異常部分:錯誤處理
END;
其中,執行部分不能省略;
 
Eg1    過程:
  CREATE OR REPLACE PROCEDURE print_temp 
IS 
    v_average NUMBER; 
    v_sum     NUMBER; 
BEGIN 
    SELECT AVG(n), SUM(n) INTO v_average, v_sum 
    FROM TEMP; 
    dbms_output.put_line('Average:'||v_average); 
    dbms_output.put_line('Sum:'||v_sum); 
END print_temp; 
sqlplus調用過程: 
SQL>execute insert_temp; 
SQL>execute insert_temp(); 
都是正確的。 
Eg2  函數:
CREATE OR REPLACE FUNCTION tomorrow RETURN DATE 
IS 
    next_day DATE; 
BEGIN 
    next_day := SYSDATE + 1; 
    RETURN next_day;       //函數都有返回值,沒有function必須有return
END tomorrow; 
Eg3 
CREATE OR REPLACE PACKAGE students_pkg IS 
PROCEDURE add_student 
    (v_student_name   IN students.student_name%TYPE, 
     v_college_major IN students.college_major%TYPE, 
     v_status         IN students.status%TYPE, 
     v_state          IN students.state%TYPE DEFAULT NULL, 
     v_license_no     IN students.license_no%TYPE DEFAULT NULL); 
FUNCTION NO_OF_STUDENTS 
    (v_major IN major_lookup.major_desc%TYPE DEFAULT NULL, 
     v_status IN students.status%TYPE DEFAULT NULL) 
RETURN NUMBER; 
END students_pkg; 
Eg4 包主體(上面包的實例)
CREATE OR REPLACE PACKAGE BODY students_pkg IS 
PROCEDURE add_student 
    (v_student_name   IN students.student_name%TYPE, 
     v_college_major IN students.college_major%TYPE, 
     v_status         IN students.status%TYPE, 
     v_state          IN students.state%TYPE DEFAULT NULL, 
     v_license_no     IN students.license_no%TYPE DEFAULT NULL) 
IS 
BEGIN 
      INSERT INTO students VALUES 
        ('A'||students_pk_seq.NEXTVAL, 
          v_student_name, 
          v_college_major, 
          v_status, 
          v_state, 
          v_license_no); 
END add_student; 
FUNCTION NO_OF_STUDENTS 
    (v_major IN major_lookup.major_desc%TYPE DEFAULT NULL, 
     v_status IN students.status%TYPE DEFAULT NULL) 
RETURN NUMBER 
IS 
    ccount INTEGER; 
BEGIN 
      SELECT COUNT (*) INTO ccount 
      FROM   students, major_lookup 
      WHERE students.college_major = major_lookup.major 
      AND    major_lookup.major_desc = 
                   nvl(v_major,major_lookup.major_desc) 
      AND   students.status = nvl(v_status,students.status); 
    RETURN ccount; 
END NO_OF_STUDENTS; 
END students_pkg; 
使用下面方式調用: 
temp_operations.insert_temp; 
temp_operations.insert_temp(); 
附:PL/SQL模式
PL/SQL程序有3種模式:IN (default),IN OUT,OUT 
(1)IN 模式參數是一個常量 
IN模式參數是一個常量必須被看做常量。下面的過程將不能編譯成功覺得第3行是一個IN模式變量 
PROCEDURE print_next_value(v_data IN INTEGER) IS 
BEGIN 
      v_data := v_data+1; -- compile error 
      dbms_output.put_line(v_data); 
END; 
常量能夠用在表達式中,下面的用法是正確的: 
PROCEDURE print_next_value(v_data IN INTEGER) IS 
BEGIN 
     dbms_output.put_line(v_data+1); 
END; 
(2)IN OUT模式 
IN OUT模式的變量既能夠在賦值語句的左邊,也能夠在賦值語句的右邊。 
PROCEDURE change_data(v_data IN OUT INTEGER) IS 
BEGIN 
      for i in 1..10 loop 
          v_data := v_data + 1; 
      end loop; 
END; 
(3)OUT模式 
在下例中,第4行以前,v_data變量是一個null,在使用OUT模式變量前必須先給他賦一個值: 
PROCEDURE provide_data(v_data OUT INTEGER) 
IS 
BEGIN 
      v_data := 100; 
      FOR i IN 1..10 LOOP 
          v_data := v_data +1; 
      END LOOP; 
END; 
(4)、參數默認值 
過程或函數說明能夠爲ININ OUT參數定義一個初始默認值。下面兩種方法都是正確的
PROCEDURE name 
    (argument mode datatype := a_default_value); 
PROCEDURE name 
    (argument mode datatype DEFAULT a_default_value); 
下面函數定義了以默認半徑爲1返回圓的面積: 
FUNCTION circle 
    (radius IN NUMBER := 1) RETURN NUMBER IS 
BEGIN 
    RETURN 3.14 * radius**2; 
END; 

FUNCTION circle 
    (radius IN NUMBER DEFAULT 1) RETURN NUMBER IS 
BEGIN 
    RETURN 3.14 * radius**2; 
END; 
(5)%TYPE 
%TYPE 的意思是變量聲明類型和數據庫表的指定字段類型一致。 
variable_name table_name.column_name%TYPE; 
相關文章
相關標籤/搜索