oracle 19c 中的内部与外部数据类型

Posted

技术标签:

【中文标题】oracle 19c 中的内部与外部数据类型【英文标题】:Internal vs external data type in oracle 19c 【发布时间】:2021-03-30 04:49:26 【问题描述】:

我读了很长时间Oracle documentation,仍然无法理解Internal vs External datatype的区别和实际含义。在oracle 19c 中,我读取了内部与外部数据类型。

有人可以建议,下面的代码如何与oracle19c..不兼容。它只是标题。我认为一些datatype 问题存在但无法弄清楚。

我无法理解下面的package specification 如何与oracle19c 不兼容。此文件已被扫描无效。 Oracle 文档没有帮助

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 internal and external datatype 并在上面specification 提供任何帮助吗?

我在 oracle 文档中读到了这个。

https://docs.oracle.com/en/database/oracle/oracle-database/19/lnoci/data-types.html#GUID-D69455D9-CE01-44CC-B5A9-E541C7774805

这里提到了internal vs external datatype。 https://docs.oracle.com/en/database/oracle/oracle-database/19/lnoci/data-types.html#GUID-027FB2E2-593C-43F1-9184-DFEF7A984A27

【问题讨论】:

“此文件已被扫描无效”是什么意思?如果您收到错误消息,如果您编辑问题并打印完整的错误消息以及生成错误消息的工具,将会有所帮助。内部数据类型与外部数据类型是什么意思?您是使用 OCCI 还是其他工具连接到数据库? @JonHeller 谢谢乔恩,我已经更新了这个问题。实际上,我们正在将我们的应用程序从 12c 迁移到 19c(ADB),因此发布团队强调需要更改这些文件。我只是浏览文档并编辑它们。我认为这是一个小文件,所以可能是数据类型问题。我已经修改了这个问题。请帮忙。 “内部”数据类型被称为“内置”,它们列在您上面给出的参考文献的表 5.1 中。因此,通过推断,“外部”数据类型是那些可能从其他来源遇到的数据类型。 "外部数据类型代码向 Oracle 数据库指示主变量如何表示程序中的数据。这决定了数据在返回到程序中的输出变量时如何转换,或者如何从输入转换(绑定) 变量到 Oracle 数据库列值。" 谢谢保罗。可以举个例子吗? 当您说“发布团队强调这些文件需要更改”时,他们到底说什么需要更改?我看不出包装规范有任何明显错误。自定义类型ecc_sec_field_values 可能有问题? 【参考方案1】:

如果您省略用户定义的数据类型ecc_sec_field_values,您的包很好:

CREATE OR REPLACE PACKAGE ABC_ECC_DATASECURITY_PKG_PUB AS

  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,
      x_return_status  OUT NOCOPY VARCHAR2,
      x_return_message OUT NOCOPY VARCHAR2,
      x_sec_filter     OUT NOCOPY CLOB
  );

END ABC_ECC_DATASECURITY_PKG_PUB;
/

Package ABC_ECC_DATASECURITY_PKG_PUB compiled

但是,如果您包含 ecc_sec_field_values,我会收到错误消息:

CREATE OR REPLACE PACKAGE ABC_ECC_DATASECURITY_PKG_PUB AS

  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;
/

Error(9,35): PLS-00201: identifier 'ECC_SEC_FIELD_VALUES' must be declared

我猜这是在其他文件中声明的TYPE。寻找CREATE OR REPLACE TYPE ecc_sec_field_values 什么的。

顺便说一句,COMMIT 似乎很危险,因为原作者似乎不理解CREATE 语句的提交行为......

【讨论】:

以上是关于oracle 19c 中的内部与外部数据类型的主要内容,如果未能解决你的问题,请参考以下文章

19c 上的外部表读取问题

Migrating Oracle 11g R2 To Oracle 19c

Oracle 19c对VARCHAR2的限制

Oracle 19c对VARCHAR2的限制

Oracle 19c 数据库管理与维护 ① ~ 监控数据库 - #wx_asksiri

Oracle 19c 数据库管理与维护 ① ~ 监控数据库 - #wx_asksiri