Oracle 包详解(package)

文章目录

1 概述

1. 包的概念
	(1) 模块化的思想,用于分类管理过程(procedure)和函数(function(2) 类似于 Java、Python 等语言中的 类(class)	
2. 包的组成(程序部署顺序:'先执行包头,再执行包体'(1) 包头:package
	(2) 包体:package body
3. 授权: grant execute on 属主.包名 to 用户1, 用户n;
4. 调用: '属主.包名.存储过程名()''属主.包名.方法名()'                   
5. 建议
	(1) 数据库中所有的过程(procedure)和函数(function)都要用 package 进行封装:便于管理
	(2) 单个的过程(procedure)和函数(function)建议不超过 3000(3) 每个 package 在 create 时都要带上 '属主'(避免所处位置错误)

 
 

2 示例

效果截图示例:用户 hr 调用用户 scott 中的 package,来判断 某表 是否存在于 scott 中

在这里插入图片描述

包头:

CREATE OR REPLACE PACKAGE scott.pkg_public_toolkit IS
   PROCEDURE p_whether_table_exists(i_table_name IN sys.all_tab_comments.table_name%TYPE,
                                    o_flag       OUT VARCHAR2,
                                    o_message    OUT VARCHAR2);
   FUNCTION f_whether_table_exists(i_table_name IN sys.all_tab_comments.table_name%TYPE)
      RETURN VARCHAR2;
END pkg_public_toolkit;
/
GRANT EXECUTE ON scott.pkg_public_toolkit TO hr;

 
 

包体:

CREATE OR REPLACE PACKAGE BODY scott.pkg_public_toolkit IS
   -- *********************************************
   -- 功能说明: 判断用户 scott 中是否存在表
   -- 参数说明: i_table_name  表名 
   --           o_flag        程序执行标志,Y:成功,N:失败
   --           o_message     程序执行的描述信息
   -- 修改记录:create by yoyo 2020/10/14
   -- *********************************************
   PROCEDURE p_whether_table_exists(i_table_name IN sys.all_tab_comments.table_name%TYPE,
                                    o_flag       OUT VARCHAR2,
                                    o_message    OUT VARCHAR2) IS
      v_count NUMBER(1);
   BEGIN
      -- 判断依据:用户 scott 中是否存在表
      SELECT COUNT(1)
        INTO v_count
        FROM user_tab_comments ust
       WHERE ust.table_name = upper(i_table_name);   
      -- 程序执行描述信息
      IF v_count >= 1 THEN
         o_message := '存在';
      ELSE
         o_message := '不存在';
      END IF;   
      -- 程序执行标识
      o_flag := 'Y';
   EXCEPTION
      WHEN OTHERS THEN
         o_flag := 'N'; -- 执行失败
         dbms_output.put_line(dbms_utility.format_error_backtrace); -- 报错的行号
         dbms_output.put_line(SQLCODE || ' : ' || SQLERRM); -- 报错的编号及内容
   END p_whether_table_exists;
   -- *********************************************
   -- 功能说明: 调用存储过程 p_whether_table_exists 的方法
   -- 参数说明:i_empno   部门编号
   --   返回值: i_table_name  表名
   -- 修改记录:create by yoyo 2020/10/14
   -- *********************************************
   FUNCTION f_whether_table_exists(i_table_name IN sys.all_tab_comments.table_name%TYPE)
      RETURN VARCHAR2 IS
      o_flag    VARCHAR2(2);
      o_message VARCHAR2(100);
   BEGIN
      p_whether_table_exists(i_table_name => i_table_name,
                             o_flag       => o_flag,
                             o_message    => o_message);
      RETURN o_message;
   END f_whether_table_exists;
END pkg_public_toolkit;
/

 
 

创建完成后,在 PL/SQL 中也可以找到 Package 的位置:
在这里插入图片描述

3 请注意

1. 授权完成,仅表示 '用户n' 能够 '执行' 该 pkg,
   不能保证 '用户n' 能够查询该 pkg 中的 '对象(如:表)', 如图 3.1
2. package、procedurefunction 声明时 isas 的区别
	(1) 在 package、procedurefunction 及自定义类型 type 时,asis 一样,没区别
	(2) 在声明游标(cursor)时,只能使用 is 而不能使用 as
	(3) 在创建视图(view)时,只能使用 as 而不能使用 is 
3. 规范:package、procedurefunction 在结束时的 end 后面都要带上对应的名字
        只有匿名语句块的 end 后面才不带名字,如:
        begin
           pl/sql 语句;
        end;

 
 

图 3.1:用户 hr 查询表 scott.emp 报错

在这里插入图片描述

解决办法:授权
grant select on scott.emp to hr;
revoke select on scott.emp from hr; -- 回收权限。

 
 
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Oracle数据库是一种关系型数据库管理系统,它由物理操作系统文件或磁盘的集合组成,称为数据库。一个数据库可以被多个实例装载和打开,而实例则是一组Oracle后台进程/线程以及共享内存区,由运行在同一台计算机上的进程/线程共享。实例可以维护易失的、非持久性内容,并可以在没有磁盘存储的情况下存在。实例和数据库之间的关系是,一个数据库可以由多个实例装载和打开,而一个实例在其生命周期中最多只能装载和打开一个数据库。实例是由一组操作系统进程(或者是一个多线程的进程)以及一些内存组成,这些进程可以操作数据库,而数据库则是一个文件集合,括数据文件、临时文件、重做日志文件和控制文件。大多数情况下,一个数据库上只有一个实例对其进行操作。然而,Oracle还提供了一个选项,称为Real Application Clusters(RAC),允许在集群环境中的多台计算机上操作数据库,从而实现高度可用的系统和可扩缩性极好的解决方案。 在Oracle中,为了找到某列的最大值或最小值,可以借助函数来实现,因为Oracle中没有像MySQL中的LIMIT这样的功能。另外,在对Oracle数据库进行优化时,可以从数据库的体系结构、软件结构、模式对象以及具体的业务和技术实现等多个方面进行统筹考虑,并对应用程序、I/O子系统和操作系统进行相应的优化。优化是有目的地更改系统的一个或多个组件,以改善性能,减少响应时间,增加吞吐量。 最后,Oracle支持多种数据类型及其对应的长度范围,这些数据类型括整数、浮点数、日期和时间、字符和文本、二进制数据等。可以根据需要选择合适的数据类型来存储和处理数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Oracle数据库详解(超详细)](https://blog.csdn.net/segegefe/article/details/125213545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [oracle数据库的深度解析](https://blog.csdn.net/lx_Frolf/article/details/84138488)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值