博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PL/SQL学习笔记之包
阅读量:2198 次
发布时间:2019-05-02

本文共 2386 字,大约阅读时间需要 7 分钟。

 

一:包

   包是由一组相关的函数,过程,变量,游标等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';

 

转载于:https://www.cnblogs.com/ygj0930/p/8298205.html

你可能感兴趣的文章
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>