ORA-22813:操作数值超出系统限制

时间:2011-09-29 12:05:02

标签: oracle object plsql oracle9i

我遇到了我创建的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函数,因此不适合我的问题,因为我需要在之后重新编写对象。所以,我尝试了全球临时表,现在我遇到了性能问题。我还试图联系DBA,如果他可以增加PGA大小,他做了(现在是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版

致以最诚挚的问候,

2 个答案:

答案 0 :(得分:2)

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

您的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或创建一个临时表来将数据转储到然后工作在那里。

答案 1 :(得分:2)

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