PL/SQL程序由三個塊組成:聲明部分、執行部分、異常處理部分。
PL/SQL有下列程序單元:過程,函數,包說明,包體
。
存儲過程是做爲對象存在於oracle數據庫的程序單元。oracle實現存儲過程做爲過程、函數和包。
PL/SQL
不能調用包,能夠調用包中可見部分的過程和函數。包是封裝同子程序同樣持久數據的程序單元。
參數模式有:IN 、OUT、IN 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)、參數默認值
過程或函數說明能夠爲IN或IN 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;