




已閱讀5頁,還剩18頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Oracle數據庫應用 理論課 子程序和程序包 本章 技能 目標 創建和使用子程序 創建和使用程序包 1. 子程序 子程序是 命名的 PL/SQL 塊,編譯并存儲在數據庫中。 可以為它們指定參數,可以從任何 數據庫客戶端和應用程序中調用它們。命名的 PL/SQL 程序包包括存儲過程和函數。程序包是存儲過程和函數的集合。 與未命名或匿名 PL/SQL 塊一樣,子程序也有聲明部分,執行部分和一個可選的異常處理部分。聲明部分包含類型、游標、常量、變量、異常和嵌套子程序的聲明。這些內容都是本 地的,在程序退出時會自動銷毀。執行部分包含賦值語句、流程控制語句和 Oracle 的數據操作語句。異常處理部分包含異常處理 處理。 子程序的各個部分: 聲明部分 可執行部分 異常處理部分 (可選 ) 子程序的分類: 過程 執行某些操作 函數 執行操作并返回值 子程序的優點 如下 : 模塊化 : 通過子程序,可以將程序分解為可管理的,明確的 邏輯模塊 可重用性 :子程序在創建并執行后,就可以在 任意數目的程序 中 調用 可維護性 :子程序可以 簡化維護操作 ,因為如果一個子程序受到影響,則只需要修改該子程序的定義。 安全性 : 通過設置權 限,使數據 訪問的唯一方式就是通過用戶提供的過程和函數,這不僅可以讓數據更加安全,而且還可以保證它的正確性。 1.1 過程 第 7章 子程序和程序包 - 2 - 2 過程是 執行某些操作的子程序, 它是執行 特定任務的 模塊。 從根本上講,過程就是命名的PL/SQL 塊,它可以被賦予參數,存儲在數據庫中,然后由一個應用程序或其它 PL/SQL 程序調用。 創建過程: 用于 創建過程的語法 如下 : CREATE OR REPLACE PROCEDURE () IS|AS BEGIN EXCEPTION END ; 其中: procedure_ name 是過程的名稱, parameter_ list 是參數列表, local_variable_declaration 是局部聲明。 executable_ statements 是可執行語句, exception_ handlers 是異常處理程 序。 創建過程的語法的大部分都與 PL/SQL 塊相似。聲明部分置于關鍵字 IS 與 BEGIN 之間。 存儲過程中的聲明不使用 DECLARE關鍵字 .過程最后的 END關鍵字后可以使用可選的 .其它部分與匿名 Pl/SQL 塊完全相同。 例 1 演示如何創建過程。 例 1: CREATE OR REPLACE PROCEDURE find_emp(emp_no NUMBER) AS empname VARCHAR2(20); BEGIN SELECT ename INTO empname FROM EMP WHERE empno = emp_no; DBMS_OUTPUT.PUT_LINE(雇員姓名是 | empname); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (雇員編號未找到 ); END find_emp; / 該例創建了 find_emp 過程。該過程接受一個雇員編號參數 emp_no,然后 SELECT 語句從 EMP表中選擇 empno 為 emp_no 的雇員記錄,并顯示雇員。如果在表中未找到此雇 員編號。 該過程顯示 NO_DATA_FOUND 異常,并顯示消息“ 雇員編號未找到 ”。 例 1-1: CREATE OR REPLACE PROCEDURE getDeptCount AS deptCount int; BEGIN SELECT COUNT(*) INTO deptCount FROM dept; DBMS_OUTPUT.PUT_LINE(dept 表共有 |deptCount|行記錄 ); END getDeptCount; 第 7章 子程序和程序包 - 3 - 3 創建不帶參數的存儲過程,該過程返回 dept 表行數 。 當我們創建的存儲過程沒有參數時,在存儲過程名字后面不能有括號 。 執行過程 在 SQL 提示符下,使用 EXECUTE 語句來執行過程。 執行過程的語法 如下 : EXECUTE procedure_name(parameters_list); 其中: procedure_ name 是過程的名稱, parameter_ list 是參數列表。 要執行 find_emp 過程,請輸入以下命令。 SETSERVEROUTPUT ON EXECUTE find_emp (7900); 還 使用以下代碼可以執行存儲過程: BEGIN getDeptCount; END; 還可以通過以下代碼來簡化調用: EXEC getDeptCount; CALL getDeptCount(); 注意: 并不是所有的存儲過程都可以用這種方式來調用 定義無參存儲過程時,存儲過程名后不能加 () 在塊中或是通過 EXEC 調用存儲過程時可以省略 () 通過 CALL 調用無參存儲過程必須加上 () 過程參數模式: 過程參數的三種模式: IN ,OUT,IN OUT 。 定義過程參數的語法如下: parameter_name IN | OUT | IN OUT datatype := | DEFAULT expression IN 用于接受調用程序的值 默認的參數模式 OUT 用于向調用程序返回值 IN OUT 用于接受調用程序的值,并向調用程序返回更新的值 在返回到調用環境之前,必須先給 OUT 或 IN OUT 參數賦值。 可以在參數列表中為 IN 參數賦予一個默認值,不能為 OUT, IN OUT 參數賦予默認值。 創建帶有 IN 參數的存儲過程 。 例 2: CREATE OR REPLACE PROCEDURE itemdesc(item_code IN VARCHAR2) IS v_itemdesc VARCHAR2(5); 第 7章 子程序和程序包 - 4 - 4 BEGIN SELECT itemdesc INTO v_itemdesc FROM itemfile WHERE itemcode = item_code; DBMS_OUTPUT.PUT_LINE(item_code|項目的說明為 |v_itemdesc); END; / 要執行 itemdesc 過程,請輸入以下查詢。 EXECUTE itemdesc (i201); / 例 2-1: CREATE OR REPLACE PROCEDURE getSalaryByEmpNo0(eNo NUMBER) -參數的數據類型不能指定長度 AS salary emp.sal%TYPE; BEGIN SELECT SAL INTO salary FROM EMP WHERE EMPNO=eNo; DBMS_OUTPUT.PUT_LINE(eNo|號員工的工資為 |salary); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE(沒有找到該編號的員工 ); END; 當定義的存儲過程含有參數時,參數的數據類型不能指定長度。參數還有輸入和輸出之分,本例中沒有指定,默認情況為輸入參數,也可顯示的指定某個參數是輸入參數,如 (eNo IN NUMBER)。 BEGIN getSalaryByEmpNo0(7788); END; / EXEC getSalaryByEmpNo0(7788); / CALL getSalaryByEmpNo0(7788); 但是如果傳給一個存儲過程的參數是變量時,必須 使用 BEGIN END 塊,如下: DECLARE no emp.empNo%TYPE; BEGIN no:=7788; getSalaryByEmpNo(no); END; 如果某個包中含有常量,也可以通過如下的方式調用: EXEC getSalaryByEmpNo(ConstantPackage.no); 但這種方式不能再使用 CALL 調用。 創建帶有 OUT 參數的存儲過程 。 例 3: CREATE OR REPLACE PROCEDURE test(value1 IN VARCHAR2,value2 OUT NUMBER) IS identity NUMBER; 第 7章 子程序和程序包 - 5 - 5 BEGIN SELECT ITEMRATE INTO identity FROM itemFile WHERE itemcode = value1; IF identity 7788); -使用默認值 EXEC addEmp(mgr=7788,empNo=7779,eName=sunliu); -更改參數順序 將過程的執行權限授予其他用戶: 過程創建之后,只有創建該過程的用戶才有權調用它。其它用戶如果要調用該過程,需要得到過程的 EXECUTE 權限。 例 6 演示如 何將執行過程的權限授予其它用戶。 例 6: SQL GRANT EXECUTE ON find_emp TO MARTIN; SQL GRANT EXECUTE ON swap TO PUBLIC; 維護過程 1、刪除存儲過程 DROP PROCEDURE Proc_Name; 2、查看過程狀態 SELECT object_name,status FROM USER_OBJECTS WHERE object_type=PROCEDURE; 3、重新編譯過程 ALTER PROCEDURE Proc_Name COMPILE; 4、查看過程代碼 SELECT * FROM USER_SOURCE WHERE TYPE=PROCEDURE; 1.2 函數 函數與過程相似,也是數據庫中已命名 PL/SQL 程序塊。函數的主要特性是它必須返回一個值。創建函數時通過 RETURN 子句指定函數返回值的數據類型。 在函數體的任何地方用戶都可以通過 RETURN expression 語句從函數返回,這里的表達式的數據類型要與 RETURN 子句指定的類型相同。 與過程類似,函數 將代碼分割成模塊,有助于組織代碼。 定義函數 用于定義函數的語法如下: CREATE OR REPLACE FUNCTION (param1,param2) RETURN IS|AS local declarations BEGIN 第 7章 子程序和程序包 - 8 - 8 Executable Statements; RETURN result; EXCEPTION Exception handlers; END; 創建函數 例 7 演示如何創建 函數 。 例 7: CREATE OR REPLACE FUNCTION fun_hello RETURN VARCHAR2 IS BEGIN RETURN 朋友,您好!今天是 | TO_CHAR(SYSDATE, DAY); END; / 上例創建了一個簡單函數 fun_hello。 與過程不同,函數不能單獨執行,只能通過 SQL 語句或 PL/SQL 程序塊來調用。 訪問函數的兩種方式: 使用 PL/SQL 塊 使用 SQL 語句 要調用此函數,請輸入以下語句。 SELECT fun_hello FROM DUAL; 上述語句將返回消息“朋友,您好” 。 例 8 演示一個有業務功能的函數 。 例 8: CREATE OR REPLACE FUNCTION item_price_range (price NUMBER) RETURN VARCHAR2 AS min_price NUMBER; max_price NUMBER; BEGIN SELECT MAX(ITEMRATE), MIN(ITEMRATE) INTO max_price, min_price FROM itemfile; IF price = min_price AND price job); DBMS_OUTPUT.PUT_LINE(job); END; 創建帶有輸入輸出參數的函數 例 13: CREATE OR REPLACE FUNCTION getHiredateAndJobByEmpName(nb IN OUT VARCHAR2) RETURN DATE AS hireDate DATE; BEGIN SELECT hiredate,job INTO hireDate,nb FROM EMP WHERE eName=nb; RETURN hireDate; END; 當函數中有輸出參數時,不能直接通過 SELECT 語句查看,必須在 BEGIN END 塊中調用,如下: DECLARE n emp.eName%TYPE:=SCOTT; BEGIN DBMS_OUTPUT.PUT_LINE(getHiredateAndJobByEmpName(n); DBMS_OUTPUT.PUT_LINE(n); END; 第 7章 子程序和程序包 - 11 - 11 將 函數 的執行權限授予其他用戶: 與過程相同,用戶要調用其它用戶的函數也需要得到授權,權限的名稱也是 EXECUTE。 SQL GRANT EXECUTE ON fun_hello TO MARTIN; 維護函數 1、刪除函數 DROP FUNCTION Fun_Name; 2、查看函數狀態 SELECT object_name,status FROM USER_OBJECTS WHERE object_type=FUNCTION; 3、重新編譯函數 ALTER FUNCTION Fun_Name COMPILE; 4、查看函數代碼 SELECT * FROM USER_SOURCE WHERE TYPE=FUNCTION; 使用函數的限制: 從 SQL 表達式調用函數有以下限制: 從 SELECT 語句調用的任何函數均不能修改數據庫表。 當遠程執行或并行執行時,函數不得讀取或寫入程序包中的變量。 從 SELECT, VALUES 或 SET 子句調用的函數可以寫入程序包變量,所有其他子句中的函數均不能寫入程序包變量。 如果函數調用執行 UPDATE 的存儲過程,則該函數不能在 SQL 語句中使用。 1.3 過程和函數的比較 過程和函數的比較 過 程 函 數 作為 PL/SQL 語句執行 作為表達式的一部分調用 在規格說明中不包含 RETURN 子句 必須在規格說明中包含 RETURN 子句 不返回任何值 必須返回單個值 可以包含 RETURN 語句,但是與函數不同,它不能用于返回值 必須包含至少一條 RETURN 語句 1.4 自治 事務處理 自治事務允許你離開調用的事務上下文,執行一個獨立的事務,然后返回調用的事務而不 會影響到調用事務的狀態。自治事務和調用事務不同,只有提交的事務才會在事務見共享。 以下的 PL/SQL 代碼塊可以定義為自治事務。 第 7章 子程序和程序包 - 12 - 12 存儲過程和函數 定義在聲明塊里的本地存儲過程和函數 打包的存儲過程和函數 類型方法 頂層的匿名塊 最簡單的理解自治事務的方法是查看他們的行為。我們創建一個測試表格,然后放入 2 行數據,注意數據沒有提交。 CREATE TABLE at_test ( id NUMBER NOT NULL, description VARCHAR2(50) NOT NULL ); INSERT INTO at_test (id, description) VALUES (1, Description for 1); INSERT INTO at_test (id, description) VALUES (2, Description for 2); SELECT * FROM at_test; ID DESCRIPTION - - 1 Description for 1 2 Description for 2 2 rows selected. 下一步,我們使用匿名的自治事務塊插入另外 8 行數據,同時提交。 DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN FOR i IN 3 . 10 LOOP INSERT INTO at_test (id, description) VALUES (i, Description for | i); END LOOP; COMMIT; END; / PL/SQL procedure successfully completed. SELECT * FROM at_test; ID DESCRIPTION - - 1 Description for 1 2 Description for 2 3 Description for 3 4 Description for 4 5 Description for 5 6 Description for 6 7 Description for 7 8 Description for 8 第 7章 子程序和程序包 - 13 - 13 9 Description for 9 10 Description for 10 10 rows selected. 和預想的一樣,我們得到了 10 行數據。如果我們執行一個回滾 (rollback)語句,我們得到了如下的結果 ROLLBACK; SELECT * FROM at_test; ID DESCRIPTION - - 3 Description for 3 4 Description for 4 5 Description for 5 6 Description for 6 7 Description for 7 8 Description for 8 9 Description for 9 10 Description for 10 8 rows selected. 被我們當前事務插入的 2 行數據被回滾了,而被自治事務插入的數據繼續存在。編譯描述符 PRAGMA AUTONOMOUS_TRANSACTION 使得自治塊在自己的事務里運行,所以內部的提交語句不會影響調用方的事務 自治事務一般用于日常的錯誤日志,錯誤信息必須保留,無論事務是提交還是回滾。例如下面的表保存了基本的錯誤信息。 CREATE TABLE error_logs ( id NUMBER(10) NOT NULL, log_timestamp TIMESTAMP NOT NULL, error_message VARCHAR2(4000), CONSTRAINT error_logs_pk PRIMARY KEY (id) ); CREATE SEQUENCE error_logs_seq; 我們定義了一個自治事務的存儲過程來記錄錯誤信息 CREATE OR REPLACE PROCEDURE log_errors (p_error_message IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO error_logs (id, log_timestamp, error_message) VALUES (error_logs_seq.NEXTVAL, SYSTIMESTAMP, p_error_message); COMMIT; END; / 下面的代碼強制產生一個錯誤 ,被捕獲且記錄到日志 。 BEGIN 第 7章 子程序和程序包 - 14 - 14 INSERT INTO at_test (id, description) VALUES (998, Description for 998); - Force invalid insert. INSERT INTO at_test (id, description) VALUES (999, NULL); EXCEPTION WHEN OTHERS THEN log_errors (p_error_message = SQLERRM); ROLLBACK; END; / PL/SQL procedure successfully completed. SELECT * FROM at_test WHERE id = 998; no rows selected SELECT * FROM error_logs; ID LOG_TIMESTAMP - - ERROR_MESSAGE - 1 28-FEB-2006 11:10:10.107625 ORA-01400: cannot insert NULL into (TIM_HALL.AT_TEST.DESCRIPTION) 1 row selected. 由此可知, LOG_ERRORS 事務被分割為自治塊。如果不是,我們可以期待在自治塊插入的第一個數據被 LOG_ERRORS 存儲過程的提交語句后保留。 小心你使用自治存儲過程的方式。如果你胡亂使用,可能會引起死鎖,同時在分析跟蹤事務時引起沖突 。 自治 事務處理的特征: 與主事務處理的狀態無關 提交或回滾操作不影響主事務處理 自治事務處 理的結果對其他事務是可見的 能夠啟動其他自主事務處理 2. 程序包 程序包是 一種數據庫對象,它是 對相關過程、函數、變量、游標和異常等對象的封裝 。 程序包由 程序包 規范和 程序包 主體兩部分組成 。在程序包規范中,可以聲明類型,變量,常量,異常,游標和子程序。 程序包主體用于實現在程序包規范中定義的游標,子程序。 第 7章 子程序和程序包 - 15 - 15 程序包的組成部分如下圖所示: 2.1 程序包規范 程序包規范包含一些應用程序可見的公共對象和類型,是與應用程序的接口。規范包含應用程序所需的程序包資源。如果程序包規范只聲明類型,常量,變量和異常,則不需要有程序包 主體,因為使用類型,常量,變量和異常所需的所有信息均已在規范中指定。只有子程序和游標才具有底層實現或定義,因此他們必須有程序包主體。 創建包規范的語法 如下 : CREATE OR REPLACE PACKAGE package_name IS|AS Public type and item declarations Subprogram specifications END package_name; 其中: package_name 是包的名稱。 Public type and item declarations 是聲明類型、常量、變量、異常和游標等。 Subprogram specifications 聲明 PL/SQL 子程序。 在程序包規范中聲明的項也可以在程序包之外使用, 這樣的項稱為“公用對象” 例 14 演示如何創建程序包規范 例 14: CREATE OR REPLACE PACKAGE pack_me IS PROCEDURE order_proc (orno VARCHAR2); FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2; END pack_me; / 該例中創建了 pack_me 包,在此程序包中,聲明了子程序 order_proc 和 order_fun,這些子程序的實現定義在程序包主體中給出。 2.2 程序包主體 第 7章 子程序和程序包 - 16 - 16 程序包主體包含在程序包規范中聲明的每個游標和子程序的具體實現。私有聲明也可以包含在程序包主體中。 程序包主體的初始化部分是可選的,它可以用于初始化程序包中的變量。程序包的初始化部分既不能調用程序包,也不能將參數傳遞給程序包。 而且,程序包的初始化部分僅運行一次。 以下是創建程序包主體的語法: CREATE OR REPLACE PACKAGE BODY package_name IS|AS Public type and item declarations Subprogram bodies BEGIN Initialization_statements END package_name; 其中: package_name 是包的名稱。 Public type and item declarations 聲明變量,常量,游標,異常或類型 。 Subprogram bodies 定義公共和私有 PL/SQL 子程序。 例 15 演示如何創建 pack_me 包的主體。 例 15: CREATE OR REPLACE PACKAGE BODY pack_me AS PROCEDURE order_proc (orno VARCHAR2) IS stat CHAR(1); BEGIN SELECT ostatus INTO stat FROM order_master WHERE orderno = orno; IF stat = p THEN DBMS_OUTPUT.PUT_LINE(暫掛的訂單 ); ELSE DBMS_OUTPUT.PUT_LINE(已完成的訂單 ); END IF; END order_proc; FUNCTION order_fun(ornos VARCHAR2) RETURN VARCHAR2 IS icode VARCHAR2(5); ocode VARCHAR2(5); qtyord NUMBER; qtydeld NUMBER; BEGIN SELECT qty_ord, qty_deld, itemcode, orderno INTO qtyord, qtydeld, icode, ocode FROM order_detail WHERE orderno = ornos; IF qtyord qtydeld THEN RETURN ocode; ELSE RETURN icode; END IF; END order_fun; END pack_me; 第 7章 子程序和程序包 - 17 - 17 / 提示 : 如果創建包規范或主體時出現編譯錯誤,請輸入 SHOW ERRORS 命令查看詳細的錯誤報告。 要引用在程序包規范中聲明的類型,對象和子程序,請使用以下語法: package_name.type_name; package_name.object_name; package_name.subprogram_name; 也可以從數據庫觸發器,匿名的 PL/SQL 塊,存儲子程序和 Oracle 工具中( SQL*Plus)引用程序報內容。存儲子程序可以調用程序包的子程序。 要執行 packe_me 包中的 order_proc 過程,請輸入以下命令。 EXECUTE pack_me.order_proc(o002); 上述語句的輸出結果如下所示: 為了執行在程序包中定義的函數,可以使用如下代碼快: DECLARE msg VARCHAR2(10); BEGIN msg := pack_me.order_fun(o002); DBMS_OUTPUT.PUT_LINE(值是 | msg); END; / 2.3 程序包的優點: 程序包將相關的功能在邏輯上組織在一起,包 比 單獨 的 過程具有更大的優 勢。包 的 優點包括: 模塊化 使用程序包,可以封裝相關的類型,對象和子程序,每個程序包均將幫助我們以更好 的方式理解應用程序中涉及的概念。 更輕松的應用程序設計 要設計應用程序,必須首先在程序包規范中指定對象,類型或子程序。編譯完規格說明之后,可以編譯引用程序包的存儲 子程序。因此,在準備 好應用程序的規格說明之前,不需要完整定義程序包主體。也就是說,可以在沒有主體的情況下編寫程序包規范的代碼并進行編譯。 信息隱藏 前面我們介紹了私有對象和公有對象。這些對象還可以用于保護程序包的完整性。假如一個程序包包含 4 個子程序 ( 3 個公有子程序和 1 個私有子程序),程序 包 隱藏私有 子 程序的定義,所以在其定義改變時,只有該程序包(而不是應用程序)受到影響。這樣,實現的細節對其它用戶不可見,因此保護了程序包的完整性。 新增功能 允許用戶在同一個包中創建多個同名的過程,過程參數的數量或數據類型可以不同。允許創建可在包 的 所有過程和函數中使用的全局變量和游標。 第 7章 子程序和程序包 - 18 - 18 性能更佳 首次調用打包 的 子程序時,整個程序包均加載到內存中,因此,后續調用不需要磁盤 I/O。此外,如果更改已打包函數的定義,則 Oracle 不需要重新編譯調用子程序 ,因為它們不依賴于子程 序的主體。 2.4 私有項與公有項 可以從其它程序和 PL/SQL 塊引用包 的 公有元素。這些公有元素在規范中定義。私有元素是在程序包主體中定義的,并不出現在規范中。私有元素不能在程序包之外引用。 程序包中的任何其它元素均可以使用私有元素。 如果必須使私有元素變為公用的,則可以將該項添加到程序包規范中,然后重新編譯該規范,操作完成后,該項在程序包之外將是可見的。 對于程序包元素的引用,請使用點分表示法。先后順序為:程序包名稱,點,元素名稱。同一程序包不需要使用點分表示法。 在上面有關程序包規范和程序包主體的創建的例子 中。在規范的例子中,沒有聲明變量和游標,因此沒有可以由其他程序包引用的公用變量或游標。但是,在程序包主體的例子中,過程order_proc 中定義了一個變量 stat,這個變量被認為是私有變量,此變量只能在過程內訪問。 2.5 程序包中的游標 在程序包中可以定義和使用游標, 游標的定義分為游標規范和游標主體兩部分 。在更改游標主體時,無需改變游標規范。此外, 在包規范中聲明游標規范時必須使用 RETURN 子句指定游標的返回類型 。 RETURN 子句指示從游標獲取并返回的數據元素。實際上,這些數據元素由該游標的 SELECT語句確定。但是, SELECT 語句僅出現在主體中,而不出現在規范中。游標規范必須包含程序使用游標所需的所有信息。因此需要返回數據類型。 RETURN 子句指定的數據類型可以是: 用 %ROWTYPE 屬性引用表定義的記錄類型 程序員定義的記錄類型 例 16 演示如何在程序包中聲明游標和使用游標。 例 16: CREATE OR REPLACE PACKAGE cur_pack IS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE; PROCEDURE ord_pro(vcode VARCHAR2); END cur_pack; / 例 16 在 cur_pack 包中為 order_master 表創建和定義 ord_cur 游標,還創建了 ord_pro 過程。 請輸入以下代碼創建 cur_pack 包的主體 CREATE OR REPLACE PACKAGE BODY cur_pack AS CURSOR ord_cur(vcode VARCHAR2) RETURN order_master%ROWTYPE IS 第 7章 子程序和程序包 - 19 - 19 SELECT * FROM order_master WHERE VENCODE=vcode; PROCEDURE ord_pro(vcode VARCHAR2) IS or_rec order_master%ROWTYPE; BEGIN OPEN ord_cur(vcode); LOOP FETCH ord_cur INTO or_rec; EXIT WHEN ord_cur%NOTFOUND; DBMS_OUTPUT.PUT_LIne(返回的值為 | or_rec.orderno); END LOOP; END ord_pro; END cur_pack; / 要執行 ord_pro 過程,請輸入以下命令 。 EXEC cur_pack.ord_pro(V001); 以上代碼用供應商編號 v001 打開 cur_pack 包中的 ord_pro 過程。 輸出結果如下: 3. 有關子程序和程序包的信息 子程序和程序包是數據庫中存儲的對象, Oracle 會在數據字典中存儲所有對象的信息。通過查詢 USER_OBJECTS 數據字典視圖,可以獲取有關在會話中創建的子程序和程序包的信息。 例 17 的代碼 可以查詢有關過程,函數和程序包的信息。 例 17: COLUMN OBJECT_NAME FORMAT A18 SELECT object_name, object_type FROM USER_OBJECTS WHERE object_type IN (PROCEDURE, FUNCTION, PACKAGE, PACKAGE BODY); 輸出結果如下: OBJECT_NAME OBJECT_TYPE - - FIND_EMP PROCEDURE GETDEPTCOUNT PROCEDURE ITEMDESC PROCEDURE TEST PROCEDURE GETSALARYBYEMPNO PROCEDURE 第 7章 子程序和程序包 - 20 - 20 SWAP PROCEDURE GETSALARYBYEMPNO1 PROCEDURE ADDEMP PROCEDURE FUN_HELLO FUNCTION ITEM_PRICE_RANGE FUNCTION CURRENTTIME FUNCTION GETEMPNAMEBYEMPNO FUNCTION GETEMPNAMEANDJOBBY FUNCTION EMPNO GETSALARYBYEMPNO0 PROCEDURE GETHIREDATEANDJOBB FUNCTION YEMPNAME LOG_ERRORS PROCEDURE PACK_ME PACKAGE PACK_ME PACKAGE BODY CUR_PACK PACKAGE CUR_PACK PACKAGE BODY 通過查詢 USER_SOURCE 數據字典視圖,可以獲取存儲子過程的文本。該視圖的結構如下所示: 例 18: DESC USER_SOURCE 輸出結果如下: Name Type Nullable Default Comments - - - - - NAME VARCHAR2(30) Y Name of the object TYPE VARCHAR2(12) Y Type of the object: CTION, PACKAGE, PACKAGE BODY or JAVA SOURCE LINE NUMBER Y Line number of this line of source TEXT VARCHAR
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 全國電煤采購合同范例
- 單位食堂職工合同范例
- 協議建房合同范例
- 農場流轉合同范例
- 專利技術購買合同范例
- 農業合同范例書籍
- 關于包裝采購合同范例
- 醫院服裝合同范例
- 印刷訂貨合同范例
- 廠房木工合同范例
- 《博弈論》最完整版課件(加專題研究)
- 關渡小學2020校本研修領導小組及相關制度
- 納布啡在胃腸鏡麻醉中的臨床觀察-課件
- 常用手術器械手工清洗
- 三次函數的圖像和性質用
- 紙板線設備基礎知識培訓53
- 2022年四川省成都市郫都區嘉祥外國語學校八年級下學期期末語文試卷
- 卓越領導力訓練
- 注塑成型試題-及答案
- 眾智smartgenHAT600系列雙電源自動切換控制器說明書
- 湖南省惡性腫瘤門診放化療定點醫療機構申請表
評論
0/150
提交評論