Oracle 中的包概述
包是 SQL 过程、函数、变量、语句等组合成一个单元。许多不同的应用程序可以共享包的内容,因为它存储在数据库中。
包的组成部分
以下是 Oracle 中包的组成部分:
包规范
包规范包含有关存储在其内部的所有过程、函数、变量、常量等的信息。它包含所有组件的声明,但不包含代码。
规范中的所有对象都称为公共对象。如果任何对象在规范中不可用,但在主体中进行了编码,则称为私有对象。
包规范的语法为:
CREATE [OR REPLACE] PACKAGE name_of_package IS | AS [declaration_of_variable ...] [declaration_of_constant ...] [declaration_of_exception ...] [cursor_specification ...] [PROCEDURE [Schema..] name_of_procedure [ (parameter {IN,OUT,IN OUT} datatype [,parameter]) ] ] [FUNCTION [Schema..] name_of_function [ (parameter {IN,OUT,IN OUT} datatype [,parameter]) ] RETURN return_datatype ] END [name_of_package];
包定义或包主体
包主体包含包规范中声明的所有公共对象的代码以及私有对象的代码。
可以使用 CREATE PACKAGE BODY 语句创建包主体。
包主体的语法为:
CREATE [OR REPLACE] PACKAGE BODY name_of_package IS | AS [declaration_of_private_variable ...] [declaration_of_private_constant ...] BEGIN [initialization_statement] [PROCEDURE [Schema..] name_of_procedure [ (parameter [,parameter]) ] IS | AS declaration_of_variables; declaration_of_constants; BEGIN statement(s); EXCEPTION WHEN ... END ] [FUNCTION [Schema..] name_of_function [ (parameter [,parameter]) ] RETURN return_datatype IS | AS declaration_of_variables; declaration_of_constants; BEGIN statement(s); EXCEPTION WHEN ... END ] [EXCEPTION WHEN built-in_exception_name1 THEN User defined statement (action) will be taken; ] END;
示例
让我们首先创建一个名为 STUDENTS 的表:
CREATE TABLE STUDENTS( ID INT NOT NULL, NAME VARCHAR (25) NOT NULL, AGE INT NOT NULL, ADDRESS CHAR (30), FEES DECIMAL (18, 2), PRIMARY KEY (ID) ); Table Created
我们现在将插入值:
INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES) VALUES (1, Tom, 22,'Ohio', 17000 ); INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES) VALUES (2, Jack, 20, 'Washington', 25000 ); INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES) VALUES (3, Amy, 25, 'Boston', 30000 ); INSERT INTO STUDENTS(ID,NAME,AGE,ADDRESS,FEES) VALUES (4, Anne, 18, 'Texas', 27000 );
现在让我们将上述值分配给 PL/SQL 变量
DECLARE s_id students.id%type := 2; s_name students.name%type; s_addr students.address%type; s_fees students.fees%type; BEGIN SELECT name, fees INTO s_name, s_fees FROM students WHERE id = s_id; dbms_output.put_line (‘Student ' ||s_name || ' from ' || s_addr || ' pays ' || s_fees); END; /
现在输出将是
Student Jack from Washington pays 25000 PL/SQL procedure completed successfully
现在让我们创建一个包
CREATE OR REPLACE PACKAGE BODY stu_fees AS PROCEDURE find_fees(s_id students.id%TYPE) IS s_fees students.fees%TYPE; BEGIN SELECT fees INTO s_fees FROM students WHERE id = s_id; dbms_output.put_line('Fees = '|| s_fees); END find_sal; END stu_fees;
执行上述代码后,将显示以下结果
Package body created.
包的用途
以下是包的用途
增加的功能
包对象可以被所有正在运行的子程序共享。它们在整个会话期间保持存在,并允许访问数据,而无需将数据存储在数据库中。
模块化
包是模块化的主要示例。它们将所有类型的对象(如过程、函数、变量、语句)存储在一个整洁的包中。这使得信息易于理解和易于阅读。
更轻松的应用程序设计
包分为包规范和定义。这意味着可以悠闲地完成包的类型声明,并且可以在需要时在定义中编写代码。
更好的性能
任何子程序第一次需要包时,它将完全加载到内存中。对于下一次,该包已可用于其他子程序。
隐藏的实现细节
对象声明的详细信息在包规范中可用,而实现详细信息隐藏在包定义中。这使得包更易于处理和使用。
广告