Oracle 19c中如何仅通过数据库登录权限查看SYS.UTL_SMTP内置包源码
Oracle 19c 无服务器文件权限下查看SYS.UTL_SMTP源码的操作方法
前提说明
- 全程不需要数据库服务器的操作系统文件访问权限,所有操作通过现有数据库登录账号,用任意SQL客户端(SQL*Plus、Navicat、DBeaver等)执行SQL即可完成
- 默认普通数据库账号对公共内置包的源码有基础查询权限;如果查询时提示权限不足,只需要找DBA为你的账号授予
SELECT_CATALOG_ROLE角色即可,不需要额外的OS权限
具体查询操作
查询包规范(对外接口定义)
内置包的接口定义(也就是Package Spec部分)存储在系统数据字典视图中,直接执行以下SQL即可获取完整源码:
SELECT line, text FROM all_source WHERE owner = 'SYS' AND name = 'UTL_SMTP' AND type = 'PACKAGE' ORDER BY line;
查询包主体(内部实现逻辑)
包的实际业务实现代码(也就是Package Body部分)同样存储在数据字典中,仅需调整查询条件的类型值即可获取:
SELECT line, text FROM all_source WHERE owner = 'SYS' AND name = 'UTL_SMTP' AND type = 'PACKAGE BODY' ORDER BY line;
输出优化(适配SQL*Plus场景)
如果使用SQL*Plus连接数据库,可以先执行以下参数设置,避免输出折行、分页打断,拿到干净完整的源码文本:
-- 设置行宽,适配长行源码的显示 SET LINESIZE 1000 -- 取消分页行数限制 SET PAGESIZE 0 -- 去除行尾多余空格 SET TRIMSPOOL ON -- 关闭制表符自动展开,避免格式错乱 SET TAB OFF
常见注意事项
- 查询时的对象名
SYS、UTL_SMTP必须为大写,Oracle数据字典对对象名默认大小写敏感,小写输入会查询不到结果 - 不需要尝试查找服务器上的内置包安装脚本(如utlsmtp.sql),一方面你没有OS权限无法访问该文件,另一方面数据库运行时实际加载的包源码本身就存储在数据字典中,查询结果和安装脚本的内容完全一致
- 如果你用
ALL_SOURCE查询不到结果,可以切换为DBA_SOURCE视图执行相同逻辑的查询;如果没有该视图的查询权限,直接让拥有DBA权限的账号执行查询后导出结果给你即可,全程不需要访问服务器文件系统 - 少数核心内置包的源码是加密存储的,查询时会返回加密的乱码,但SYS.UTL_SMTP属于公开可读的内置包,无加密逻辑,可完整获取所有实现代码
内容的提问来源于stack exchange,提问作者user5507535
相关产品推荐
相关产品推荐

