ORA-22813: значение операнда превышает пределы системы - PullRequest
1 голос
/ 29 сентября 2011

У меня проблема с созданным оракулом. Цель хранимой процедуры состоит в том, чтобы либо получить все провода, содержащиеся в самолете, либо сравнить список проводов с другим (прошедшая конфигурация проводов самолета). Вы поймете, что это может быть довольно большим ... Я сделал первый выстрел с таблицей объектов. Я делаю оператор выбора и перебираю курсор, чтобы вставить значения в мои объекты. Проблема возникает, когда я пытаюсь это:

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, которую я попробовал. Но функция PIPELINED недопустима в контексте PL / SQL, так что это не подходит для моей проблемы, поскольку мне нужно переделать объект позже. Итак, я попытался использовать глобальную временную таблицу, и у меня возникла проблема с производительностью. Я также попытался связаться с администратором базы данных, если бы он мог увеличить размер PGA, что он и сделал (теперь это 150 МБ), но у меня та же проблема. Может быть, он все еще недостаточно велик, но я не хочу, чтобы он увеличил его, если он не сработает ... Просто у вас есть идея, у меня 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 Enterprise Edition Release 9.2.0.6.0

С уважением,

Ответы [ 2 ]

2 голосов
/ 26 ноября 2012

Просто хотел добавить этот лакомый кусочек на случай, если он кому-нибудь поможет.Мы внезапно начали получать эту ошибку в нашем PL / SQL, когда администратор БД установил RESULT_CACHE_MODE в AUTO в качестве теста для другого процесса.Мы не знали, что он сделал это намного позже.Во всяком случае, если установить его обратно на MANUAL, эта проблема была устранена.

2 голосов
/ 29 сентября 2011

Я сталкивался с подобной ситуацией в среде хранилищ данных на прошлой работе.

Ваш администратор БД увеличил pga_aggregate_target или _pga_max_size или оба? Имейте в виду, что когда администратор базы данных увеличивает pga_aggregate_target до 150 МБ, это не означает, что ваша сессия сможет получить все эти 150 МБ. Oracle позволит только данному сеансу занимать небольшую часть этого пространства. Увеличение pga_aggregate_target со 150 МБ до 200 МБ даст вашему сеансу лишь несколько дополнительных мегабайт памяти для операций в оперативной памяти IIRC.

Если ваш сервер БД имеет больше доступной памяти, вам придется увеличить свой DBA как pga_aggregate_target, так и _pga_max_size, в противном случае вам придется взглянуть на использование GTT или создание таблицы с нуля для сброса ваших данных, а затем работать на это оттуда.

...