我遇到了我创建的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版
致以最诚挚的问候,
答案 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可以解决这个问题。