You need to enable JavaScript to run this app. 咨询Oracle 19c Internal vs External datatype差异及包规范兼容性问题
优惠活动
大模型
产品
解决方案
定价
更多

咨询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文档内容截图
你查阅的Oracle 19c官方OCI文档中,分别设置了内部数据类型、外部数据类型的专门章节,内容与上述概念解释保持一致。


内容的提问来源于stack exchange,提问作者Shruti sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.28 09:54:04