Cursor Bulk Collect
Hi allI have a doubt about cursor in block collection. Both versions work correctly.
1st Version:
DECLARE
CURSOR c1 IS (SELECT t2 FROM test10);
TYPE typ_tbl IS TABLE OF c1%rowtype;
v typ_tbl;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO v;
CLOSE c1;
FOR i IN v.first..v.last
LOOP
DBMS_OUTPUT.PUT_LINE(v(i).t2);
END LOOP;
END;
2nd version:
DECLARE
CURSOR c1 IS (SELECT t2 FROM test10);
TYPE typ_tbl IS TABLE OF c1%rowtype;
v typ_tbl;
BEGIN
OPEN c1;
LOOP --Loop added
FETCH c1 BULK COLLECT INTO v;
EXIT WHEN c1%NOTFOUND;
END LOOP;
CLOSE c1;
FOR i IN v.first..v.last
LOOP
DBMS_OUTPUT.PUT_LINE(v(i).t2);
END LOOP;
END;
Is it necessary to have a loop and exit the statementwhen notfound cursor used with bulk collect?Published by: SamFisher February 14, 2012 13:26
SamFisher wrote:
for idx in (SELECT FROM test10 t2)
loop
end loop;
But in doing so, context switches will be more aint't it?
Yes, you will need to switch between SQL and PL/SQL, which is one of the penalties you pay to use the PL/SQL when SQL is necessary (don't tell is your case here, just a generality). However, that there are compromises. Memory is a limited product, it is expensive and you do not have an infinite amount. It is not as effective to spend many thousands of records in memory and then apply to processes that together, if you bulk load a bit, process a little you avoid exhaust any given resource (CPU, memory, etc...).
As I said, Oracle will use a fetch array of 100, instead of X, where X is the number of records your query when you use a bulk collect without LIMITS. If you had to carry 10 000 magazines across the room, do you think you would sooner do 100 at a time and do a lot of travel or find a way to carry all the 10,000 in a trip?
If you are interested in the analysis comparative differences, set up a simple table and load 100,500,1000,10000,100000, etc... documents in it and see what look like processing times.
For versatile use, the implicit cursor loop wins hands down for each perspective (my opinion). Yet once again, assuming that you NEED pl/sql at all.
Published by: Tubby on February 14, 2012 11:41
Tags: Database
Similar Questions
-
Cursor cursor to COLLECT in BULK and test
Hello
I am struggling to test a cursor, my requirement is as follows
To truncate a table then reinsert this record with all the content of the cursor if cursor returns record.
PROCEDURE populate_offline_table AS
CURSOR ext_table_cursor
IS
SELECT * from ext_table;
ARRAY TYPE IS TABLE of ext_table_offline % ROWTYPE;
ext_table_array TABLE.
ext_table_empty EXCEPTION;
BEGIN
OPEN ext_table_cursor.
IF ext_table_cursor % ROWCOUNT > 0 THEN
EXECUTE IMMEDIATE 'TRUNCATE TABLE ext_table_offline';
LOOP
Get the ext_table_cursor COLLECT LOOSE ext_table_array LIMIT 1000;
EXIT WHEN ext_table_cursor % NOTFOUND;
FORALL rec IN 1.ext_table_array. COUNTY
INSERT INTO ext_table_offline VALUES (rec) ext_table_array;
END LOOP;
ON THE OTHER
RAISE ext_table_empty;
END IF
CLOSE Ext_table_cursor;
EXCEPTION
WHEN ext_table_empty
THEN dbms_output.put_line ('outer Table is empty');
END populate_offline_table;
Can someone help me please
2726801 wrote:
I have some questions:
1. What is the disadvantages of using slider with BULK COLLECT and LIMIT?
This isn't a slow line according to the treatment, and after treatment. The term "bulk collect" is not a magic formula that transforms the transformation of the slow line in function in evolutionary and optimal treatment.
If you move/copy data from a database table to the other, and you use the PL/SQL engine and the memory of PL/SQL to transfer data from a target SQL to another, it is neither optimal or scalable.
Remove the PL/SQL engine called detour and DIRECTLY copy/move the target of SQL source data to the target SQL, optimal and scalable.
-
Bulk collect and cursors using rowtype
Hello
I'm trying just one big collect of a table and display one of the values.
It keeps giving me the error:
dbms_output.put_line ('f_viewed_rec: ' | f_viewed_rec.job_id (i));
*
ERROR on line 66:
ORA-06550: line 66, column 53:
PLS-00302: component 'JOB_ID' must be declared.
----
cursor f_viewed IS
Select job_id of the work;
type f_viewed_type is table of the f_viewed % rowtype;
f_viewed_rec f_viewed_type;
Start
Open f_viewed;
LOOP
F_viewed fetch bulk collect within the limit of 5000 f_viewed_rec;
--------
I'm in f_viewed_rec.first... f_viewed_rec. Last
LOOP
dbms_output.put_line ('f_viewed_rec: ' | f_viewed_rec.job_id (i));
END LOOP;
END LOOP;
end;
/
--------------------------
Any ideas? Thanks much for any help.
-JennyDifficulty
dbms_output.put_line('f_viewed_rec: '||f_viewed_rec.job_id(i));
TO
dbms_output.put_line('f_viewed_rec: '||f_viewed_rec(i).job_id);
Kind regards
Sayan M. -
Procedure failed when using bulk collect clause and works with the cursor
Hi all
I use "BULK collect into" clause in my procedure and it is a failure after 21 minutes and gives the error "end of file communication channel.
After that this error comes when I tried to connect the database it gives following error.
ORA-01034 - Oracle is not available.
ORA - 27101-shared memory realm does not exist.
SVR4 error: 2: no such file or directory.
When I use the cursor instead of the COLLECTION in BULK IN the clause, it runs successfully.
Following the code works with the slider.
procedure work_kiosk_full (an_jobid in number, ac_sqlcode out varchar2, ac_sqlerrm out varchar2) is
ld_curr_time Date;
cursor cur_work_kiosk is
Select distinct jt.jt_id AS jt_id,
NVL ((ROUND ((jt_date_completed-jt_date_requested) * 24, 2)))
),
0
) AS actual_hrs_to_complete,
NVL ((ROUND ((jt_date_responded-jt_date_requested) * 24, 2)))
),
0
) AS actual_hrs_to_respond,
peo1.peo_name AS agent_name,
peo1.peo_user_name AS asagent_soe_id,
Le.lglent_desc AS ap_system,
"" AS assign_work_request_comment,
DECODE (jt.jt_bill_id,
138802, 'BILLABLE CLIENT. "
138803, "CONTRACTED"
"138804, ' BILLABLE IN-HOUSE."
NULL, ' '
) Billable.
BL.bldg_name_cc BUILDING, bl.bldg_id_ls AS building_id,
DECODE (bl.bldg_active_cc,
'Y', 'ACTIVE',
'INACTIVE '.
) AS building_status,
DECODE (jt.jt_wrk_cause_id,
141521, "STANDARD WEAR."
141522, "NEGLIGENCE."
141523, "ACCIDENTAL."
141524, "MECHANICAL FAILURE."
141525, "CONTROL."
141526, "VANDAL."
141527, 'STANDARD ',.
141528, "WORK PROJECT",.
6058229, "TEST."
NULL, ' '
) AS cause_type,
' ' AS comments, peo3.peo_name AS completed_by,
JT.jt_requestor_email AS contact_email,
JT.jt_requestor_name_first
|| ' '
|| JT.jt_requestor_name_last AS contact_name,
JT.jt_requestor_phone AS contact_phone,
CC.cstctrcd_apcode AS corp_code,
CC.cstctrcd_code AS cost_center,
JT.jt_date_closed AS date_closed,
JT.jt_date_completed AS date_completed,
JT.jt_date_requested AS date_requested,
JT.jt_date_responded AS date_responded,
JT.jt_date_response_ecd AS date_response_ecd,
JT.jt_date_scheduled AS date_scheduled,
DECODE (jt.jt_def_id,
139949, "WTG VENDOR RESPONSE."
139950, "WAITING ON PARTS."
139951, "AVAILABILITY OF THE HAND ŒUVRE."
139952, "WORK DEFERRED-HI PRI."
139953, "APPROVAL OF WIND TURBINES."
139954, "FUNDING."
139955, "ACCESS DENIED."
139956, "WTG MATERIAL."
NULL, ' '
) AS deferral_reason,
JT.jt_description as description,
JT.jt_date_resched_ecd IN the development of the young child,
FMG.facility_manager AS facility_manager,
FL.floors_text AS FLOOR, gl.genled_desc AS general_ledger,
'' AS kiosk_date_requested,' ' AS kiosk_dispatch_confirmed.
"" AS kiosk_dispatched,
EQP.equip_customer_code AS linked_equipment_alias,
EQP.equip_id AS linked_equipment_id,
EQP.equip_text AS linked_equipment_name,
DECODE (jt_originator_type_id,
1000, "PROJECT MOVE REQUEST."
138834, "CUSTOMER OPEN CORRECTION."
138835, "OPEN REQUEST CUSTOMER."
138836, "CORRECTIVE MAINTENANCE",.
138837, "BOOKING CONFERENCE ROOM."
138838, "PROJECT INITIATED REQUEST."
138839, "PLANNED PREVENTATIVE MAINTENANCE."
138840, "COULD START FREE APPLICATION."
NULL, ' '
) AS originator_type,
"" AS payment_terms, priority_text AS priority_code,
swoty.sworktype_text AS problem_type,
Prop.property_name_cc as a property,
JT.jt_cost_quote_total AS quote_total,
par.levels_name IN the region,
DECODE (jt.jt_repdef_id,
141534, 'ADJUSTED SETTING. "
141535, "THE TRAINING OF THE END,"
141536, "NEW REQUEST"
141537, "NO INVESTIGATION OF REPAIR."
141538 "REPLACED PARTS."
141539, 'REPLACE EQUIPMEN.
1000699, "NEW REQUEST"
NULL, ' '
) AS repair_definitions,
JT.jt_repairdesc AS MARKED_COR,
JT.jt_requestor AS applicant, ' ' AS requestor_cost_center.
JT.jt_requestor_email AS requestor_email,
JT.jt_requestor_name_first AS requestor_name,
JT.jt_requestor_phone AS requestor_phone,
"" LIKE response_time, rm.room_name_cc ROOM,
P1.peo_provider_code1 AS service_provider,
P1.peo_address_1 AS service_provider_address,
peocity.city_text service_provider_city,
P1.peo_provider_code1 AS service_provider_code,
peocity.city_country_name AS service_provider_country,
peocur.currency_text AS service_provider_currency,
P1.peo_name AS service_provider_description,
P1.peo_dispatch_method AS serv_prov_dispatc_hmethod,
P1.peo_rate_double AS serv_prov_double_time_rate,
P1.peo_email AS service_provider_email,
P1.peo_emergency_phone AS serv_prov_emergency_phone,
P1.peo_fax AS service_provider_fax_number,
P1.peo_home_phone AS service_provider_home_phone,
P1.peo_rate_hourly AS service_provider_hourly_rate,
P1.peo_title AS service_provider_job_title,
P1.peo_method_id AS service_provider_method,
P1.peo_cell_phone AS service_provider_mobile_phone,
P1.peo_pager AS service_provider_pager,
P1.peo_rate_differential AS service_provider_rates,
P1.peo_rate_differential AS ser_prov_shift_differential,
peocity.city_state_prov_text AS serv_prov_state_province,
DECODE (p1.peo_active,
'Y', 'ACTIVE',
'INACTIVE '.
) AS service_provider_status,
P1.peo_url AS serv_prov_web_site_address,
P1.peo_phone AS service_provider_work_phone,
P1.peo_postal_code AS serv_prov_zip_postal_code, ' ' shift, as.
' ' AS skill,.
DECODE (jt.jt_bigstatus_id,
138813, «NEWS»,
138814 "PENDING."
138815, 'OPEN ',.
138816, "END."
138817, 'CLOSED ',.
138818, "CANCELLED."
NULL, ' '
) The STATUS,
Lev.levels_name IN the subregion, ' ' IN the trade.
P1.peo_ls_interface_code1 AS vendor_id,
P1.peo_fax AS vendor_purchasing_fax,
P1.peo_vendor_site_code AS vendor_sitecode,
JT.jt_id AS vendor_ticket, p1.peo_name AS vendor_companyname,
JT.jt_requestor_vip AS vip, wo.wo_id AS work_order_no,
JT.jt_id AS work_request,
JT.jt_class_id AS work_request_class,
woty.worktype_text AS work_type, ' ' AS wr_cost.
JT.jt_description AS wr_description,
"" AS wr_dispatch_method,
DECODE (jt.jt_bigstatus_id,
138813, «NEWS»,
138814 "PENDING."
138815, 'OPEN ',.
138816, "END."
138817, 'CLOSED ',.
138818, "CANCELLED."
NULL, ' '
) AS wr_status,
ctrY.country_name as a country
OF citi.jobticket jt,.
Citi.Property prop,
Citi.Bldg bl,
Citi.bldg_levels bldglvl,
civil LEVEL lev,
civil by LEVELS.
(SELECT crstools.stragg (peo_name) facility_manager,
bldgcon_bldg_id
OF citi.bldg_contacts, citi.people
WHERE bldgcon_peo_id = peo_id
AND IN bldgcon_contype_id (40181, 10142)
FMG GROUP BY bldgcon_bldg_id),
Citi.floors, fl,
Citi.Room rm,
Citi.general_ledger gl,
the Citi.legal_entity
Citi.cost_center_codes cc,
Citi.Equipment eqp,
Citi.workType woty,
Citi.subworktype swoty,
Citi.work_order wo,
Jtwo Citi.jt_workers,
Citi.Priority,
Ctry Citi.Country,
Citi.People p1,
Citi.People peo3,
Citi.People peo1,
Citi.City peocity,
Citi.Currency peocur
WHERE jt.jt_bldg_id = bl.bldg_id
AND bl.bldg_id = bldglvl.bldg_levels_bldg_id
AND bldglvl.bldg_levels_levels_id = lev.levels_id
AND lev.levels_parent = par.levels_id (+)
AND prop.property_id = bl.bldg_property_id
AND bl.bldg_active_ls <>' n
AND jt.jt_floors_id = fl.floors_id (+)
AND jt.jt_room_id = rm.room_id (+)
AND jt.jt_bldg_id = fmg.bldgcon_bldg_id (+)
AND jt.jt_genled_id = gl.genled_id (+)
AND gl.genled_lglent_id = le.lglent_id (+)
AND jt.jt_cstctrcd_id = cc.cstctrcd_id (+)
AND jt.jt_equip_id = eqp.equip_id (+)
AND jt.jt_id = jtwo.jtw_jt_id (+)
AND jt.jt_worktype_id = woty.worktype_id (+)
AND jt.jt_sworktype_id = swoty.sworktype_id (+)
AND jt.jt_wo_id = wo.wo_id
AND jt.jt_priority_id = priority_id (+)
- AND jt.jt_date_requested > = ADD_MONTHS (SYSDATE,-12)
AND jt.jt_last_update > = ADD_MONTHS (ld_curr_time-12)
AND bl.bldg_country_id = ctry.country_id
AND jtwo.jtw_peo_id = p1.peo_id (+)
AND p1.peo_city_id = peocity.city_id (+)
AND jt.jt_completed_by_peo_id = peo3.peo_id (+)
AND p1.peo_rate_currency_id = peocur.currency_id (+)
AND jt.jt_agent_peo_id = peo1.peo_id (+);
BEGIN
run immediately 'truncate table crstools.drt_bom_work_kiosk;
Select sysdate in double ld_curr_time;
FOR cur_rec in cur_work_kiosk LOOP
IF MOD (cur_work_kiosk % rowcount, 10000) = 0 then
COMMIT;
END IF;
INSERT INTO crstools.drt_bom_work_kiosk
(JT_ID
ACTUAL_HRS_TO_COMPLETE
ACTUAL_HRS_TO_RESPOND
AGENT_NAME
ASAGENT_SOE_ID
AP_SYSTEM
ASSIGN_WORK_REQUEST_COMMENT
BILLABLE
BUILDING
BUILDING_ID
BUILDING_STATUS
CAUSE_TYPE
COMMENTS
COMPLETED_BY
CONTACT_EMAIL
CONTACT_NAME
CONTACT_PHONE
CORP_CODE
COST_CENTER
DATE_CLOSED
DATE_COMPLETED
DATE_REQUESTED
DATE_RESPONDED
DATE_RESPONSE_ECD
DATE_SCHEDULED
DEFERRAL_REASON
DESCRIPTION
DPE
FACILITY_MANAGER
FLOOR
GENERAL_LEDGER
KIOSK_DATE_REQUESTED
KIOSK_DISPATCH_CONFIRMED
KIOSK_DISPATCHED
LINKED_EQUIPMENT_ALIAS
LINKED_EQUIPMENT_ID
LINKED_EQUIPMENT_NAME
ORIGINATOR_TYPE
PAYMENT_TERMS
PRIORITY_CODE
PROBLEM_TYPE
PROPERTY
QUOTE_TOTAL
REGION
REPAIR_DEFINITIONS
MARKED_COR
APPLICANT
REQUESTOR_COST_CENTER
REQUESTOR_EMAIL
REQUESTOR_NAME
REQUESTOR_PHONE
RESPONSE_TIME
ROOM
SERVICE_PROVIDER
SERVICE_PROVIDER_ADDRESS
SERVICE_PROVIDER_CITY
SERVICE_PROVIDER_CODE
SERVICE_PROVIDER_COUNTRY
SERVICE_PROVIDER_CURRENCY
SERVICE_PROVIDER_DESCRIPTION
SERV_PROV_DISPATC_HMETHOD
SERV_PROV_DOUBLE_TIME_RATE
SERVICE_PROVIDER_EMAIL
SERV_PROV_EMERGENCY_PHONE
SERVICE_PROVIDER_FAX_NUMBER
SERVICE_PROVIDER_HOME_PHONE
SERVICE_PROVIDER_HOURLY_RATE
SERVICE_PROVIDER_JOB_TITLE
SERVICE_PROVIDER_METHOD
SERVICE_PROVIDER_MOBILE_PHONE
SERVICE_PROVIDER_PAGER
SERVICE_PROVIDER_RATES
SER_PROV_SHIFT_DIFFERENTIAL
SERV_PROV_STATE_PROVINCE
SERVICE_PROVIDER_STATUS
SERV_PROV_WEB_SITE_ADDRESS
SERVICE_PROVIDER_WORK_PHONE
SERV_PROV_ZIP_POSTAL_CODE
MAJ
SKILLS
STATUS
SUBREGION
TRADE
VENDOR_ID
VENDOR_PURCHASING_FAX
VENDOR_SITECODE
VENDOR_TICKET
VENDOR_COMPANYNAME
VIP
WORK_ORDER_NO
WORK_REQUEST
WORK_REQUEST_CLASS
WORK_TYPE
WR_COST
WR_DESCRIPTION
WR_DISPATCH_METHOD
WR_STATUS
COUNTRY
CREATE_DATE
)
VALUES
(cur_rec.jt_id
cur_rec, ACTUAL_HRS_TO_COMPLETE
cur_rec, ACTUAL_HRS_TO_RESPOND
cur_rec, AGENT_NAME
cur_rec, ASAGENT_SOE_ID
cur_rec, AP_SYSTEM
cur_rec, ASSIGN_WORK_REQUEST_COMMENT
BILLABLE cur_rec.
cur_rec, BUILDING
cur_rec, BUILDING_ID
cur_rec, BUILDING_STATUS
cur_rec, CAUSE_TYPE
cur_rec.COMMENTS
cur_rec.COMPLETED_BY
cur_rec, CONTACT_EMAIL
cur_rec, CONTACT_NAME
cur_rec, CONTACT_PHONE
cur_rec, CORP_CODE
cur_rec, COST_CENTER
cur_rec, DATE_CLOSED
cur_rec, DATE_COMPLETED
cur_rec, DATE_REQUESTED
cur_rec, DATE_RESPONDED
cur_rec, DATE_RESPONSE_ECD
cur_rec, DATE_SCHEDULED
cur_rec, DEFERRAL_REASON
cur_rec, DESCRIPTION
cur_rec, DEVELOPMENT OF THE YOUNG CHILD
cur_rec, FACILITY_MANAGER
cur_rec, FLOOR
cur_rec, GENERAL_LEDGER
cur_rec, KIOSK_DATE_REQUESTED
cur_rec, KIOSK_DISPATCH_CONFIRMED
cur_rec, KIOSK_DISPATCHED
cur_rec, LINKED_EQUIPMENT_ALIAS
cur_rec, LINKED_EQUIPMENT_ID
cur_rec, LINKED_EQUIPMENT_NAME
cur_rec, ORIGINATOR_TYPE
cur_rec, PAYMENT_TERMS
cur_rec, PRIORITY_CODE
cur_rec, PROBLEM_TYPE
cur_rec, PROPERTY
cur_rec, QUOTE_TOTAL
cur_rec, REGION
cur_rec, REPAIR_DEFINITIONS
cur_rec, MARKED_COR
cur_rec, APPLICANT
cur_rec, REQUESTOR_COST_CENTER
cur_rec, REQUESTOR_EMAIL
cur_rec, REQUESTOR_NAME
cur_rec, REQUESTOR_PHONE
cur_rec, RESPONSE_TIME
cur_rec, ROOM
cur_rec, SERVICE_PROVIDER
cur_rec, SERVICE_PROVIDER_ADDRESS
cur_rec, SERVICE_PROVIDER_CITY
cur_rec, SERVICE_PROVIDER_CODE
cur_rec, SERVICE_PROVIDER_COUNTRY
cur_rec, SERVICE_PROVIDER_CURRENCY
cur_rec, SERVICE_PROVIDER_DESCRIPTION
cur_rec, SERV_PROV_DISPATC_HMETHOD
cur_rec, SERV_PROV_DOUBLE_TIME_RATE
cur_rec, SERVICE_PROVIDER_EMAIL
cur_rec, SERV_PROV_EMERGENCY_PHONE
cur_rec, SERVICE_PROVIDER_FAX_NUMBER
cur_rec, SERVICE_PROVIDER_HOME_PHONE
cur_rec, SERVICE_PROVIDER_HOURLY_RATE
cur_rec, SERVICE_PROVIDER_JOB_TITLE
cur_rec, SERVICE_PROVIDER_METHOD
cur_rec, SERVICE_PROVIDER_MOBILE_PHONE
cur_rec, SERVICE_PROVIDER_PAGER
cur_rec, SERVICE_PROVIDER_RATES
cur_rec, SER_PROV_SHIFT_DIFFERENTIAL
cur_rec, SERV_PROV_STATE_PROVINCE
cur_rec, SERVICE_PROVIDER_STATUS
cur_rec, SERV_PROV_WEB_SITE_ADDRESS
cur_rec, SERVICE_PROVIDER_WORK_PHONE
cur_rec, SERV_PROV_ZIP_POSTAL_CODE
cur_rec, UPDATE
cur_rec SKILL.
cur_rec, STATUS
cur_rec subregion.
cur_rec, TRADE
cur_rec, VENDOR_ID
cur_rec, VENDOR_PURCHASING_FAX
cur_rec, VENDOR_SITECODE
cur_rec, VENDOR_TICKET
cur_rec, VENDOR_COMPANYNAME
cur_rec, VIP
cur_rec, WORK_ORDER_NO
cur_rec, WORK_REQUEST
cur_rec, WORK_REQUEST_CLASS
cur_rec, WORK_TYPE
cur_rec, WR_COST
cur_rec, WR_DESCRIPTION
cur_rec, WR_DISPATCH_METHOD
cur_rec, WR_STATUS
cur_rec, COUNTRY
ld_curr_time
);
END LOOP;
COMMIT;
exception
while others then
Rollback;
dbms_output.put_line('SQLCODE:'||) SQLCODE. "Error :'|| SQLERRM);
end work_kiosk_full;
Note: total record inserted 849000.
The same code does not work with big collect in would adopt.
Please help me why this is happening.
Thanks and greetings
Shyam ~.Shyam,
I agree with Billy.
Why are you not using an INSERT..SELECT ? Also, what are you trying to achieve by - incremental commits? - copying data from one table to another (using expensive I/O)? - using dynamic DML? Most of these approaches are typically wrong - and not recommended for scalable and performant Oracle applications.
I could see you using a CURSOR for LOOP if you change the data inserted so that you could not encapsulate the changes in a query, but you do an insert in right in the table of your cursor. A much more effective way would be to use the following changes I made to your code sample:
PROCEDURE WORK_KIOSK_FULL(AN_JOBID IN NUMBER, AC_SQLCODE OUT VARCHAR2, AC_SQLERRM OUT VARCHAR2) IS BEGIN EXECUTE IMMEDIATE 'truncate table crstools.drt_bom_work_kiosk'; /* Note: The APPEND hint forces a Direct Path INSERT (see Link below code sample) and is combined with the NOLOGGING Hint */ /* To dramtically increase performance. The Direct Path INSERT inserts records above the High-Water Mark on the table. */ INSERT /*+ APPEND NOLOGGING */ INTO CRSTOOLS.DRT_BOM_WORK_KIOSK (JT_ID ,ACTUAL_HRS_TO_COMPLETE ,ACTUAL_HRS_TO_RESPOND ,AGENT_NAME ,ASAGENT_SOE_ID ,AP_SYSTEM -- ,ASSIGN_WORK_REQUEST_COMMENT /* I commented out this COLUMN because it doesn't make sense to me to insert */ ,BILLABLE /* a couple of space characters into a table. If the intent is to leave the column NULL */ ,BUILDING /* don't include it in your INSERT statement and it will be NULL. If there is a valid reason */ ,BUILDING_ID /* for inserting the spaces, then remove the "line comments" from the insert and select statments */ ,BUILDING_STATUS ,CAUSE_TYPE -- ,COMMENTS ,COMPLETED_BY ,CONTACT_EMAIL ,CONTACT_NAME ,CONTACT_PHONE ,CORP_CODE ,COST_CENTER ,DATE_CLOSED ,DATE_COMPLETED ,DATE_REQUESTED ,DATE_RESPONDED ,DATE_RESPONSE_ECD ,DATE_SCHEDULED ,DEFERRAL_REASON ,DESCRIPTION ,ECD ,FACILITY_MANAGER ,FLOOR ,GENERAL_LEDGER -- ,KIOSK_DATE_REQUESTED -- ,KIOSK_DISPATCH_CONFIRMED -- ,KIOSK_DISPATCHED ,LINKED_EQUIPMENT_ALIAS ,LINKED_EQUIPMENT_ID ,LINKED_EQUIPMENT_NAME ,ORIGINATOR_TYPE -- ,PAYMENT_TERMS ,PRIORITY_CODE ,PROBLEM_TYPE ,PROPERTY ,QUOTE_TOTAL ,REGION ,REPAIR_DEFINITIONS ,REPAIR_DESCRIPTION ,REQUESTOR -- ,REQUESTOR_COST_CENTER ,REQUESTOR_EMAIL ,REQUESTOR_NAME ,REQUESTOR_PHONE -- ,RESPONSE_TIME ,ROOM ,SERVICE_PROVIDER ,SERVICE_PROVIDER_ADDRESS ,SERVICE_PROVIDER_CITY ,SERVICE_PROVIDER_CODE ,SERVICE_PROVIDER_COUNTRY ,SERVICE_PROVIDER_CURRENCY ,SERVICE_PROVIDER_DESCRIPTION ,SERV_PROV_DISPATC_HMETHOD ,SERV_PROV_DOUBLE_TIME_RATE ,SERVICE_PROVIDER_EMAIL ,SERV_PROV_EMERGENCY_PHONE ,SERVICE_PROVIDER_FAX_NUMBER ,SERVICE_PROVIDER_HOME_PHONE ,SERVICE_PROVIDER_HOURLY_RATE ,SERVICE_PROVIDER_JOB_TITLE ,SERVICE_PROVIDER_METHOD ,SERVICE_PROVIDER_MOBILE_PHONE ,SERVICE_PROVIDER_PAGER ,SERVICE_PROVIDER_RATES ,SER_PROV_SHIFT_DIFFERENTIAL ,SERV_PROV_STATE_PROVINCE ,SERVICE_PROVIDER_STATUS ,SERV_PROV_WEB_SITE_ADDRESS ,SERVICE_PROVIDER_WORK_PHONE ,SERV_PROV_ZIP_POSTAL_CODE -- ,SHIFT -- ,SKILL ,STATUS ,SUBREGION -- ,TRADE ,VENDOR_ID ,VENDOR_PURCHASING_FAX ,VENDOR_SITECODE ,VENDOR_TICKET ,VENDOR_COMPANYNAME ,VIP ,WORK_ORDER_NO ,WORK_REQUEST ,WORK_REQUEST_CLASS ,WORK_TYPE -- ,WR_COST ,WR_DESCRIPTION -- ,WR_DISPATCH_METHOD ,WR_STATUS ,COUNTRY ,CREATE_DATE ) VALUES (SELECT DISTINCT JT.JT_ID AS JT_ID ,NVL((ROUND((JT_DATE_COMPLETED - JT_DATE_REQUESTED) * 24,2)),0) AS ACTUAL_HRS_TO_COMPLETE ,NVL((ROUND((JT_DATE_RESPONDED - JT_DATE_REQUESTED) * 24,2)),0) AS ACTUAL_HRS_TO_RESPOND ,PEO1.PEO_NAME AS AGENT_NAME ,PEO1.PEO_USER_NAME AS ASAGENT_SOE_ID ,LE.LGLENT_DESC AS AP_SYSTEM -- ,' ' AS ASSIGN_WORK_REQUEST_COMMENT ,DECODE(JT.JT_BILL_ID,138802,'CLIENT BILLABLE' ,138803,'CONTRACTED' ,138804,'INTERNAL BILLABLE',NULL,' ') AS BILLABLE ,BL.BLDG_NAME_CC AS BUILDING ,BL.BLDG_ID_LS AS BUILDING_ID ,DECODE(BL.BLDG_ACTIVE_CC, 'Y', 'ACTIVE', 'INACTIVE') AS BUILDING_STATUS ,DECODE(JT.JT_WRK_CAUSE_ID,141521,'STANDARD WEAR AND TEAR' ,141522,'NEGLIGENCE' ,141523,'ACCIDENTAL' ,141524,'MECHANICAL MALFUNCTION' ,141525,'OVERSIGHT' ,141526,'VANDAL' ,141527,'STANDARD' ,141528,'PROJECT WORK' ,6058229,'TEST',NULL,' ') AS CAUSE_TYPE -- ,' ' AS COMMENTS ,PEO3.PEO_NAME AS COMPLETED_BY ,JT.JT_REQUESTOR_EMAIL AS CONTACT_EMAIL ,JT.JT_REQUESTOR_NAME_FIRST || ' ' ||JT.JT_REQUESTOR_NAME_LAST AS CONTACT_NAME ,JT.JT_REQUESTOR_PHONE AS CONTACT_PHONE ,CC.CSTCTRCD_APCODE AS CORP_CODE ,CC.CSTCTRCD_CODE AS COST_CENTER ,JT.JT_DATE_CLOSED AS DATE_CLOSED ,JT.JT_DATE_COMPLETED AS DATE_COMPLETED ,JT.JT_DATE_REQUESTED AS DATE_REQUESTED ,JT.JT_DATE_RESPONDED AS DATE_RESPONDED ,JT.JT_DATE_RESPONSE_ECD AS DATE_RESPONSE_ECD ,JT.JT_DATE_SCHEDULED AS DATE_SCHEDULED ,DECODE(JT.JT_DEF_ID,139949,'WTG VENDOR RESPONSE' ,139950,'WAITING ON PARTS' ,139951,'LABOR AVAILABILITY' ,139952,'DEFERRED- HI PRI WORK' ,139953,'WTG APPROVAL' ,139954,'FUNDING REQUIRED' ,139955,'ACCESS DENIED' ,139956,'WTG MATERIAL',NULL,' ') AS DEFERRAL_REASON ,JT.JT_DESCRIPTION AS DESCRIPTION ,JT.JT_DATE_RESCHED_ECD AS ECD ,FMG.FACILITY_MANAGER AS FACILITY_MANAGER ,FL.FLOORS_TEXT AS FLOOR ,GL.GENLED_DESC AS GENERAL_LEDGER -- ,' ' AS KIOSK_DATE_REQUESTED -- ,' ' AS KIOSK_DISPATCH_CONFIRMED -- ,' ' AS KIOSK_DISPATCHED ,EQP.EQUIP_CUSTOMER_CODE AS LINKED_EQUIPMENT_ALIAS ,EQP.EQUIP_ID AS LINKED_EQUIPMENT_ID ,EQP.EQUIP_TEXT AS LINKED_EQUIPMENT_NAME ,DECODE(JT_ORIGINATOR_TYPE_ID,1000,'PROJECT MOVE REQUEST' ,138834,'CUSTOMER INITIATED CORRECTION' ,138835,'CUSTOMER INITIATED REQUEST' ,138836,'CORRECTIVE MAINTENANCE' ,138837,'CONFERENCE ROOM BOOKING' ,138838,'PROJECT INITIATED REQUEST' ,138839,'PLANNED PREVENTIVE MAINTENANCE' ,138840,'SELF INITATED REQUEST',NULL,' ') AS ORIGINATOR_TYPE -- ,' ' AS PAYMENT_TERMS ,PRIORITY_TEXT AS PRIORITY_CODE ,SWOTY.SWORKTYPE_TEXT AS PROBLEM_TYPE ,PROP.PROPERTY_NAME_CC AS PROPERTY ,JT.JT_COST_QUOTE_TOTAL AS QUOTE_TOTAL ,PAR.LEVELS_NAME AS REGION ,DECODE(JT.JT_REPDEF_ID,141534,'ADJUSTED SETTING' ,141535,'TRAINING FOR END' ,141536,'NEW REQUEST' ,141537,'NO REPAIR REQUIR' ,141538,'REPLACED PARTS' ,141539,'REPLACE EQUIPMEN' ,1000699,'NEW REQUEST',NULL,' ') AS REPAIR_DEFINITIONS ,JT.JT_REPAIRDESC AS REPAIR_DESCRIPTION ,JT.JT_REQUESTOR AS REQUESTOR -- ,' ' AS REQUESTOR_COST_CENTER ,JT.JT_REQUESTOR_EMAIL AS REQUESTOR_EMAIL ,JT.JT_REQUESTOR_NAME_FIRST AS REQUESTOR_NAME ,JT.JT_REQUESTOR_PHONE AS REQUESTOR_PHONE -- ,' ' AS RESPONSE_TIME ,RM.ROOM_NAME_CC AS ROOM ,P1.PEO_PROVIDER_CODE1 AS SERVICE_PROVIDER ,P1.PEO_ADDRESS_1 AS SERVICE_PROVIDER_ADDRESS ,PEOCITY.CITY_TEXT SERVICE_PROVIDER_CITY ,P1.PEO_PROVIDER_CODE1 AS SERVICE_PROVIDER_CODE ,PEOCITY.CITY_COUNTRY_NAME AS SERVICE_PROVIDER_COUNTRY ,PEOCUR.CURRENCY_TEXT AS SERVICE_PROVIDER_CURRENCY ,P1.PEO_NAME AS SERVICE_PROVIDER_DESCRIPTION ,P1.PEO_DISPATCH_METHOD AS SERV_PROV_DISPATC_HMETHOD ,P1.PEO_RATE_DOUBLE AS SERV_PROV_DOUBLE_TIME_RATE ,P1.PEO_EMAIL AS SERVICE_PROVIDER_EMAIL ,P1.PEO_EMERGENCY_PHONE AS SERV_PROV_EMERGENCY_PHONE ,P1.PEO_FAX AS SERVICE_PROVIDER_FAX_NUMBER ,P1.PEO_HOME_PHONE AS SERVICE_PROVIDER_HOME_PHONE ,P1.PEO_RATE_HOURLY AS SERVICE_PROVIDER_HOURLY_RATE ,P1.PEO_TITLE AS SERVICE_PROVIDER_JOB_TITLE ,P1.PEO_METHOD_ID AS SERVICE_PROVIDER_METHOD ,P1.PEO_CELL_PHONE AS SERVICE_PROVIDER_MOBILE_PHONE ,P1.PEO_PAGER AS SERVICE_PROVIDER_PAGER ,P1.PEO_RATE_DIFFERENTIAL AS SERVICE_PROVIDER_RATES ,P1.PEO_RATE_DIFFERENTIAL AS SER_PROV_SHIFT_DIFFERENTIAL ,PEOCITY.CITY_STATE_PROV_TEXT AS SERV_PROV_STATE_PROVINCE ,DECODE(P1.PEO_ACTIVE, 'Y', 'ACTIVE', 'INACTIVE') AS SERVICE_PROVIDER_STATUS ,P1.PEO_URL AS SERV_PROV_WEB_SITE_ADDRESS ,P1.PEO_PHONE AS SERVICE_PROVIDER_WORK_PHONE ,P1.PEO_POSTAL_CODE AS SERV_PROV_ZIP_POSTAL_CODE -- ,' ' AS SHIFT -- ,' ' AS SKILL ,DECODE(JT.JT_BIGSTATUS_ID,138813,'NEW' ,138814,'PENDING' ,138815,'OPEN' ,138816,'COMPLETED' ,138817,'CLOSED' ,138818,'CANCELLED',NULL,' ') AS STATUS ,LEV.LEVELS_NAME AS SUBREGION -- ,' ' AS TRADE ,P1.PEO_LS_INTERFACE_CODE1 AS VENDOR_ID ,P1.PEO_FAX AS VENDOR_PURCHASING_FAX ,P1.PEO_VENDOR_SITE_CODE AS VENDOR_SITECODE ,JT.JT_ID AS VENDOR_TICKET ,P1.PEO_NAME AS VENDOR_COMPANYNAME ,JT.JT_REQUESTOR_VIP AS VIP ,WO.WO_ID AS WORK_ORDER_NO ,JT.JT_ID AS WORK_REQUEST ,JT.JT_CLASS_ID AS WORK_REQUEST_CLASS ,WOTY.WORKTYPE_TEXT AS WORK_TYPE -- ,' ' AS WR_COST ,JT.JT_DESCRIPTION AS WR_DESCRIPTION -- ,' ' AS WR_DISPATCH_METHOD ,DECODE(JT.JT_BIGSTATUS_ID,138813,'NEW' ,138814,'PENDING' ,138815,'OPEN' ,138816,'COMPLETED' ,138817,'CLOSED' ,138818,'CANCELLED',NULL,' ') AS WR_STATUS ,CTRY.COUNTRY_NAME AS COUNTRY ,SYSDATE --LD_CURR_TIME FROM CITI.JOBTICKET JT, CITI.PROPERTY PROP, CITI.BLDG BL, CITI.BLDG_LEVELS BLDGLVL, CITI.LEVELS LEV, CITI.LEVELS PAR, (SELECT CRSTOOLS.STRAGG(PEO_NAME) FACILITY_MANAGER, BLDGCON_BLDG_ID FROM CITI.BLDG_CONTACTS, CITI.PEOPLE WHERE BLDGCON_PEO_ID = PEO_ID AND BLDGCON_CONTYPE_ID IN (40181, 10142) GROUP BY BLDGCON_BLDG_ID) FMG, CITI.FLOORS FL, CITI.ROOM RM, CITI.GENERAL_LEDGER GL, CITI.LEGAL_ENTITY LE, CITI.COST_CENTER_CODES CC, CITI.EQUIPMENT EQP, CITI.WORKTYPE WOTY, CITI.SUBWORKTYPE SWOTY, CITI.WORK_ORDER WO, CITI.JT_WORKERS JTWO, CITI.PRIORITY, CITI.COUNTRY CTRY, CITI.PEOPLE P1, CITI.PEOPLE PEO3, CITI.PEOPLE PEO1, CITI.CITY PEOCITY, CITI.CURRENCY PEOCUR WHERE JT.JT_BLDG_ID = BL.BLDG_ID AND BL.BLDG_ID = BLDGLVL.BLDG_LEVELS_BLDG_ID AND BLDGLVL.BLDG_LEVELS_LEVELS_ID = LEV.LEVELS_ID AND LEV.LEVELS_PARENT = PAR.LEVELS_ID(+) AND PROP.PROPERTY_ID = BL.BLDG_PROPERTY_ID AND BL.BLDG_ACTIVE_LS = 'N' AND JT.JT_FLOORS_ID = FL.FLOORS_ID(+) AND JT.JT_ROOM_ID = RM.ROOM_ID(+) AND JT.JT_BLDG_ID = FMG.BLDGCON_BLDG_ID(+) AND JT.JT_GENLED_ID = GL.GENLED_ID(+) AND GL.GENLED_LGLENT_ID = LE.LGLENT_ID(+) AND JT.JT_CSTCTRCD_ID = CC.CSTCTRCD_ID(+) AND JT.JT_EQUIP_ID = EQP.EQUIP_ID(+) AND JT.JT_ID = JTWO.JTW_JT_ID(+) AND JT.JT_WORKTYPE_ID = WOTY.WORKTYPE_ID(+) AND JT.JT_SWORKTYPE_ID = SWOTY.SWORKTYPE_ID(+) AND JT.JT_WO_ID = WO.WO_ID AND JT.JT_PRIORITY_ID = PRIORITY_ID(+) --AND jt.jt_date_requested >= ADD_MONTHS (SYSDATE, -12) AND JT.JT_LAST_UPDATE >= ADD_MONTHS(LD_CURR_TIME, -12) AND BL.BLDG_COUNTRY_ID = CTRY.COUNTRY_ID AND JTWO.JTW_PEO_ID = P1.PEO_ID(+) AND P1.PEO_CITY_ID = PEOCITY.CITY_ID(+) AND JT.JT_COMPLETED_BY_PEO_ID = PEO3.PEO_ID(+) AND P1.PEO_RATE_CURRENCY_ID = PEOCUR.CURRENCY_ID(+) AND JT.JT_AGENT_PEO_ID = PEO1.PEO_ID(+) ); COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; DBMS_OUTPUT.PUT_LINE('SQLCODE :' || SQLCODE || ' Error :' || SQLERRM); END WORK_KIOSK_FULL;
Here is the link for infor the [Oracle Direct - Path INSERT | http://download.oracle.com/docs/cd/B10501_01/server.920/a96524/c21dlins.htm#10778].
Also, if you are really wanting to use a CURSOR for LOOP COLLECTION in BULK, I suggest you read the article by Steven Feuerstein [PL/SQL practices: GEM VRAC | http://www.oracle.com/technology/oramag/oracle/08-mar/o28plsql.html].
I hope this helps.
Craig...If my response or response from another person was helpful, please mark accordingly
-
Hi all
I want to know if using bulk collect into limit will help to avoid the TEMP tablespace error run out.
We use Oracle 11 g R1.
I am assigned to a task of creating journal facilitated for all tables in a query of the APEX.
I create procedures to execute some sql statements to create a DEC (Create table select), and then fires on these tables.
We have about three tables with more than 26 million records.
It seems very well running until we reached a table with more than 15 million record, we got an error says that Miss tablespace TEMP.
I googled on this topic and retrieve the tips:
Use NO LOG
Parallel use
BULK COLLECT INTO limited
However, the questions for those above usually short-term memory rather than running out of TEMPORARY tablespace.
I'm just a junior developer and does not have dealed with table more than 10 million documents at a time like this before.
The database support is outsourced. If we try to keep it as minimal contact with the DBA as possible. My Manager asked me to find a solution without asking the administrator to extend the TEMP tablespace.
I wrote a few BULK COLLECT INTO to insert about 300,000 like once on the development environment. It seems.
But the code works only against a 000 4000 table of records. I am trying to add more data into the Test table, but yet again, we lack the tablespace on DEV (this time, it's a step a TEMP data)
I'll give it a go against the table of 26 million records on the Production of this weekend. I just want to know if it is worth trying.
Thanks for reading this.
Ann
I really need check that you did not have the sizes of huge line (like several K by rank), they are not too bad at all, which is good!
A good rule of thumb to maximize the amount of limit clause, is to see how much memory you can afford to consume in the PGA (to avoid the number of calls to the extraction and forall section and therefore the context switches) and adjust the limit to be as close to that amount as possible.
Use the routines below to check at what threshold value would be better suited for your system because it depends on your memory allocation and CPU consumption. Flexibility, based on your limits of PGA, as lines of length vary, but this method will get a good order of magnitude.
CREATE OR REPLACE PROCEDURE show_pga_memory (context_in IN VARCHAR2 DEFAULT NULL)
IS
l_memory NUMBER;
BEGIN
SELECT st. VALUE
IN l_memory
SYS.v_$ session se, SYS.v_$ sesstat st, SYS.v_$ statname nm
WHERE se.audsid = USERENV ('SESSIONID')
AND st.statistic # nm.statistic = #.
AND themselves. SID = st. SID
AND nm.NAME = 'pga session in memory. "
Dbms_output.put_line (CASE
WHEN context_in IS NULL
THEN NULL
ELSE context_in | ' - '
END
|| 'Used in the session PGA memory ='
|| To_char (l_memory)
);
END show_pga_memory;
DECLARE
PROCEDURE fetch_all_rows (limit_in IN PLS_INTEGER)
IS
CURSOR source_cur
IS
SELECT *.
FROM YOUR_TABLE;
TYPE source_aat IS TABLE OF source_cur % ROWTYPE
INDEX BY PLS_INTEGER;
l_source source_aat;
l_start PLS_INTEGER;
l_end PLS_INTEGER;
BEGIN
DBMS_SESSION.free_unused_user_memory;
show_pga_memory (limit_in |) "- BEFORE"); "."
l_start: = DBMS_UTILITY.get_cpu_time;
OPEN source_cur.
LOOP
EXTRACTION source_cur
LOOSE COLLECTION l_source LIMITED limit_in;
WHEN l_source EXIT. COUNT = 0;
END LOOP;
CLOSE Source_cur;
l_end: = DBMS_UTILITY.get_cpu_time;
Dbms_output.put_line (' elapsed time CPU for limit of ')
|| limit_in
|| ' = '
|| To_char (l_end - l_start)
);
show_pga_memory (limit_in |) "- AFTER");
END fetch_all_rows;
BEGIN
fetch_all_rows (20000);
fetch_all_rows (40000);
fetch_all_rows (60000);
fetch_all_rows (80000);
fetch_all_rows (100000);
fetch_all_rows (150000);
fetch_all_rows (250000);
-etc.
END;
-
Hello
I have a pl/sql block, it will work, but runs for 10 hours, could help you modify using "bulk collect?
(I've tried, but still had errors... so I want to see how other friends can modify with success).
Thank you, happy Thanksgiving!
-It's original screenplay:
DECLARE
CURSOR C_CURSOR IS SELECT * FROM MF_S224_RPT WHERE UIDY_LO IS NOT NULL AND PATN_LIST IS NOT NULL;
V_DEF_DATA C_CURSOR % ROWTYPE;
str_new_uidy_lo VARCHAR2 (255);
CURSOR C_CURSOR_LN IS SELECT * FROM MF_S224_RPT_LN WHERE UIDY_LO IS NOT NULL;
V_DEF_DATA_LN C_CURSOR_LN % ROWTYPE;
str_new_uidy_lo_ln VARCHAR2 (255);
BEGIN
C_CURSOR OPEN;
EXTRACT THE C_CURSOR IN V_DEF_DATA;
C_CURSOR % LOOP WHILE
str_new_uidy_lo: = (' & 6084 &'|) V_DEF_DATA. FISC_YEAR | ' &' | V_DEF_DATA. FISC_MNTH | ' &' | V_DEF_DATA. VR | ' &' | V_DEF_DATA. BENEFITS | ' &' | V_DEF_DATA. PATN_LIST | ' &' | V_DEF_DATA. (SLA);
UPDATE T1 SET T1 MF_S224_RPT. UIDY_LO is str_new_uidy_lo WHERE T1. UIDY_LO = V_DEF_DATA. UIDY_LO;
UPDATE T2 T2 SET MF_S224_RPT_LN. PRPT_ID_LO is str_new_uidy_lo WHERE T2. PRPT_ID_LO = V_DEF_DATA. UIDY_LO;
UPDATE MF_S224_RPT_ACT T5 T5 SET. PRPT_ID_LO is str_new_uidy_lo WHERE T5. PRPT_ID_LO = V_DEF_DATA. UIDY_LO;
EXTRACT THE C_CURSOR IN V_DEF_DATA;
END LOOP;
CLOSE C_CURSOR;
C_CURSOR_LN OPEN;
EXTRACT THE C_CURSOR_LN IN V_DEF_DATA_LN;
C_CURSOR_LN % LOOP WHILE
str_new_uidy_lo_ln: = ('& 6085' |) SUBSTR (V_DEF_DATA_LN. PRPT_ID_LO, 6). ' &' | V_DEF_DATA_LN. TSYM | ' &' | V_DEF_DATA_LN. GLAC | ' &' | V_DEF_DATA_LN. ACMP_YEAR | ' &' | V_DEF_DATA_LN. ACMP_MNTH | ' &' | V_DEF_DATA_LN. RCPT_DISB_IN | ' &' | V_DEF_DATA_LN. PATN);
UPDATE MF_S224_RPT_LN SET T3 T3. UIDY_LO is str_new_uidy_lo_ln WHERE T3. UIDY_LO = V_DEF_DATA_LN. UIDY_LO;
UPDATE MF_S224_RPT_ACT SET T4 T4. PRPT_LINE_ID_LO is str_new_uidy_lo_ln WHERE T4. PRPT_LINE_ID_LO = V_DEF_DATA_LN. UIDY_LO;
EXTRACT THE C_CURSOR_LN IN V_DEF_DATA_LN;
END LOOP;
CLOSE C_CURSOR_LN;
END;
/
This should be a lot faster:
declare
type of TRec's record)
OLD_UIDY_LO MF_S224_RPT. UIDY_LO % TYPE,
NEW_UIDY_LO MF_S224_RPT. TYPE % UIDY_LO
);
type TRecList is table of the TRec;
vRecList TRecList;
Start
Select UIDY_LO,
"& 6084 &' | FISC_YEAR | » &'|| FISC_MNTH | » &'|| VR | » &'|| BENEFITS | » &'|| PATN_LIST | » &'|| SLA
bulk collect into vRecList
of MF_S224_RPT
where UIDY_LO is not null and
PATN_LIST is not null;
ForAll i in vRecList.First... vRecList.Last
Update MF_S224_RPT T1
the T1 value. UIDY_LO = vRecList (i). NEW_UIDY_LO
where T1. UIDY_LO = vRecList (i). OLD_UIDY_LO;
ForAll i in vRecList.First... vRecList.Last
MF_S224_RPT_LN T2 update
the value of T2. PRPT_ID_LO = vRecList (i). NEW_UIDY_LO
where T2. PRPT_ID_LO = vRecList (i). OLD_UIDY_LO;
ForAll i in vRecList.First... vRecList.Last
Update MF_S224_RPT_ACT T5
SET T5. PRPT_ID_LO = vRecList (i). NEW_UIDY_LO
where T5. PRPT_ID_LO = vRecList (i). OLD_UIDY_LO;
-------------
Select UIDY_LO,
("& 6085' | ') SUBSTR (PRPT_ID_LO, 6). » &'|| TSYM | » &'|| GLAC | » &'|| ACMP_YEAR | » &'|| ACMP_MNTH | » &'|| RCPT_DISB_IN | » &'|| PATN)
bulk collect into vRecList
of MF_S224_RPT_LN
where UIDY_LO is not null;
ForAll i in vRecList.First... vRecList.Last
MF_S224_RPT_LN T3 update
Set the T3. UIDY_LO = vRecList (i). NEW_UIDY_LO
where T3. UIDY_LO = vRecList (i). OLD_UIDY_LO;
ForAll i in vRecList.First... vRecList.Last
Update MF_S224_RPT_ACT T4
Set the T4. PRPT_LINE_ID_LO = vRecList (i). NEW_UIDY_LO
where T4. PRPT_LINE_ID_LO = vRecList (i). OLD_UIDY_LO;
end;
/
-
Bulk collect using some different column insert a table
Hi all
I gave an example of emp table in my original 100 million table record are I need to change group (IE deptno) 10 to 20 copy the same records
about these codes, I get exception
ORA-06550: line 11, column 53:
PLS-00386: concordance that is 'EMP_TAB' between FETCH cursor and IN variables of type
can help me please for these
declare
type row_tab is table emp % rowtype
INDEX BY PLS_INTEGER;
emp_tab row_tab;
cursor cur_emp is select ENAME, 20 DEPTNO, HIREDATE, emp COMM EMPNO;
Start
Open cur_emp;
loop
Cur_emp fetch bulk collect in the limit emp_tab 2000;
ForAll i in 1.emp_tab. COUNTY
Insert / * + APPEND * / into emp (EMPNO, ENAME, DEPTNO, HIREDATE, COMM)
values (emp_tab (i). EMPNO, emp_tab (i). Ename, emp_tab (i). DEPTNO, emp_tab (i). HIREDATE, emp_tab (i). COMM.) ;
When the output cur_emp % notfound;
END LOOP;
close cur_emp;
end;
/
Thank you
VSM
I use the user define the type of record to over come error
declare
type emp_rt is record (empno, ename emp.ename%type,deptno NUMBER (2) emp.empno%type, hiredate emp.hiredate%type,comm emp.comm%type);
TYPE row_type IS the emp_rt INDEX TABLE OF pls_integer;
emp_tab row_type;
cursor cur_emp is select empno, ename, 20 deptno, hiredate, comm from emp where deptno = 10;
Start
Open cur_emp;
loop
Cur_emp fetch bulk collect in the emp_tab limit 2;
ForAll i in 1.emp_tab. COUNTY
Insert / * + APPEND * / into EMP (EMPNO, ENAME, DEPTNO, HIREDATE, COMM)
values (emp_tab (i). EMPNO, emp_tab (i). ENAME, emp_tab (i). DEPTNO, emp_tab (i). HIREDATE, emp_tab (i). COMM.)
;
When the output cur_emp % notfound;
END LOOP;
close cur_emp;
end;
/
records are successful inserted, I do not know is not the right approach for 100 million documents?
Thank you
VM
-
change a pl/sql block using "bulk collect.
Hello
I have a pl/sql block, short it slows...
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
BEGIN
FOR T IN CURUPDATE1
LOOP
UPDATE MF_TJ
THE MF_TJ VALUE. LINE_TYP = "NR."
WHERE MF_TJ. UID_LO = T.UID_LO;
UPDATE MF_AJ
THE MF_AJ VALUE. LINE_TYP = "NR."
WHERE MF_AJ. TJ_UID_LO = T.UID_LO;
END LOOP;
END;
/
now I change to use bulk collect, but I split it into two pl/sql blocks (each for an update)
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
TYPE of recs_type IS the TABLE OF CURUPDATE1% ROWTYPE directory INDEX;
REB recs_type;
BEGIN
CURUPDATE1 OPEN;
Go SEARCH the CURUPDATE1 COLLECT in BULK IN REB 8000 limit;
CLOSE CURUPDATE1;
FORALL i IN 1.recs. COUNTY
UPDATE MF_TJ
THE MF_TJ VALUE. LINE_TYP = "NR."
WHERE MF_TJ. UID_LO = (i) recs. UID_LO;-END;
/
DECLARE
CURSOR CURUPDATE1 IS
SELECT MF_TJ. UID_LO
OF MF_TJ
WHERE MF_TJ. DTYP (SELECT CD
OF MF_DOC_TYPE
WHERE MF_DOC_TYPE. DTYP_CAT = 'xx')
AND MF_TJ. LINE_TYP IS SET TO NULL;
TYPE of recs_type IS the TABLE OF CURUPDATE1% ROWTYPE directory INDEX;
REB recs_type;
BEGIN
CURUPDATE1 OPEN;
Go SEARCH the CURUPDATE1 COLLECT in BULK IN REB 8000 limit;
CLOSE CURUPDATE1;
FORALL i IN 1.recs. COUNTY
UPDATE MF_AJ
THE MF_AJ VALUE. LINE_TYP = "NR."
WHERE MF_AJ. TJ_UID_LO = (i) recs. UID_LO;-
END;
/Is there a way I can just use pl/sql block using bulk collect?
Thank you very much
Hi 5181139
As Paulzip and Jarkko Turpeinen have pointed out, you could do it using only SQL...
This is a course using COLLECT in BULK:
DECLARE blimit CONSTANT PLS_INTEGER := 500; CURSOR curupdate1 IS SELECT MF_TJ.UID_LO FROM MF_TJ WHERE MF_TJ.DTYP IN (SELECT CD FROM MF_DOC_TYPE WHERE MF_DOC_TYPE.DTYP_CAT = 'xx') AND MF_TJ.LINE_TYP IS NULL; TYPE c_arr IS TABLE OF curupdate1%ROWTYPE; c_rows c_arr; BEGIN OPEN curupdate1; LOOP FETCH curupdate1 BULK COLLECT INTO c_rows LIMIT blimit; FORALL i IN c_rows.FIRST..c_rows.LAST UPDATE MF_TJ SET MF_TJ.LINE_TYP = 'NR' WHERE MF_TJ.UID_LO = c_rows(i).uid_lo; FORALL i IN c_rows.FIRST..c_rows.LAST UPDATE MF_AJ SET MF_AJ.LINE_TYP = 'NR' WHERE MF_AJ.TJ_UID_LO = c_rows(i).uid_lo; EXIT WHEN c_rows.COUNT < blimit; END LOOP; CLOSE curupdate1; END;
See you soon,.
Gas
-
iHi.
Declare cursor c_1 is select col1,col2,col3,col4 from table1 type t_type is table of c_1%rowtype index by binary_integer; v_data t_type; BEGIN OPEN c_1; LOOP FETCH c_1 BULK COLLECT INTO v_data LIMIT 200; EXIT WHEN v_data.COUNT = 0; FORALL i IN v_data.FIRST .. v_data.LAST INSERT INTO xxc_table (col1, col3, col4 ) SELECT v_data (i).col1, v_data (i).col3, v_data (i).col4 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM xxc_table a WHERE col1=col1 ..... ); --commit; INSERT INTO xxc_table1 (col1, col2, col3, col4 ) SELECT v_data (i).col1, v_data (i).col2, v_data (i).col3, 'Y' FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM xxc_table1 a WHERE col1=col1 ..... ); --exit when c_1%notfound; END LOOP; CLOSE c_1; commit; END;
I get 40/28-PLS-00201: identifier 'I' must be declared what the problem in the above code please help me and I have lakhs of data
Thank you
Post edited by: Rajesh123 I changed IDX
Post edited by: Rajesh123 changed t_type c_1 in Fetch
But by using a SET of INSERT to insert into two tables at once in the same query would do the job without any collection of bulk of PL and avoid to query two times too.
for example, as a single INSERT...
SQL > create table table1 as
2. Select 1 as col1, col2 of 1, 1 as col3, 1 as col4 Union double all the
3 select 2,2,2,2 of all the double union
4 Select 3,3,3,3 Union double all the
5 Select 4,4,4,4 of all the double union
6 select 5,5,5,5 of all the double union
7 select 6,6,6,6 of all the double union
8 select 7,7,7,7 of all the double union
9 select 8,8,8,8 of all the double union
10. Select 9,9,9,9 to the Union double all the
11. Select double 10,10,10,10
12.Table created.
SQL > create table xxc_table like
2. Select 1 as col1, col3 2, 3 as col4 Union double all the
3. Select the 3, 4, 5 Union double all the
4. Select the 5, 6, 7 double
5.Table created.
SQL > create table xxc_table1 like
2. Select 3 as col1, col2, col3, 5 4 "n" as col4 Union double all the
3. Select the 6, 7, 8, double "n"
4.Table created.
SQL > insert all
2 when the xt_insert is null then
3 in xxc_table (col1, col3, col4)
4 values (col1, col3, col4)
5 when the xt1_insert is null then
6 in xxc_table1 (col1, col2, col3, col4)
7 values (col1, col2, col3, 'Y')
8. Select t1.col1 t1.col2, t1.col3, t1.col4
9, xt.col1 as xt_insert
10, xt1.col1 as xt1_insert
11 from table1 t1
12 left join external xxc_table xt (t1.col1 = xt.col1)
13 left xt1 xxc_table1 outer join (t1.col1 = xt1.col1)
14.15 rows created.
SQL > select * from xxc_table by 1.
COL1 COL3 COL4
---------- ---------- ----------
1 2 3
2 2 2
3 4 5
4 4 4
5 6 7
6 6 6
7 7 7
8 8 8
9 9 9
10-10-1010 selected lines.
SQL > select * from xxc_table1 by 1.
COL1 COL2 COL3 C
---------- ---------- ---------- -
1 1 1 Y
2 2 2 Y
3 4 5 N
4 4 4 Y
5 5 5 Y
6 7 8 N
7 7 7 Y
8 8 8 Y
9 9 9 Y
10-10-1010 selected lines.
SQL >
-
Bulk collect / forall type what collection?
Hi I am trying to speed up the query below using bulk collect / forall:
SELECT h.cust_order_no AS custord, l.shipment_set AS Tess
Info.tlp_out_messaging_hdr h, info.tlp_out_messaging_lin l
WHERE h.message_id = l.message_id
AND h.contract = '12384'
AND l.shipment_set IS NOT NULL
AND h.cust_order_no IS NOT NULL
H.cust_order_no GROUP, l.shipment_setI would like to get the 2 selected fields above in a new table as quickly as possible, but I'm pretty new to Oracle and I find it hard to sort out the best way to do it. The query below is not working (no doubt there are many issues), but I hope that's sufficiently developed, shows the sort of thing, I am trying to achieve:
DECLARE
TYPE xcustord IS TABLE OF THE info.tlp_out_messaging_hdr.cust_order_no%TYPE;
TYPE xsset IS TABLE OF THE info.tlp_out_messaging_lin.shipment_set%TYPE;
TYPE xarray IS the TABLE OF tp_a1_tab % rowtype INDEX DIRECTORY.
v_xarray xarray;
v_xcustord xcustord;
v_xsset xsset;
CUR CURSOR IS
SELECT h.cust_order_no AS custord, l.shipment_set AS Tess
Info.tlp_out_messaging_hdr h, info.tlp_out_messaging_lin l
WHERE h.message_id = l.message_id
AND h.contract = '1111'
AND l.shipment_set IS NOT NULL
AND h.cust_order_no IS NOT NULL;
BEGIN
Heart OPEN;
LOOP
News FETCH
LOOSE COLLECTION v_xarray LIMIT 10000;
WHEN v_xcustord EXIT. COUNT() = 0;
FORALL I IN 1... v_xarray. COUNTY
INSERT INTO TP_A1_TAB (cust_order_no, shipment_set)
VALUES (v_xarray (i) .cust_order_no, v_xarray (i) .shipment_set);
commit;
END LOOP;
CLOSE cur;
END;I'm running on Oracle 9i release 2.
Short-term solution may be to a world point of view. Pay once per hour for the slow and complex query execution. Materialize the results in a table (with clues in support of queries on the materialized view).
Good solution - analysis logic and SQL, determine what he does, how he does it and then figure out how this can be improved.
Ripping separate cursors in SQL and PL/SQL code injection to stick together, are a great way to make performance even worse.
-
Fetch Bulk collect Insert error
CREATE OR REPLACE PROCEDURE bulk_collect_limit (StartRowOptional in NUMBER, EndRowOptional number, fetchsize in NUMBER)
IS
SID TYPE TABLE IS NUMBER;
Screated_date TYPE IS an ARRAY OF DATE;
Slookup_id TYPE TABLE IS NUMBER;
Surlabasedesdonneesdufabricantduballast ARRAY TYPE IS VARCHAR2 (50);
l_sid sid;
l_screated_date screated_date;
l_slookup_id slookup_id;
l_sdata surlabasedesdonneesdufabricantduballast;
l_start NUMBER;
ID IS of SELECT CURSOR of c_data, created_date, lookup_id, data1 FROM big_table WHERE id > = StartRowOptional AND id < = EndRowOptional;
Reclist TYPE IS an ARRAY OF c_data % ROWTYPE;
reclist REB;
BEGIN
l_start: = DBMS_UTILITY.get_time;
OPEN c_data;
LOOP
Fetch the c_data COLLECT in BULK IN CER LIMIT fetchsize;
BECAUSE me IN REB. FIRST... REB. LAST
LOOP
INSERT INTO values big_table2 (REB (i) user.user, REB (i) .created_date, recs (i) .lookup_id, (i) recs .data1);
END LOOP;
OUTPUT WHEN c_data % NOTFOUND;
END LOOP;
C_data CLOSE;
COMMIT;
Dbms_output.put_line ('Total elapsed:-' |) (DBMS_UTILITY.get_time - l_start) | "hsecs");
EXCEPTION
WHILE OTHERS THEN
LIFT;
END;
/
DISPLAY ERRORS;
WARNING: the execution is completed with warning
29/87 PLS-00302: component "DATA1" must be declared
29/87 PL/SQL: ORA-00984: column not allowed here
29/6 PL/SQL: statement ignored
I get the error error above in the insert statement.
Please can I get help to solve.
I won't answer your question, but say you something else - do not do this with bulk collect. Do it in a single SQL statement.
Stop using loops and by engaging in loops.
Who will solve the error, makes it less likely, you get error ORA-01555, create less recovery and be more effective.
Oh, and it does nothing useful:
EXCEPTION
WHILE OTHERS THEN
LIFT;
The entire procedure should be:
CREATE OR REPLACE PROCEDURE bulk_collect_limit (startrow IN NUMBER,endrow IN NUMBER,fetchsize IN NUMBER) IS l_start NUMBER; begin insert into big_table2(put a column list here for crikey's sake) select id,created_date,lookup_id,data1 FROM big_table WHERE id >= startrow AND id <= endrow; DBMS_OUTPUT.put_line('Total Elapsed Time :- ' || (DBMS_UTILITY.get_time - l_start) || ' hsecs'); end;
-
Get help in BULK COLLECT IN the treatment
the following gives me PLS-00302 error: component 'R_MDATA' must be declared
---------------------------------------------
declare
error_1555 exception;
pragma exception_init (error_1555,-1555);
number num.
-set the record
TYPE RJ_RECORD is RECORD (r_rowr_mdata BLOB ROWID);
-set the table based on the file type
TYPE RJ_LIST_T IS TABLE OF RJ_RECORD
INDEX BY PLS_INTEGER;
-our structure will be bulk collect into
l_List RJ_LIST_T;
sql_str varchar2 (2000);
cursor ovs_tab is SELECT table_name from user_tables;
Start
for c_rec in ovs_tab LOOP
sql_str: = ' select rowid, m_data of ' | c_rec.table_name;
run immediately sql_str
COLLECTION in BULK IN l_list;
for indx in 1.l_list. COUNTY
LOOP
Start
NUM: = dbms_lob.instr (l_list. R_MDATA(indx), hextoraw ('889911')) ; -He does not like r_mdata
exception
When error_1555 then
-Insert in the values of corrupted_lob_data (l_list.rj_rowid (indx), c_rec.table_name);
-commit;
dbms_output.put_line (' corrupt tab = ' | c_rec.table_name);
end;
END LOOP;
end loop;
end;
/
change l_list.r_mdata (indx)
TO
.r_mdata l_list (indx)
Each table has a column named m_data?
-
Hello
I'm using the version of oracle 11g.
How can I access the data in the table variable V_emp?
Set serveroutput size unlimited
declare
type emp_type is table emp % rowtype
index of directory;
v_emp emp_type;
Start
Select emp.* bulk collect into v_emp
EMP;
because me in 1.v_emp.count
loop
dbms_output.put_line (How can I display all the data in the v_emp array variable?);
end loop;
end;
/
Thank you
DECLARE
CURSOR c1 IS (SELECT * FROM emp);
TYPE typ_tbl IS TABLE c1% rowtype;
v typ_tbl;
BEGIN
OPEN c1;
LOOP --Loop added
C1 FETCH BULK COLLECT IN v LIMIT 3; -treat 3 records at a time
-treat the first 3 max records
DBMS_OUTPUT. Put_line ('Treatment' | v.COUNT |) "documents.");
I'm IN v.first... v.Last LOOP
DBMS_OUTPUT. Put_line (v (i) .empno);
END LOOP;
OUTPUT WHEN c1% NOTFOUND;
END LOOP;
DBMS_OUTPUT. Put_line ('all done');
END;
-
Bulk collect with sequence Nextval
Hello
Oracle Database 10 g Enterprise Edition Release 10.2.0.4.0 - 64 bit
Had a doubt about the collection in bulk with nextval sequence. You need to update a table with a sequence of Nextval.
where should I place select below in the proc is this before or after the loop
< font color = "red" > SELECT prop_id_s.nextval INTO v_prop_id FROM dual; < / make >
Published by: 960736 on January 23, 2013 12:51CREATE OR REPLACE PROCEDURE (state IN varchar2) AS CURSOR get_all IS SELECT /*+ parallel (A, 8) */ A .ROWID from Loads A WHERE A.Prop_id IS NULL; TYPE b_ROWID IS TABLE OF ROWID INDEX BY BINARY_INTEGER; lns_rowid b_ROWID; BEGIN OPEN Get_all; LOOP FETCH get_all BULK COLLECT INTO lns_rowid LIMIT 10000; FORALL I IN 1 .. lns_rowid.COUNT UPDATE loads a SET a.prop_id= v_prop_id (I) WHERE A.ROWID = lns_rowid (I) AND a.prop_id IS NULL; COMMIT; EXIT WHEN get_all%NOTFOUND; END LOOP; CLOSE Get_all; END; /
Hello
It depends on what results you want. All updated rows would take the same value, or should all get unique values?
Whatever it is, you don't need the sliders and loop. Just a simple UPDATE statement.
If each line requires a unique value of the sequence, then
UPDATE loads SET prop_id = prod_id_s.NEXTVAL WHERE prop_id IS NULL ;
If all the lines that have a need to the same value null, then:
SELECT prod_id_s.nextval INTO v_prop_id FROM dual; UPDATE loads SET prop_id = v_prop_id WHERE prop_id IS NULL ;
Don't forget to declare v_prop_id as a NUMBER.
I hope that answers your question.
If not, post a small example of data (instructions CREATE and INSERT, only relevant columns) for all the tables and the involved sequences and also publish outcomes from these data.
If you ask on a DML statement, such as UPDATE, the sample data will be the content of the or the tables before the DML, and the results will be the State of the or the tables changed when it's all over.
Explain, using specific examples, how you get these results from these data.
Always say what version of Oracle you are using (for example, 11.2.0.2.0).
See the FAQ forum {message identifier: = 9360002} -
Doubt on bulk collect with LIMIT
Hello
I have a doubt on in bulk to collect, when did Commit
I have an example in PSOUG
http://psoug.org/reference/array_processing.html
If my table servers were 3 000 000 files, when do we commit? When I insert all records?CREATE TABLE servers2 AS SELECT * FROM servers WHERE 1=2; DECLARE CURSOR s_cur IS SELECT * FROM servers; TYPE fetch_array IS TABLE OF s_cur%ROWTYPE; s_array fetch_array; BEGIN OPEN s_cur; LOOP FETCH s_cur BULK COLLECT INTO s_array LIMIT 1000; FORALL i IN 1..s_array.COUNT INSERT INTO servers2 VALUES s_array(i); EXIT WHEN s_cur%NOTFOUND; END LOOP; CLOSE s_cur; COMMIT; END;
could crash redo log?
using 9.2.08muttleychess wrote:
If my table servers were 3 000 000 files, when do we commit?Commit point has nothing to do with how many rows treat you. It's purely commercial leads. Your code implements a commercial operation, right? So if you're getting into before any trancaction (from the commercial point of view) other sessions will be already see changes that are (from a business point of view) incomplete. In addition, what happens if rest of trancaction (from the commercial point of view) goes down?
SY.
Maybe you are looking for
-
Password in the memoirs by Safari, but not Firefox
Hello I wonder if you could help solve me the following problem. I recently got fed up with crashes and the Safari kept generating Rainbow balls and decided to switch to Firefox. So far, it seems to be a good decision, but there is a question that st
-
Single function key commands Officejet
Overtime some printers have not been updated for the latest operating systems. When this happens, sometimes the functions of the software to order a printer to perform tasks, such as print a self-test page or clean the print head, have been lost. Ho
-
How to burn videos from Flipcam on DVD to play on DVD player
trying to burn videos of Flipcam (mp4 format) on a DVD that is playable on DVD player for the TV... so far can only burn to DVD that can then be read on the computer. Help! In addition, how to remove a file that is located on the DVD (the cumputer
-
ERROR WindowsUpdate_80070643
All the time that we get this error... our system doesn't have microsoft office. We are just so... all the time the system windows can not update the design... .Please help
-
DVD drive will burn discs and not read the content
my dvd player will be only burn discs... any time I put in a cd of software or audio CDs, it won't let me veiw content... When I put in a cd of software says "Please insert the disk" and ejects the cd. When I put a CD audo (burned) it gives me just t