程序包是什么

程序包是什么,第1张

程序包表示嵌入或链接信息的图标。此信息可以包含整个文件(如位图文件)或部分文件(如电子表格中的某个单元)。当选择此数据包时,用于创建对象的应用程序将播放对象(如声音文件)或者打开并显示对象。如果更改原始信息,链接的信息将自动更新。但必须手动更新嵌入信息。

可以利用包(package)将过程函数安排在逻辑分组中。包含有两个分离的部件;包说明(规范、包头)和包体(主体)。包说明和包体都存储在数据字典中。包与过程和函数的一个明显的区别时,包仅能存储在非本地的数据库中。除了允许相关的对象结合为组之外,包与依赖性较强的存储子程序相比其所收的限制较少。除此之外,包的效率比较高。

从本质上讲,包是一个命名的声明部分。任何可以出现在块声明中的语句都可以在包中使用,这些语句包括过程、函数、游标、类型和变量。把上述内容放入包中的好处是,用户可以从其他PL/SQL块中对其进行引用,包为PL/SQL语言提供了全程变量。

可以利用包(package)将过程和函数安排在逻辑分组中。包含有两个分离的部件;包说明(规范、包头)和包体(主体)。包说明和包体都存储在数据字典中。包与过程和函数的一个明显的区别是,包仅能存储在非本地的数据库中。除了允许相关的对象结合为组之外,包与依赖性较强的存储子程序相比其所受的限制较少。除此之外,包的效率比较高。

从本质上讲,包是一个命名的声明部分。任何可以显示在块声明中的语句都可以在包中使用,这些语句包括过程、函数、游标、类型和变量。把上述内容放入包中的好处是,用户可以从其他PL/SQL块中对其进行引用,包为PL/SQL语言提供了全程变量。

procedure:过程

function:函数

package:包

一、过程

PL/SQL过程是一个编译到oracle数据库模式的单机程序。过程可以接受参数。当编译一个过程时,CREATE PROCEDURE语句的过程标识符成为数

据字典中的对象名。

CREATE OR REPLACE PPROCEDURE procedure_name (optional parameters) IS | AS

declarative part

BEGIN

program body

EXCEPTION

exception handler

END procedure_name;

Declarative Part 是声明变量的地方,比如:

local_counter NUMBER := 0;

也可以声明复合类型结构,如records和tables

也可以声明异常,但必须在Exception部门进行处理。

Subprogram Body 包含使用PL/SQL控制结构的逻辑算法实现。PL/SQL控制结构支持loops、if-then-else、case、和声明块结构。

Exception handler 可选,类似于其他语言的try-catch模型,你可以对特定错误类型或一般异常编写处理器

应当以动词来命名一个过程。过程常常执行一些 *** 作如更新数据库、写数据到一个文件或者发送一条消息。

一个过程不必要有参数,如果没有参数创建过程是不需要括号。当调用一个过程时(过程没有参数)括号是可选的。

例如:

CREATE OR REPLACE PROCEDURE insert_temp IS

BEGIN

INSERT INTO TEMP (n) VALUES (0);

END insert_temp:

sqlplus调用过程:

SQL>execute insert_temp;

SQL>execute insert_temp();

都是正确的。

IS 或 AS关键字是一样的,都可以用。

PROCEDURE insert_temp IS | AS

END关键字后加过程名也是可选的,但建议加过程名。一个过程可能跨越几屏的长度,当滚屏时,有助于看到END子句知道没有跳到下一个包过

程中。

完整的过程结构如下:

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_outputput_line('Average:'||v_average);

dbms_outputput_line('Sum:'||v_sum);

END print_temp;

二、函数

函数提供了获取对象状态和情形信息的手段,函数有返回值。

CREATE OR REPLACE FUNCTION student_status(optional parameters)

RETURN VARCHAR2 IS

declarative part

BEGIN

program body

RETURN expression;

EXCEPTION

exception handler code

that should include a RETURN

END student_student_status;

参数是可选的,但RETURN语句是必须的。FUNCTION必须有一个return 语句。

下面的例子是返回一个DATE类型的函数:

CREATE OR REPLACE FUNCTION tomorrow RETURN DATE

IS

next_day DATE;

BEGIN

next_day := SYSDATE + 1;

RETURN next_day;

END tomorrow;

函数中的return语句可以是一个表达式,上面函数可以直接返回一个表达式而不用本地变量:

FUNCTION tomorrow RETURN DATE IS

BEGIN

RETURN SYSDATE + 1;

END tomorrow;

函数于过程结果相似,只是函数返回值,而过程不返回值

三、包说明

1、语法和风格

包说明基本语法:

CREATE PACKAGE package_name IS

Type definitions for records, index-by tables,

varrays, nested tables

Constants

Exceptions

Global variable declarations

PROCEDURE procedure_name_1 (parameters & types);

PROCEDURE procedure_name_2 (parameter & types);

FUNCTION function_name_1 (parameters & types) RETURN type;

END package_name;

包说明中过程和函数没有顺序限制。

包主体将包含包说明中每一个子程序的PL/SQL代码。包说明中的每一个子程序包体中必须有相应的子程序体。

在包说明中的数据对象声明是全局的。因此,仅声明需要全局定义的对象。

在包体内的过程语句,包括子程序名、参数名、参数模式、参数类型,必须匹配包说明中的过程语句。同样,函数也是一样。

包主体模板如下:

CREATE PACKAGE BODY package_name IS

PROCEDURE procedure_name_1 (parameters & types)

IS

local variables

BEGIN

body of code

END procedure_name_1;

PROCEDURE procedure_name_2 (parameter & types)

IS

local variables

BEGIN

body_of_code

END procedure_name_2;

FUNCTION function_name_1 (parameters & types) RETURN type

IS

local variables

BEGIN

body of code

RETURN statement;

END function_name_1;

END package_name;

2、示例:

CREATE OR REPLACE PACKAGE students_pkg IS

PROCEDURE add_student

(v_student_name IN studentsstudent_name%TYPE,

v_college_major IN studentscollege_major%TYPE,

v_status IN studentsstatus%TYPE,

v_state IN studentsstate%TYPE DEFAULT NULL,

v_license_no IN studentslicense_no%TYPE DEFAULT NULL);

FUNCTION NO_OF_STUDENTS

(v_major IN major_lookupmajor_desc%TYPE DEFAULT NULL,

v_status IN studentsstatus%TYPE DEFAULT NULL)

RETURN NUMBER;

END students_pkg;

四、包主体

下面是上例的包主体实现:

CREATE OR REPLACE PACKAGE BODY students_pkg IS

PROCEDURE add_student

(v_student_name IN studentsstudent_name%TYPE,

v_college_major IN studentscollege_major%TYPE,

v_status IN studentsstatus%TYPE,

v_state IN studentsstate%TYPE DEFAULT NULL,

v_license_no IN studentslicense_no%TYPE DEFAULT NULL)

IS

BEGIN

INSERT INTO students VALUES

('A'||students_pk_seqNEXTVAL,

v_student_name,

v_college_major,

v_status,

v_state,

v_license_no);

END add_student;

FUNCTION NO_OF_STUDENTS

(v_major IN major_lookupmajor_desc%TYPE DEFAULT NULL,

v_status IN studentsstatus%TYPE DEFAULT NULL)

RETURN NUMBER

IS

ccount INTEGER;

BEGIN

SELECT COUNT () INTO ccount

FROM students, major_lookup

WHERE studentscollege_major = major_lookupmajor

AND major_lookupmajor_desc =

nvl(v_major,major_lookupmajor_desc)

AND studentsstatus = nvl(v_status,studentsstatus);

RETURN ccount;

END NO_OF_STUDENTS;

END students_pkg;

开发包主体可能需要其他本地过程和函数,这些是隐藏的,叫私有(过程或函数)。

常常情况下要把一个单独的过程放入一个新包或一个已存在包里面。

PACKAGE temp_operations IS

PROCEDURE insert_temp;

END temp_operations;

PACKAGE BODY temp_operations IS

PROCEDURE insert_temp IS

BEGIN

INSERT INTO temp (n) VALUES (0);

END insert_temp;

END temp_operations;

使用下面方式调用:

temp_operationsinsert_temp;

temp_operationsinsert_temp();

>

以上就是关于程序包是什么全部的内容,包括:程序包是什么、程序开发中的包指的是什么意思呢、存储过程中的 procedure、function和 package是干什么的,需要详细介绍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10097386.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存