咨询Oracle 19c Internal vs External datatype差异及包规范兼容性问题
一、Oracle 内部数据类型与外部数据类型核心概念
这两类概念属于*Oracle调用接口(OCI)*层面的分类,和PL/SQL程序包的编译校验逻辑完全独立,二者的定义区别如下:
- 内部数据类型:是Oracle数据库引擎在存储、运算数据时实际使用的原生实体类型,也是用户在建表、编写PL/SQL程序时日常接触的基础类型,比如VARCHAR2、NUMBER、CLOB等,对应数据库内部存储块的实际数据编码格式。
- 外部数据类型:是OCI接口用于客户端(C/C++编写的应用程序)和数据库服务端做数据传输、格式转换时的客户端侧类型定义。当应用通过OCI向数据库传参、读取查询结果时,需要把客户端的编程数据格式和数据库内部类型做双向映射,这类映射用到的客户端可识别类型就是外部数据类型。
二、包规范无效的原因排查
首先需要明确:你遇到的Oracle 19c环境下包头无效的问题,和OCI层面的内/外部数据类型概念无关联,不存在“数据类型不兼容”导致的包编译失败。排查时可以先执行以下语句直接定位具体编译错误,不需要盲目猜测:
SELECT * FROM USER_ERRORS WHERE NAME = 'ABC_ECC_DATASECURITY_PKG_PUB';
按照优先级,常见的问题根源如下:
- 核心问题:依赖的自定义类型不存在
包定义中引用的ecc_sec_field_values是自定义集合类型,这类类型通常是过往版本EBS套件内置的对象。如果当前19c环境没有提前创建、授权该类型,数据库编译时会直接抛出“标识符未声明”的错误,导致整个包被判定为无效。 - 脚本适配问题
脚本末尾的EXIT;是SQL*Plus环境专属的客户端命令,如果在PL/SQL Developer、DataGrip等其他开发工具中直接执行全量脚本,会触发语法解析错误。 - 权限问题
即使ecc_sec_field_values类型已经存在,如果当前执行创建包的账号没有该类型的执行权限,同样会触发编译失败。
你提供的待编译包头代码如下:
CREATE OR REPLACE PACKAGE ABC_ECC_DATASECURITY_PKG_PUB AS /* $Header: ABCCCDSS.pls 120.0.12020000.2 2020/11/17 21:49:12 mgarg noship $ */ PROCEDURE GetFilterAttributeValues ( p_dataset_key IN VARCHAR2, p_user_id IN NUMBER, p_org_id IN NUMBER, p_resp_id IN NUMBER, p_resp_app_id IN NUMBER, p_sec_group_id IN NUMBER, p_params IN ecc_sec_field_values DEFAULT NULL, x_return_status OUT NOCOPY VARCHAR2, x_return_message OUT NOCOPY VARCHAR2, x_sec_filter OUT NOCOPY CLOB ); END ABC_ECC_DATASECURITY_PKG_PUB; / COMMIT; EXIT;
参考资料说明:
你查阅的Oracle 19c官方OCI文档中,分别设置了内部数据类型、外部数据类型的专门章节,内容与上述概念解释保持一致。
内容的提问来源于stack exchange,提问作者Shruti sharma
相关产品推荐
相关产品推荐

