【文章內(nèi)容簡(jiǎn)介】
er, v3 out char) a1 varchar2(10)。 a2 number(8)。 a3 char(6)。 p(a1, a2, a3)。 —— 形參限制 p (v1 out %type) 子程序 —— 參數(shù)標(biāo)識(shí) 1. 位置標(biāo)識(shí) p(v1, v2, v3) p(a1, a2, a3) 2. 帶名標(biāo)識(shí) p(v1 = a1, v3 = a3, v2 = a3)。 p (v1 in varchar2, v2 in varchar2 v3 in varchar2 default ‘a(chǎn)aaa’) p(a1, a2, a3)。 p(a1, a2)。 子程序 —— 權(quán)限 子程序在其擁有者的權(quán)限下運(yùn)行 2. 依賴對(duì)象的權(quán)限 直接授予擁有者,不能通過(guò)角色授予 3. 原因 a. oracle早期聯(lián)編 子程序 —— 例外返回 子程序返回調(diào)用者或調(diào)用環(huán)境 2. Out 及 in out 型變量值 保留調(diào)用時(shí)的值 子程序 —— 調(diào)用 ?在 SQL*Plus中 execute raise_salary(12,) ?在 PL*SQL中 begin raise_salary(12,); end 。 子程序 —— 相關(guān)數(shù)據(jù)字典 ?USER_OBJECTS 所有對(duì)象,包含子程序 ?USER_SOURCE 存儲(chǔ)過(guò)程,函數(shù),觸發(fā)器,包的源碼 ?USER_ERRORS 編譯過(guò)程中的錯(cuò)誤信息 包( package) ?包是一個(gè)可以將相關(guān)對(duì)象存儲(chǔ)在一起的PL/SQL結(jié)構(gòu)。 ?包提供了 PL/SQL的全局變量 ?包中過(guò)程可重載 ?不同會(huì)話使用包的不同拷貝 包 —— 結(jié)構(gòu)圖 應(yīng)用程序 包 —— 規(guī)范和主體 ?包規(guī)范 /接口 (specification) 變量,常量,過(guò)程,函數(shù),光標(biāo),例外 … 。 為 PL/SQL程序提供了全局對(duì)象。 ?包主體 (body) 過(guò)程,函數(shù)的實(shí)現(xiàn) ?包依賴性 (user_dependencies) 主體依賴接口,接口不依賴主體,減少重編譯 例四 —— 包規(guī)范 CREATE OR REPLACE PACKAGE ClassPackage AS Add a new student into the specified class. PROCEDURE AddStudent( p_StudentID IN %TYPE, p_Department IN %TYPE, p_Course IN %TYPE)。 Removes the specified student from the specified class. PROCEDURE RemoveStudent( p_StudentID IN %TYPE, p_Department IN %TYPE, 包規(guī)范 p_Course IN %TYPE)。 Exception raised by RemoveStudent. e_StudentNotRegistered EXCEPTION。 Table type used to hold student info. TYPE t_StudentIDTable IS TABLE OF %TYPE INDEX BY BINARY_INTEGER。 Returns a PL/SQL table containing the students currently in the specified class. PROCEDURE ClassList( p_Department IN %TYPE, 例四 —— 包規(guī)范 p_Course IN %TYPE, p_IDs OUT t_StudentIDTable, p_NumStudents IN OUT BINARY_INTEGER)。 END ClassPackage。 例四 —— 包體 CREATE OR REPLACE PACKAGE BODY ClassPackage AS Add a new student for the specified class. PROCEDURE AddStudent( p_StudentID IN %TYPE, p_Department IN %TYPE, p_Course IN %TYPE) IS BEGIN INSERT INTO registered_students (student_id, department, course) VALUES (p_StudentID, p_Department, p_Course)。 例四 —— 包體 COMMIT。 END AddStudent。 Removes the specified student from the specified class. PROCEDURE RemoveStudent( p_StudentID IN %TYPE, p_Department IN %TYPE, p_Course IN %TYPE) IS BEGIN DELETE FROM registered_students WHERE student_id = p_StudentID and 例四 —— 包體 department = p_Department AND course = p_Course。 IF SQL%NOTFOUND THEN RAISE e_StudentNotRegistered。 END IF。 COMMIT。 END RemoveStudent。 Returns a PL/SQL table containing the students currently in the specified class. 例四 —— 包體 PROCEDURE ClassList( p_Department IN %TYPE, p_Course IN %TYPE, p_IDs OUT t_StudentIDTable, p_NumStudents IN OUT BINARY_INTEGER) IS v_StudentID %TYPE。 Local cursor to fetch the registered students. CURSOR c_RegisteredStudents IS SELECT student_id FROM registered_students WHERE department = p_Department AND course = p_Course。 例四 —— 包體 BEGIN /* p_NumStudents will be the table index. It will start at 0, and be incremented each time through the fetch loop. At the end of the loop, it will have the number of rows fetched, and therefore the number of rows returned in p_IDs. */ p_NumStudents := 0。 例四 —— 包體 OPEN c_RegisteredStudents。 LOOP FETCH c_R