oracle中的function 、procedure、packages、package bodies比较

本文详细解析了函数和存储过程之间的区别,包括参数、返回值、应用场景等方面,并深入探讨了包与包主体的概念,解释了它们在组织和封装代码中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1  function和procedure的区别


1).可以理解函数是存储过程的一种
2).函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值
3).函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程
4).在sql数据操纵语句中只能调用函数而不能调用存储过程,
5).function必须有返回值,并且只能有一个返回值;
6).procedur不叫返回值,叫带出,可以带出多个值;
7).packages、package、bodies是同时存在的,packages可包括function,procedure
8).procedure和function可以单独存在,也可以放到bodies中.


2  packages、与packagebodies比较


      定义:packae是一种将过程、函数和数据结构捆绑在一起的容器;
          由两个部分组成:外部可视包规范,包括函数头,过程头,和外部可视数据结构;
          另一部分是包主体(package body),包主体包含了所有被捆绑的过程和函数的声明、执行、异常处理部分。
      简单说就是packages中只有各个方法的定义,bodies中涉及具体的实现.
      所以 packages和packagebodies是一体的,必须同时存在.如果要外部调用的,就在package里声明一下,包内调用的,只要在body里写就行了。
      package可包括function,procedure.
      需要先创建package(也就是包的定义),再创建body。
      增加包中的过程或者修改包中过程的输入参数个数等也是要先改package再改body


3  package的作用


      可以简化应用设计、提高应用性能、实现信息隐藏、子程序重载

<think>嗯,用户想知道如何在Oracle中查看包(PACKAGE)下的存储过程(procedure)的具体内容或定义。我需要回忆一下Oracle的数据字典视图,通常这类信息存储在系统视图中。 首先,用户可能需要访问数据字典,比如USER_SOURCE、ALL_SOURCE或DBA_SOURCE。这些视图存储了包、过程、函数等的源代码。不过要注意权限问题,如果是普通用户,可能只能查看自己有权限的对象。 然后,用户可能需要使用DESCRIBE命令或者DBMS_METADATA.GET_DDL包来获取对象的定义。DESCRIBE可能只显示参数信息,而GET_DDL可以生成完整的DDL语句,包括包体和包规范的代码。 另外,用户可能在使用SQL Developer或者PL/SQL Developer这样的工具,这些工具通常有图形界面可以直接查看包的定义。但用户可能是在命令行环境下,所以需要给出SQL查询的方法。 需要确认用户是否有权限访问DBA_SOURCE,如果没有,可能需要使用ALL_SOURCE或USER_SOURCE。查询时,要按行号排序,以确保代码的正确顺序。 可能还需要提醒用户,如果包体被加密(WRAPPED),则无法直接查看源代码。这时候可能需要联系管理员或开发者获取原始代码。 最后,生成相关的问题,比如如何查看函数定义,如何获取包体代码,或者如何处理加密的包体。这些扩展问题能帮助用户进一步了解相关操作。</think>### 查看 Oracle PACKAGEPROCEDURE 定义的方法 #### 方法1:通过数据字典视图 `USER_SOURCE` 或 `DBA_SOURCE` Oracle 存储的包、函数、过程源代码可通过以下步骤查询: ```sql SELECT text FROM user_source WHERE name = '包名称' -- 替换为实际包名 AND type = 'PACKAGE BODY' -- 包体存储过程定义 ORDER BY line; ``` 若需查看包规范(声明部分),将 `type` 改为 `PACKAGE`。若没有权限,可使用 `all_source` 或 `dba_source`[^2][^5]。 #### 方法2:使用 `DESCRIBE` 命令(仅显示参数) 在 SQL*Plus 或 SQLcl 中直接输入: ```sql DESC 包名称.存储过程名称; -- 例如 DESC EMP_PKG.UPDATE_SALARY; ``` 可显示参数列表及类型,但不包含具体实现代码[^1][^4]。 #### 方法3:通过 `DBMS_METADATA` 包生成完整DDL ```sql SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY', '包名称', '所属用户') FROM dual; -- 例如 SELECT DBMS_METADATA.GET_DDL('PACKAGE_BODY','EMP_PKG','SCOTT') FROM dual; ``` 此方法可输出完整的包体创建语句,包含所有存储过程的实现细节[^3]。 #### 方法4:IDE 工具直接查看 在 SQL Developer 或 PL/SQL Developer 中: 1. 展开 `Packages` 节点 2. 右键目标包选择 **View** 或 **Edit** 3. 切换到 **Body** 标签页查看具体实现 #### 注意事项 1. 若包体被加密(WRAPPED),源代码会显示为密文,需联系开发者获取原始代码 2. 需要 `SELECT_CATALOG_ROLE` 权限才能查询系统视图 3. 包规范(PACKAGE)仅包含声明,包体(PACKAGE BODY)存储具体实现 ```sql -- 示例:查询 EMP_PKG 包中的 UPDATE_SALARY 过程 SELECT text FROM user_source WHERE name = 'EMP_PKG' AND type = 'PACKAGE BODY' AND line BETWEEN 20 AND 30; -- 根据实际行号调整范围 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值