包是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 STATEMENT创建包主体。
包主体的语法是-
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.
以下是程序包的用途:
包对象可以由所有正在运行的子程序共享。它们将保留整个会话,并允许访问数据而无需将数据存储在数据库中。
软件包是模块化的主要示例。它们将所有类型的对象(如过程,函数,变量,语句)存储到一个整齐的包中。这使信息易于理解和易于阅读。
软件包分为软件包规格和定义。这意味着包的类型声明可以随意进行,并且可以在需要时在定义中编写代码。
子程序第一次需要该程序包时,它将完全加载到内存中。对于下一次,该软件包已经可用于其他子程序。
包规范中提供了对象声明的详细信息,而包定义中隐藏了实现细节,这使包更易于处理和使用。