ORA-22813: operand value exceeds system limits

假装没事ソ 提交于 2019-12-12 09:58:42

问题


I'm having an issue with an oracle object I created. The goal of the stored procedure is to either retreive all wires contained on an airplane or compare the list of wires with another one (past airplane wire configuration). You will understand that this can be quite big... I did a first shot with a table of objects. I make a select statement and loop through a cursor to insert values in my objects. The problem comes from when I try this:

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

I get the ORA-22813: operand value exceeds system limits. So, I started looking on the internet and I found that I should have used a PIPELINED function, which I tryied. But, the PIPELINED function is not allowed in a PL/SQL context, so that doesn't fit my problem, since I need to rework the object afterward. So, I tryied a Global Temporary Table and I have now performance issue. I also tryied to contact the DBA if he could increase the PGA size, which he did (it's now 150mb) but I have the same problem. Maybe it's still not big enough, but I don't want him to reincrease it if it's not going to work... Just so you have an idea, I have 1 487 761 of those:

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

We work with Oracle9i Enterprise Edition Release 9.2.0.6.0

Best regards,


回答1:


I ran into a similar situation in a data warehousing environment at a past job.

Did your DBA increate pga_aggregate_target or _pga_max_size or both? Keep in mind that when the DBA increases pga_aggregate_target to 150MB that doesn't mean that your session would be able to grab all of that 150MB. Oracle will only allow a given session to take a small fraction of that space. Increasing pga_aggregate_target from 150MB to 200MB will only give your session a few extra megs of memory to play with for in-memory operations IIRC.

If your DB server has more available memory, you'll have to have your DBA increase both pga_aggregate_target and _pga_max_size, otherwise you'll have to look at using a GTT or creating a scratch table to dump your data into and then work on it from there.




回答2:


Just wanted to add this tidbit in case it helps someone else. We suddenly started getting this error in our PL/SQL when the DBA set RESULT_CACHE_MODE to AUTO as a test for another process. We didnt know he did this until much later. Anyway, setting it back to MANUAL fixed this problem.



来源:https://stackoverflow.com/questions/7597053/ora-22813-operand-value-exceeds-system-limits

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!