zoukankan      html  css  js  c++  java
  • PL/SQL学习笔记之包

    一:包

       包是由一组相关的函数,过程,变量,游标等PL/SQL程序设计元素的组合而成的一个PL/SQL程序单元,相当于Java中的类。

       包的主要作用是封装:把相同或相似的东西归类,方便维护和管理,提高开发效率,提高性能。

    二:包的开发

        包的开发包括两部分:包的声明定义  和  包的主体开发。

        包的声明定义:声明  类型,变量,常量,异常,游标,函数,过程(声明,但不实现!) ,在包的声明部分定义的变量是公有变量(public),可以在包外通过  包名.变量名  引用。

        包的主体开发:在包的主体对 函数、过程 等进行具体的代码实现;在包主体的声明部分,可以定义私有变量,只在包内使用

    三:创建包(包的声明定义)

    CREATE [OR REPLACE] PACKAGE package_name  
    [AUTHID{CURRENT_USER|DEFINER}]  
    --AUTHID CURRENT_USER 和 AUTHID DEFINER 选项说明应用程序在调用函数时所使用的权限模式  
    IS|AS  
      [公有数据类型定义]  
      [公有游标声明]  
      [公有变量、常量声明]  
      [公有函数声明]  
      [公有过程声明]  
    END [package_name];

    例子:

    CREATE OR REPLACE PACKAGE c_package AS
       -- 过程声明
       PROCEDURE addCustomer(c_id   customers.id%type,
       c_name  customers.name%type,
       c_age  customers.age%type,
       c_addr customers.address%type, 
       c_sal  customers.salary%type);
      
       -- 过程声明
       PROCEDURE delCustomer(c_id  customers.id%TYPE);
    
       --过程声明
       PROCEDURE listCustomer;
     
    END c_package;

    四:包开发(包的主体开发)

        CREATE [OR REPLACE] PACKAGE BODY package_name  
        IS|AS  
          [私有数据类型定义]  
          [私有变量、常量声明]  
          [私有异常错误声明]  
          [私有函数声明和定义]  
          [私有函过程声明和定义]  
          [公有游标定义]//对游标进行具体赋值  
          [公有函数定义]//对函数进行具体代码实现
          [公有过程定义]//对过程进行具体代码实现
        BEGIN  
          --执行部分(一般为空)
        END package_name;  

    例如:

    CREATE OR REPLACE PACKAGE BODY c_package AS
       PROCEDURE addCustomer(c_id  customers.id%type,
          c_name customers.name%type,
          c_age  customers.age%type,
          c_addr  customers.address%type, 
          c_sal   customers.salary%type)
       IS
       BEGIN
          INSERT INTO customers (id,name,age,address,salary)
             VALUES(c_id, c_name, c_age, c_addr, c_sal);
       END addCustomer;
      
       PROCEDURE delCustomer(c_id   customers.id%type) IS
       BEGIN
           DELETE FROM customers
             WHERE id = c_id;
       END delCustomer;
    
       PROCEDURE listCustomer IS
       CURSOR c_customers is
          SELECT  name FROM customers;
       TYPE c_list is TABLE OF customers.name%type;
       name_list c_list := c_list();
       counter integer :=0;
       BEGIN
          FOR n IN c_customers LOOP
          counter := counter +1;
          name_list.extend;
          name_list(counter)  := n.name;
          dbms_output.put_line('Customer(' ||counter|| ')'||name_list(counter));
          END LOOP;
       END listCustomer;
    END c_package;

    五:包调用

    packageName.var; //调用公有变量
    packageName.func(param...);//调用函数
    packageName.procedure(param..);//调用过程

    六:删除包

    DROP PACKAGE [BODY] [user.]package_name;

    七:查看包源码

     select text from user_source where name = 'packageName'; 
  • 相关阅读:
    SPOJ NDIV
    SPOJ ETF
    SPOJ DIVSUM
    头文件--持续更新
    SPOJ FRQPRIME
    SPOJ FUNPROB
    SPOJ HAMSTER1
    观光
    最短路计数
    拯救大兵瑞恩
  • 原文地址:https://www.cnblogs.com/ygj0930/p/8298205.html
Copyright © 2011-2022 走看看