【问题标题】:ORA-22813: operand value exceeds system limitsORA-22813: 操作数值超出系统限制
【发布时间】:2011-11-27 15:56:18
【问题描述】:

我创建的 Oracle 对象有问题。存储过程的目标是检索飞机上包含的所有电线或将电线列表与另一条电线列表(过去的飞机电线配置)进行比较。你会明白这可能很大……我用一张物体表做了第一次拍摄。我创建了一个 select 语句并遍历游标以在我的对象中插入值。问题出在我尝试这个时:

OPEN P_CURSOR FOR
  SELECT * FROM TABLE(CAST(GET_WIRES(P_ACTUAL_HAR_LIST, P_END_IDENT_TYPES) AS TBL_TP_WIRE_LIST));

我得到 ORA-22813:操作数值超出系统限制。所以,我开始在互联网上寻找,我发现我应该使用 PIPELINED 函数,我尝试了它。但是,在 PL/SQL 上下文中不允许使用 PIPELINED 函数,所以这不适合我的问题,因为我需要在之后重新处理对象。所以,我尝试了一个全局临时表,现在我遇到了性能问题。如果他可以增加 PGA 大小,我也尝试联系 DBA,他这样做了(现在是 150mb),但我有同样的问题。也许它仍然不够大,但如果它不起作用,我不希望他重新增加它......你有一个想法,我有 1 487 761 个:

CREATE OR REPLACE
TYPE TP_WIRE_LIST_ENTRY AS OBJECT (
  ATA_NUM                   VARCHAR2(8 BYTE),
  EFFECTIVITIES             VARCHAR2(4000 BYTE),
  WIRE_ID                   VARCHAR2(50 BYTE),
  DRAWING_NO                VARCHAR2(25 BYTE),
  END_IDENT_1               VARCHAR2(25 BYTE),
  END_IDENT_2               VARCHAR2(25 BYTE),
  PIN_1                     VARCHAR2(25 BYTE),
  PIN_2                     VARCHAR2(25 BYTE),
  TERM_1                    VARCHAR2(25 BYTE),
  TERM_2                    VARCHAR2(25 BYTE),
  DES_LENGTH                NUMBER(6,2),
  TECH_PUBS_REMARKS         VARCHAR2(500 BYTE),
  WIRE_CODE                 VARCHAR2(25 BYTE),
  W_CODE                    VARCHAR2(3 BYTE),
  AWG                       VARCHAR2(3 BYTE),
  COLOR                     VARCHAR2(4 BYTE),
  GA                        VARCHAR2(6 BYTE),
  END_IDENT_DESC_1          VARCHAR2(50 BYTE),
  END_IDENT_DESC_2          VARCHAR2(50 BYTE),
  TECH_PUBS_REMARKS_1       VARCHAR2(500 BYTE),
  TECH_PUBS_REMARKS_2       VARCHAR2(500 BYTE),
  IDENT_TYPE_ID_1           VARCHAR2(10 BYTE),
  IDENT_TYPE_ID_2           VARCHAR2(10 BYTE),
  BUS_NAME_1                VARCHAR2(20 BYTE),
  PROPERTY_COLLECTION_ID_1  NUMBER(10,0),
  BUS_NAME_2                VARCHAR2(20 BYTE),
  PROPERTY_COLLECTION_ID_2  NUMBER(10,0),
  X_1                       NUMBER(8,3),
  Y_1                       NUMBER(8,3),
  Z_1                       NUMBER(8,3),
  UOM_1                     VARCHAR2(10 BYTE),
  X_2                       NUMBER(8,3),
  Y_2                       NUMBER(8,3),
  Z_2                       NUMBER(8,3),
  UOM_2                     VARCHAR2(10 BYTE),
  COORD_CODE_1              VARCHAR2(10 BYTE),
  COORD_CODE_2              VARCHAR2(10 BYTE),
  UOM_DESC_1                VARCHAR2(50 BYTE),
  UOM_DESC_2                VARCHAR2(50 BYTE),
  PART_NO                   VARCHAR2(25 BYTE),
  PART_DESC                 VARCHAR2(50 BYTE),
  WIRE_GAUGE                VARCHAR2(4 BYTE),
  SPEC_REFERENCE            VARCHAR2(60 BYTE),
  MPS_NUM                   VARCHAR2(25 BYTE),
  PPS_NUM                   VARCHAR2(25 BYTE),
  INSERTION_TOOL            VARCHAR2(25 BYTE),
  EXTRACTION_TOOL           VARCHAR2(25 BYTE) 
);
/

我们使用 Oracle9i 企业版 9.2.0.6.0 版

最好的问候,

【问题讨论】:

  • 不清楚您为什么要使用集合。这些数据一定来自某个地方,对吧?那么它是从哪里来的呢?另外,“但是,PL/SQL 上下文中不允许使用 PIPELINED 函数,所以这不适合我的问题”是什么意思?
  • 为什么你还在使用已经过时 8 年的 9i?
  • 是否可以将 GET_WIRES 构建为视图而不是过程?
  • APC - 数据来自具有多个连接的 Select 语句。我需要该对象来创建一种新表。 select 语句的第一个表是另一个对象,它是根据例如飞机程序、报告类型等动态创建的。 Kevin - 否,因为语句的主表是动态的(另一个对象) Tony - 那评论未被占用。我们仍然使用 9i 的原因是因为我们的客户这样做了,仅此而已!问他们为什么不为新版本的 Oracle 付费!
  • Kevin - 不,因为要检索电线,我们必须有一个根据上下文动态的标识符列表

标签: oracle object plsql oracle9i


【解决方案1】:

在过去的工作中,我在数据仓库环境中遇到过类似的情况。

您的 DBA 是否创建了 pga_aggregate_target 或 _pga_max_size 或两者?请记住,当 DBA 将 pga_aggregate_target 增加到 150MB 时,这并不意味着您的会话能够获取所有 150MB。 Oracle 将只允许给定会话占用该空间的一小部分。将 pga_aggregate_target 从 150MB 增加到 200MB 只会为您的会话提供一些额外的内存用于内存中操作 IIRC。

如果您的数据库服务器有更多可用内存,则必须让您的 DBA 增加 pga_aggregate_target 和 _pga_max_size,否则您将不得不考虑使用 GTT 或创建临时表将数据转储到然后工作从那里开始。

【讨论】:

  • 感谢您的回答!我会问他...我还要求他将 PGA 增加到 1GO,我清理了一半的对象列...如果合适我会发布答案...
  • 您正在处理的数据集有多大?你需要把 EFFECTIVITIES 列拉进去吗?如果您的平均列大小接近 4K,那么您需要在内存中管理一个巨大的结果集。如果它对于您的环境来说太大了,您可能仍然需要将其转储到 GTT 或永久表中,您可以在其中放置一些索引。你的 DBA 拉了吗
  • @Fragmatyc 1GB 的最大 pga 大小并没有那么大。当我计算出最大列长度为 6,387 时,即如果您使用其中的 50%,您将看到您个人需要的 4.25Gb 内存。作为最低限度。为了安全起见,它应该是 10Gb 左右。卡巴尔是正确的;您将需要创建一个普通表来将数据转储到其中。如果您总是将数据放入这种类型,那么您可以遍历光标并将其直接放入类型中,而无需打扰对象。
【解决方案2】:

只是想添加这个花絮,以防它帮助别人。当 DBA 将 RESULT_CACHE_MODE 设置为 AUTO 作为对另一个进程的测试时,我们突然开始在 PL/SQL 中遇到此错误。直到很久以后,我们才知道他这样做了。无论如何,将其设置回 MANUAL 解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多