`

Oracle_PL_ SQL_ 教程:包

 
阅读更多
--######################################--
--包
--王林 2012.07.06
--######################################--

/*
包可以将一些有联系的对象放在其内部。任何能在块定义部分出现的对象都可以在包中出现。这些对象包括存储过程、函数、游标、自定义的类型和变量。可以在其他的块中引用包中的这些对象,因此,包提供了全局变量。一个包由两个独立的部分组成--包头和包体。各部分被单独地存放在数据字典中。定义一个包,要分别定义包头和包体。存储过程或者函数必须在包头中预定义。即在包头中仅定义存储过程或函数以及他们的参数,存储过程或函数的执行代码将在包体中定义。
这不同于无名块中定义存储过程和函数。包体是一个数据字典对象。只有在包头成功编译后,包体才能被编译。包体只包含包头中已预定义的子程序的代码。在包头中定义的对象(不是预定义的)的对象可以直接在包体中使用,不必在包体中定义。如果在包头中有预定义的子程序,则在包体中必须编写其子程序代码,而且包头和包体两部分的子程序必须一致,这包括相同的子程序名、参数和参数类型。与变量类似,包也可以被初始化。只是初始化部分定义在包体的最后部分被定义。
*/

--######################################--
--前向引用
--前向引用占位程序让PL/SQL单遍分析器将过程B的声明放在他的标识符列表中
--JAVA采用的是双遍分析器,所以不用前向声明
DECLARE 
    --如果将过程B的前向引用去掉,程序引发ORA-00313错误
    --因为单遍分析器是自上向下读取的,在分析器读取过程B之前添加B的声明。
    --当分析器读取过程A时,他知道有过程B的声明,然后分析器对过程A的调用验证有效性,以后再在程序中查找B的实现,从而编译成功。
    PROCEDURE b (caller VARCHAR2);
    PROCEDURE a (caller VARCHAR2)
    IS
        procedure_name VARCHAR2 (1) := 'A';
    BEGIN
        DBMS_OUTPUT.put_line( 'Procedure ''a'' called by ['
                            || caller
                            || '].');
        b(procedure_name);
    END;
    PROCEDURE b (caller VARCHAR2)
    IS
        procedure_name VARCHAR2 (1) := 'B';
    BEGIN
        DBMS_OUTPUT.put_line( 'Procedure ''b'' called by ['
                            || caller
                            || '].');
    END;
BEGIN
    a( 'Main' );
END;
--执行结果:
Procedure 'a' called by [Main].
Procedure 'b' called by [A].

--######################################--
--包头 | 包规范原型
--包规范原型列出的所有组件都是可选的,因为没有任何组件也可以创建包
--在包头声明过的是外部可以调用的过程、函数、变量
--包头是必须的,包体是可选的
--包头必须在包体前创建,否则创建不了包体
CREATE [OR REPLACE] PACKAGE package_name [AUTHID] {DEFINER | CURRENT_USER}
IS | AS
    [type_definition;]
    [procedure_specification;]
    [function_specification;]
    [variable_declaration;]
    [exception_declaration;]
    [cursor_delaration;]
    [progma_delaration;]
END package_name;

--######################################--
--包体
--包体是一个独立于包头的数据字典对象,包体只能在包头完成编译后才能编译
--包体内部还可以包括具有包体全局属性的附加声明部分,但这些附加说明对于包体外部是不可见的
CREATE [OR REPLACE] PACKAGE package_name 
AS
    --全局变量定义;
    --函数定义;
    --过程定义;
END package_name; 

--######################################--
--创建包头
CREATE OR REPLACE PACKAGE demo_package
IS
    --包含了一个公用的过程和变量
    g_comm NUMBER := 0.10;
    PROCEDURE reset_comm(p_comm IN NUMBER);
    --注释掉也可以,但是在外部不能调用该函数
    /*FUNCTION validate_comm(p_comm IN NUMBER)
        RETURN BOOLEAN;*/
END;
--创建包体
CREATE OR REPLACE PACKAGE BODY demo_package
IS
    FUNCTION validate_comm(p_comm IN NUMBER)
        RETURN BOOLEAN
    IS
        v_max_comm NUMBER;
    BEGIN
        SELECT MAX(a.empno) 
          INTO v_max_comm
          FROM scott.emp a;
        IF (p_comm > v_max_comm) THEN
            RETURN (FALSE);
        ELSE
            RETURN (TRUE);
        END IF;
    END validate_comm;
    PROCEDURE reset_comm(p_comm IN NUMBER)
    IS
    BEGIN
        IF validate_comm(p_comm) THEN
            g_comm := p_comm;
        ELSE
            raise_application_error(-20210 , 'Expresion is not avilable');
        END IF;
        DBMS_OUTPUT.put_line('This is the globle variable:' || g_comm);
    END reset_comm;
END demo_package;
--SQL Command->编译->执行: 
exec demo_package.reset_comm(0);
--执行结果: 
This is the globle variable:0
--SQL Command->编译->执行:
exec demo_package.reset_comm(999999);
--执行结果: 
begin demo_package.reset_comm(999999); end;
 
ORA-20210: Expresion is not avilable
ORA-06512: at "SYSTEM.DEMO_PACKAGE", line 23
ORA-06512: at line 2

--查看包内的代码
SET pagesize 49999;
COLUMN line format 99999 heading "Line#";
COLUMN text format A73 heading "Text";
SELECT line , text 
  FROM User_Source 
 WHERE UPPER(NAME) = UPPER('&input_name');

--######################################--
--变量
--默认情况下,包是不连续的,当第一个用户调用之后,并不能保证第二个用户调用的仍然是同一个包
--当没有在包规范中声明共享变量或游标时,这个默认情况是很有用的,因为函数和过程是可以重用的。
--当包中含有共享变量时,应总是使包连续可重用
--PRAGMA SERIALLY_REUSABLE (预编译指令)只能在包上下文使用,必须在包规范和主体中都使用它。
--当要共享变量时, PRAGMA SERIALLY_REUSABLE很重要,因为他能保证每次调用他们都处于初始状态。
--E.g:测试共享变量
CREATE OR REPLACE PACKAGE demo_variables
IS
    --把PRAGMA SERIALLY_REUSABLE放在包规范中,将包定义为连续可重用,那么该案例结果永远是3
    --之所以这样,是因为每次对包的调用都会得到一个最新的副本。连续可重用包会重新初始化共享变量的值。
    --常量和连续可重用变量之间的唯一区别是常量的值是永远不能改变,而变量的值是可以改变的
    --当包为连续可重用时,接下来对包的任何调用就不会再改变值
    --包变量应当总是常量
    /*PRAGMA SERIALLY_REUSABLE;*/
    protecte CONSTANT NUMBER := 1;
    unprotecte        NUMBER := 1;
END demo_variables;
--
CREATE OR REPLACE PROCEDURE demo_change(n_value NUMBER)
IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    demo_variables.unprotecte := demo_variables.unprotecte + n_value;
    Dbms_Output.put_line(demo_variables.unprotecte);
END demo_change;
--执行下去依次递增
--SQL Command->编译->执行: 
exec demo_change(2);
--执行结果: 
3

--######################################--
--类型
--%:属性指示器
--%ROWTYPE: 将变量的数据类型锚定到数据库目录对象上或PL/SQL记录结构的行结构上。当锚定到目录对象上时,新变量继承了在引用表或视图中列的位置和数据类型。新变量继承了显式PL/SQL记录结构的位置和数据结构,而该位置和数据类型可能是间接的从一个或多个目录对象继承的。
--%TYPE: 将变量的数据类型锚定到在数据库目录对象(表或视图)中列的数据类型。

 

分享到:
评论

相关推荐

    Oracle_PL-SQL.rar_ORACLE PL_oracle_oracle sql_oracle 教程_pl sql

    这个“Oracle PL-SQL.rar”压缩包提供了针对初学者的Oracle PL/SQL语言教程,包含丰富的源代码示例和详细的解说,旨在帮助学习者快速掌握这一技能。 PL/SQL全称为Procedural Language/Structured Query Language,...

    Oracle_Sql_Pl_Sql_性能优化.doc

    Oracle_Sql_Pl_Sql_性能优化.doc Oracle_Sql_Pl_Oracle_Sql_Pl_Sql_性能优化.docSql_性能优化.doc Oracle_Sql_Pl_Sql_性能优化.doc

    SQL(oracle).rar_oracle_oracle sql_oracle 总结_pl sql_sql

    本资料包"SQL(oracle).rar"显然是针对Oracle数据库系统,特别是其SQL语法和PL/SQL编程的深入学习总结。 首先,Oracle SQL与标准SQL略有不同,它包含了一些特定于Oracle的功能,如子查询、连接操作、游标、函数和...

    Oracle_PLSQL.rar_Java plsql_oracle_oracle doc_pl sql_plsql

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库管理系统的强大功能与结构化查询语言(SQL)的灵活性相结合。在Oracle数据库环境中,PL/SQL被广泛用于开发存储过程、函数、触发器、游标和包,以实现复杂的业务...

    pl sql web design.rar_oracle_pl sql_pl/sql_web sql

    在IT行业中,Oracle数据库系统是企业级数据管理的首选,而PL/SQL是Oracle数据库的内置编程语言,用于实现复杂的数据库操作和业务逻辑。本文将深入探讨如何利用PL/SQL结合Web技术来构建一个功能丰富的网上商店。我们...

    Oracle2BPL-SQL.rar_oracle_pl/sql

    Oracle2BPL-SQL.rar_oracle_pl/sql这个压缩包文件可能包含了关于Oracle PL/SQL的基础教程资料,其中的Oracle2BPL-SQL.pdf可能是详细的讲解文本。 Oracle PL/SQL由三部分组成:Procedural Language(过程语言)、...

    OraclePL-SQL.rar_ORACLE PL_oracle_oracle sql

    Oracle PL/SQL是Oracle数据库系统中的重要组成部分,用于开发存储过程、函数、触发器等数据库对象,以及执行复杂的SQL操作。以下是对Oracle PL/SQL及其相关知识点的详细说明: 1. **Oracle数据库基础**:Oracle...

    oracle_oracle_oraclepl/sql_

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作能力和过程性编程语言的控制结构。在"Oracle PL/SQL"这本书中,作者深入浅出地探讨了这一语言的核心概念和实用技巧,尤其适合法语...

    oracle_commond.rar_odbc api_oracle_oracle 客户端_oracle sql_sql

    本文将基于"oracle_commond.rar_odbc api_oracle_oracle 客户端_oracle sql_sql"这一主题,深入探讨Oracle数据库的相关知识,包括ODBC API、Oracle客户端工具以及SQL在Oracle中的应用。 1. ODBC API(Open Database...

    PLSQL.rar_oracle_pl sql_plsql_plsql java_sql

    标题中的“PLSQL.rar_oracle_pl sql_plsql_plsql_java_sql”暗示了这是一个关于Oracle数据库中PLSQL使用的资源包,可能包含了PLSQL的教程、示例代码和与Java集成的相关信息。Oracle数据库是世界上最广泛使用的数据库...

    Oracle11gPL.SQL系列培训视频【27集】

    教程名称:Oracle 11g PL.SQL系列培训视频【27集】课程目录:【】oracle_PL_SQL编程1【】oracle_PL_SQL编程2【】oracle_PL_SQL编程3【】oracle_PL_SQL编程4【】oracle_PL_SQL编程5【】oracle_PL_SQL编程6【】oracle_...

    Oracle_Database_11g_SQL_-_Master_SQL_and_PLSQL_in_the_Oracle_Database

    这个压缩包文件"Oracle_Database_11g_SQL_-_Master_SQL_and_PLSQL_in_the_Oracle_Database"似乎包含了一本关于掌握Oracle 11g SQL和PL/SQL的教程资料。 SQL(结构化查询语言)是用于管理和操作数据库的标准语言,而...

    PLSQL.zip_oracl_oracle pl/sql ppt_pl sql ppt tutorial_pl/sql_pls

    **PL/SQL:Oracle数据库的编程语言** PL/SQL,全称为Procedural Language/Structured Query Language,是Oracle数据库系统中的一个重要的编程组件,它结合了SQL(结构化查询语言)的查询功能与过程性编程语言的特点...

    Allround_Automations_PL-SQL_Developer__Language_Packs_Downloadly.ir.rar

    标题中的"Allround_Automations_PL-SQL_Developer__Language_Packs_Downloadly.ir.rar"指出,这是一款名为"Allround Automations PL-SQL Developer"的软件的多语言包下载。PL/SQL是Oracle数据库系统中用于编写存储...

    ORACLE8 PLSQL程序设计_sql_code.zip_oracle pl/sql_pl sql code_pl/sql_

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与高级编程语法相结合,用于在Oracle数据库环境中构建复杂的业务逻辑和应用程序。Oracle8是PL/SQL的一个早期版本,尽管现在可能已经更新到了更高版本,...

    ORACLE_PL_SQL实例精解.part5

    ORACLE_PL_SQL实例精解 第五部分

    Oracle_PL-SQL入门教程(经典)

    这篇“Oracle PL-SQL入门教程(经典)”旨在帮助初学者掌握这个强大的工具。 SQL,全称为Structured Query Language,是一种标准化的语言,用于管理和处理关系型数据库。它主要由以下几个部分组成: 1. **数据查询**...

    ORACLE_PL_SQL实例精解

    ORACLE_PL_SQL实例精解(原书第4版),含书签,共617页

    Oracle_function_package_procedure.rar_oracle_pl sql function_pl/

    本文将深入探讨在PL/SQL中Oracle的函数、过程、包以及事务管理。 首先,让我们了解一下PL/SQL中的函数。函数是一段可重用的代码块,它接收参数,执行特定任务,并返回一个值。在Oracle中,你可以创建自定义函数,以...

Global site tag (gtag.js) - Google Analytics