Oracle中function和procedure、packages 与package bodies的区别

本文探讨了Oracle中函数(function)与存储过程(procedure)的主要区别,包括返回值的处理方式、调用方式及应用场景的选择。同时解答了关于包(package)与包体(package bodies)的概念与使用方法。

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

Oracle中function和procedure的区别?

1).可以理解函数是存储过程的一种

2).函数可以没有参数,但是一定需要一个返回值,存储过程可以没有参数,不需要返回值

3).函数return返回值没有返回参数模式,存储过程通过out参数返回值, 如果需要返回多个参数则建议使用存储过程

4).2012/5/282012/5/28在sql数据操纵语句中只能调用函数而不能调用存储过程,

5).function必须有返回值,并且只能有一个返回值;

6).procedur不叫返回值,叫带出,可以带出多个值;

7).packages、package   bodies是同时存在的,packages可包括function,procedure

 

问题一:以前在sqlserver中,我直接写个存储过程就可以调用。但是在oracle中,我看好多资料上说要想调用存储过程必须把存储过程放进包中才能调用?是否是这样?  

 

  不是,过程也可以单独写,单独调用  

 

问题二:packages   与package   bodies有什么区别?  

 

  packages中只有各个方法的定义,bodies中涉及具体的实现  

 

问题三:我在存储过程就是procedures中写了个存储过程,再写个包名包含进去吗?还是可以直接在包中写包名:再把想写的存储过程直接写进包中就行啦呢?  

 

  不用  

 

问题四:写进包,要写进哪个?packages   ?还是package   bodies  

 

  这两个是一体的,必须同时存在  

 

package   body和package都需要手工去写。  

  需要先创建package(也就是包的定义),再创建body。增加包中的过程或者修改包中过程的输入参数个数等也是要先改package再改body。

<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; -- 根据实际行号调整范围 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值