Procedure failed while using bulk collect into clause and works with cursor

hi all,
I am using "BULK collect into" clause in my procedure and it is failing after 21 minutes and gives the error "end of file communication channel".
after this error comes when i tried to connect database it is giving following error.
ORA -01034 - Oracle not available.
ORA- 27101 - shared memory realm does not exist.
svr4- error :2 : No such file or directory.
when i use cursor instead of BULK COLLECT INTO clause it is running successful.
Following code is working with cursor.
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, '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
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(+);
BEGIN
execute immediate 'truncate table crstools.drt_bom_work_kiosk';
select sysdate into ld_curr_time from dual;
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
,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
(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
,cur_rec.BILLABLE
,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.ECD
,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.REPAIR_DESCRIPTION
,cur_rec.REQUESTOR
,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.SHIFT
,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
when 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 bulk collect into caluse.
Please help me out why this is happening.
Thanks & regards
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 were changing the data being inserted in such a way that you couldn't encapsulate the changes in a query, but you are doing a straight insert into the table from your Cursor. A much more efficient way would be to use the following modifications I made to your code example:
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's the link for infor on the [Oracle Direct-Path INSERT |http://download.oracle.com/docs/cd/B10501_01/server.920/a96524/c21dlins.htm#10778].
Also, if you are truly intent on using a CURSOR FOR LOOP with the BULK COLLECT, I suggest you read Steven Feuerstein's article [PL/SQL Practices: On BULK COLLECT |http://www.oracle.com/technology/oramag/oracle/08-mar/o28plsql.html].
Hope this helps.
Craig...
If my response or the response of another was helpful, please mark it accordingly

Similar Messages

  • How to use bulk collect into clause

    hi all,
    i have requirement like this i want to change the query by passing the different table names in oracle database 10gr2.
    like if i use first i pass the scott.emp table name select * from scott.emp;
    then i want pass scott.dept table name select * from scott.dept;
    using select * option in the select list.
    how can i execute it.
    give me any solution.
    please reply....

    Hi,
    i recently also ran into some serious trouble to make dynamic sql work.
    It was about parallel pipelined function with strongly typed cursor (for "partition ... by hash(...)").
    But in addition requiring dynamic SQL for the input to this cursor.
    I couldn't make it work with execute immediate or something else.
    So i used another way - I translated dynamic SQL into dynamically created static SQL:
    1. create a base SQL data object type with abstract interface for code (e.g. some Execute() member function).
    2. dynamically create a derived SQL data object type with concrete implementation of Execute() holding your "dynamic SQL" "in a static way"
    3. delegate to Execute().
    Let me quote my example from comp.databases.oracle.server, thread "dynamically created cursor doesn't work for parallel pipelined functions"
    - pls. see below (it's an old one - with likely some odd stuff inside).
    It might sound some kind of strange for DB programmer.
    (I come from C++. Though this is not an excuse smile)
    Maybe i just missed another possible option to handle the problem.
    And it's a definitely verbose.
    But i think it's at least a (last) option.
    Actually i would be interested to hear, what others think about it.
    best regards,
    Frank
    --------------- snip -------------------------
    drop table parallel_test;
    drop type MyDoit;
    drop type BaseDoit;
    drop type ton;
    create type ton as table of number;
    CREATE TABLE parallel_test (
    id NUMBER(10),
    description VARCHAR2(50)
    BEGIN
    FOR i IN 1 .. 100000 LOOP
    INSERT INTO parallel_test (id, description)
    VALUES (i, 'Description or ' || i);
    END LOOP;
    COMMIT;
    END;
    create or replace type BaseDoit as object (
    id number,
    static function make(p_id in number)
    return BaseDoit,
    member procedure doit(
    p_sids in out nocopy ton,
    p_counts in out nocopy ton)
    ) not final;
    create or replace type body BaseDoit as
    static function make(p_id in number)
    return BaseDoit
    is
    begin
    return new BaseDoit(p_id);
    end;
    member procedure doit(
    p_sids in out nocopy ton,
    p_counts in out nocopy ton)
    is
    begin
    dbms_output.put_line('BaseDoit.doit(' || id || ') invoked...');
    end;
    end;
    -- Define a strongly typed REF CURSOR type.
    CREATE OR REPLACE PACKAGE parallel_ptf_api AS
    TYPE t_parallel_test_row IS RECORD (
    id1 NUMBER(10),
    desc1 VARCHAR2(50),
    id2 NUMBER(10),
    desc2 VARCHAR2(50),
    sid NUMBER
    TYPE t_parallel_test_tab IS TABLE OF t_parallel_test_row;
    TYPE t_parallel_test_ref_cursor IS REF CURSOR RETURN
    t_parallel_test_row;
    FUNCTION test_ptf (p_cursor IN t_parallel_test_ref_cursor)
    RETURN t_parallel_test_tab PIPELINED
    PARALLEL_ENABLE(PARTITION p_cursor BY any);
    END parallel_ptf_api;
    SHOW ERRORS
    CREATE OR REPLACE PACKAGE BODY parallel_ptf_api AS
    FUNCTION test_ptf (p_cursor IN t_parallel_test_ref_cursor)
    RETURN t_parallel_test_tab PIPELINED
    PARALLEL_ENABLE(PARTITION p_cursor BY any)
    IS
    l_row t_parallel_test_row;
    BEGIN
    LOOP
    FETCH p_cursor
    INTO l_row;
    EXIT WHEN p_cursor%NOTFOUND;
    select userenv('SID') into l_row.sid from dual;
    PIPE ROW (l_row);
    END LOOP;
    RETURN;
    END test_ptf;
    END parallel_ptf_api;
    SHOW ERRORS
    PROMPT
    PROMPT Serial Execution
    PROMPT ================
    SELECT sid, count(*)
    FROM TABLE(parallel_ptf_api.test_ptf(CURSOR(SELECT t1.id,
    t1.description, t2.id, t2.description, null
    FROM parallel_test t1,
    parallel_test t2
    where t1.id = t2.id
    ) t2
    GROUP BY sid;
    PROMPT
    PROMPT Parallel Execution
    PROMPT ==================
    SELECT sid, count(*)
    FROM TABLE(parallel_ptf_api.test_ptf(CURSOR(SELECT /*+
    parallel(t1,5) */ t1.id, t1.description, t2.id, t2.description, null
    FROM parallel_test t1,
    parallel_test t2
    where t1.id = t2.id
    ) t2
    GROUP BY sid;
    PROMPT
    PROMPT Parallel Execution 2
    PROMPT ==================
    set serveroutput on;
    declare
    v_sids ton := ton();
    v_counts ton := ton();
    -- v_cur parallel_ptf_api.t_parallel_test_ref_cursor;
    v_cur sys_refcursor;
    procedure OpenCursor(p_refCursor out sys_refcursor)
    is
    begin
    open p_refCursor for 'SELECT /*+ parallel(t1,5) */ t1.id,
    t1.description, t2.id, t2.description, null
    FROM parallel_test t1,
    parallel_test t2
    where t1.id = t2.id';
    end;
    begin
    OpenCursor(v_cur);
    SELECT sid, count(*) bulk collect into v_sids, v_counts
    FROM TABLE(parallel_ptf_api.test_ptf(v_cur)) t2
    GROUP BY sid;
    for i in v_sids.FIRST.. v_sids.LAST loop
    dbms_output.put_line (v_sids(i) || ', ' || v_counts(i));
    end loop;
    end;
    PROMPT
    PROMPT Parallel Execution 3
    PROMPT ==================
    set serveroutput on;
    declare
    instance BaseDoit;
    v_sids ton := ton();
    v_counts ton := ton();
    procedure CreateMyDoit
    is
    cmd varchar2(4096 char);
    begin
    cmd := 'create or replace type MyDoit under BaseDoit ( ' ||
    ' static function make(p_id in number) ' ||
    ' return MyDoit, ' ||
    ' overriding member procedure doit( ' ||
    ' p_sids in out nocopy ton, ' ||
    ' p_counts in out nocopy ton) ' ||
    execute immediate cmd;
    cmd := 'create or replace type body MyDoit as ' ||
    ' static function make(p_id in number) ' ||
    ' return MyDoit ' ||
    ' is ' ||
    ' begin ' ||
    ' return new MyDoit(p_id); ' ||
    ' end; ' ||
    ' ' ||
    ' overriding member procedure doit( ' ||
    ' p_sids in out nocopy ton, ' ||
    ' p_counts in out nocopy ton) ' ||
    ' is ' ||
    ' begin ' ||
    ' dbms_output.put_line(''MyDoit.doit('' || id || '')
    invoked...''); ' ||
    ' SELECT sid, count(*) bulk collect into p_sids, p_counts ' ||
    ' FROM TABLE(parallel_ptf_api.test_ptf(CURSOR( ' ||
    ' SELECT /*+ parallel(t1,5) */ t1.id, t1.description,
    t2.id, t2.description, null ' ||
    ' FROM parallel_test t1, parallel_test t2 ' ||
    ' where t1.id = t2.id ' ||
    ' ))) ' ||
    ' GROUP BY sid; ' ||
    ' end; ' ||
    ' end; ';
    execute immediate cmd;
    end;
    begin
    CreateMyDoit;
    execute immediate 'select MyDoit.Make(11) from dual' into instance;
    instance.doit(v_sids, v_counts);
    if v_sids.COUNT > 0 then
    for i in v_sids.FIRST.. v_sids.LAST loop
    dbms_output.put_line (v_sids(i) || ', ' || v_counts(i));
    end loop;
    end if;
    end;
    --------------- snap -------------------------

  • How to tune a query which contains "Bulk Collect Into" clause

    I want to tune the below query:
    SELECT customer_master_num,
    product_nam
    BULK COLLECT INTO t_cont09_rec
    FROM TB_CMA009_SUPRA_RE_AGNT_CONT
    WHERE re_agent_customer_master_num = p_63cust_master_num
    AND customer_master_num = p_63board_master_num
    AND cancellation_dt IS NULL
    AND NVL (is_training_key_flg, 'N') = 'N';
    This contains "Bulk Collect Into" clause.
    TYPE cont09cur IS RECORD (
    customer_master_num TB_CMA009_SUPRA_RE_AGNT_CONT.customer_master_num%TYPE,
    product_nam TB_CMA009_SUPRA_RE_AGNT_CONT.product_nam%TYPE);
    t_cont09_rec cont09_rec;
    "t_cont09_rec" This is of Record Type
    Please help me out how to tune this one.

    [url http://forums.oracle.com/forums/thread.jspa?threadID=501834&tstart=0]When your query takes too long ...
    Also, don't get too distracted by the PL/SQL bulk collect into construction. If it takes time, then you have more than 99% chance that the time is spent in the SQL.
    Regards,
    Rob.

  • Can I use InDesign cs6 to open and work with PM6.5 files?

    Can I use InDesign cs6 to open and work with PM6.5 files?

    Lrak wrote: "It sounds like I should to that before endeavoring to transfer the manuscript?" (re-link)
    It should be much easier to re-link in the Pagemaker file, as, with any luck, you can get the filenames from the Graphics Manager.  After conversion to InDesign, any out-of-date linked images get their names converted to something like "image 123.jpg", and are themselves converted to an embedded low res representation of the image.  Even vectored art.  Pretty hard to figure them out, unless you are VERY familiar with the file, which you may be.
    It may be that any cropping gets lost, too?  I do prepress work, we do some set up for our customers, but most comes in pretty much ready to go, so I don't often have to did too deep into fixing such issues. On the other hand, any problem that can happen has probably crossed my desk, or it seems that way some days!

  • How to handle the bad record while using bulk collect with limit.

    Hi
    How to handle the Bad record as part of the insertion/updation to avoid the transaction.
    Example:
    I am inserting into table with LIMIT of 1000 records and i've got error at 588th record.
    i want to commit the transaction with 588 inserted record in table and log the error into
    error logging table then i've to continue with transaction with 560th record.
    Can anyone suggest me in this case.
    Regards,
    yuva

    >
    How to handle the Bad record as part of the insertion/updation to avoid the transaction.
    >
    Use the SAVE EXCEPTIONS clause of the FORALL if you are doing bulk inserts.
    See SAVE EXCEPTIONS in the PL/SQL Language doc
    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/tuning.htm
    And then see Example 12-9 Bulk Operation that continues despite exceptions
    >
    Example 12-9 Bulk Operation that Continues Despite Exceptions
    -- Temporary table for this example:
    CREATE TABLE emp_temp AS SELECT * FROM employees;
    DECLARE
    TYPE empid_tab IS TABLE OF employees.employee_id%TYPE;
    emp_sr empid_tab;
    -- Exception handler for ORA-24381:
    errors NUMBER;
    dml_errors EXCEPTION;
    PRAGMA EXCEPTION_INIT(dml_errors, -24381);
    BEGIN
    SELECT employee_id
    BULK COLLECT INTO emp_sr FROM emp_temp
    WHERE hire_date < '30-DEC-94';
    -- Add '_SR' to job_id of most senior employees:
    FORALL i IN emp_sr.FIRST..emp_sr.LAST SAVE EXCEPTIONS
    UPDATE emp_temp SET job_id = job_id || '_SR'
    WHERE emp_sr(i) = emp_temp.employee_id;
    -- If errors occurred during FORALL SAVE EXCEPTIONS,
    -- a single exception is raised when the statement completes.
    EXCEPTION
    -- Figure out what failed and why
    WHEN dml_errors THEN
    errors := SQL%BULK_EXCEPTIONS.COUNT;
    DBMS_OUTPUT.PUT_LINE
    ('Number of statements that failed: ' || errors);
    FOR i IN 1..errors LOOP
    DBMS_OUTPUT.PUT_LINE('Error #' || i || ' occurred during '||
    'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
    DBMS_OUTPUT.PUT_LINE('Error message is ' ||
    SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
    END LOOP;
    END;
    DROP TABLE emp_temp;

  • Wrong value for cursor%notfound while using bulk collect

    Hi,
    If the limit value is greater then the amount of rows which were fetched, then cursor attribute %NOTFOUND is TRUE.
    Why it's not FALSE because one value was fetched.
    I made a little example.
    The second procedure doesn't produce an output, but the first one does.
    SQL> CREATE TABLE testing AS SELECT 1 id FROM dual;
    Table created.
    SQL> DECLARE
      2    TYPE array IS TABLE OF testing.id%TYPE;
      3    l_data array;
      4
      5    CURSOR cur_test IS
      6      SELECT id FROM testing;
      7  BEGIN
      8    OPEN cur_test;
      9    LOOP
    10      FETCH cur_test BULK COLLECT INTO l_data <b>LIMIT 1</b>;
    11      EXIT WHEN cur_test%NOTFOUND;
    12      dbms_output.put_line('value='||l_data(1));
    13    END LOOP;
    14    CLOSE cur_test;
    15  END;
    16  /
    <b>value=1</b>
    PL/SQL procedure successfully completed.
    SQL> DECLARE
      2    TYPE array IS TABLE OF testing.id%TYPE;
      3    l_data array;
      4
      5    CURSOR cur_test IS
      6      SELECT id FROM testing;
      7  BEGIN
      8    OPEN cur_test;
      9    LOOP
    10      FETCH cur_test BULK COLLECT INTO l_data <b>LIMIT 10</b>;
    11      EXIT when cur_test%NOTFOUND;
    12      dbms_output.put_line('value='||l_data(1));
    13    END LOOP;
    14    CLOSE cur_test;
    15  END;
    16  /
    PL/SQL procedure successfully completed.
    SQL> spool off;
    Thanks
    Ants

    Why not bulk fetching only one time and not loop?
    I would say it is working as intended. %FOUND / %NOTFOUND only tells you if there are rows left to fetch. Good that you are now aware of it.
    Also think at possibilities like .FIRST, .LAST or SQL%BULK_ROWCOUNT
    From the oracle documentation: "%NOTFOUND Attribute
    This is a cursor attribute that can be appended to the name of a cursor or cursor variable. Before the first fetch from an open cursor, cursor_name%NOTFOUND yields NULL. Thereafter, it yields FALSE if the last fetch returned a row, or TRUE if the last fetch failed to return a row."

  • Error while using bulk collect

    Hi
    I tried with the following code,
    DECLARE
       TYPE EmpRec IS RECORD (last_name   EMP.ename%TYPE,
                              salary      emp.sal%TYPE);
       emp_info EmpRec;
       TYPE empnest IS TABLE OF EMP.empno%TYPE;
       empnestvar empnest;
    BEGIN
      empnestvar := empnest(7566,7788);
       FOR i in empnestvar.first..empnestvar.last LOOP
       UPDATE emp SET sal = sal * 1.1 WHERE empno = empnestvar(i)
          RETURNING   ename, sal BULK COLLECT INTO  emp_info;
       DBMS_OUTPUT.PUT_LINE('Just gave a raise to ' || emp_info.last_name ||
          ', who now makes ' || emp_info.salary);
       ROLLBACK;
       END LOOP;
    END;getting this following err
          RETURNING   ename, sal BULK COLLECT INTO  emp_info;
    ERROR at line 11:
    ORA-03113: end-of-file on communication channelCould you please advice me in this
    Thanks

    The main problem i you are bulk collecting into a "record" type variable.
    SQL>
    SQL> SHOW user
    USER is "SCOTT"
    SQL> SELECT * FROM v$version;
    BANNER
    Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
    PL/SQL Release 10.2.0.2.0 - Production
    CORE    10.2.0.2.0      Production
    TNS for Solaris: Version 10.2.0.2.0 - Production
    NLSRTL Version 10.2.0.2.0 - Production
    SQL> SET SERVEROUT on
    SQL> DECLARE
      TYPE EmpRec IS RECORD(
        last_name EMP.ename%TYPE,
        salary    emp.sal%TYPE);
      TYPE emp_bl IS TABLE OF EmpRec; --Added.
      emp_info emp_bl; --Changed.
      TYPE empnest IS TABLE OF EMP.empno%TYPE;
      empnestvar empnest;
    BEGIN
      empnestvar := empnest(7566, 7788);
      FOR i in empnestvar.first .. empnestvar.last LOOP
        UPDATE emp
           SET sal = sal * 1.1
         WHERE empno = empnestvar(i) RETURNING ename, sal BULK COLLECT INTO
         emp_info;
        DBMS_OUTPUT.PUT_LINE('Just gave a raise to ' || emp_info(1)
                             .last_name || ', who now makes ' || emp_info(1)
                             .salary);
        ROLLBACK;
      END LOOP;
    END;  2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21
    22  /
    Just gave a raise to JONES, who now makes 3272.5
    Just gave a raise to SCOTT, who now makes 3300
    PL/SQL procedure successfully completed.
    SQL>Although, I must say that, as because empno is the primary key, here RETURNING INT with BULK COLLECT doesn't make any sense.

  • ORA-22167 when using RETURNING... BULK COLLECT INTO feature

    I posted this on the General Board, but I'm still having the issue. Any help would be appreciated!
    I'm loading raw data into a staging table, and want to perform a series of validations before moving it into the system. Records that fail are marked invalid in the stage table, and then an error message written to another table. When updating the 'invalid' flag in the (database) stage table, I return the record identifier into a pl/sql table, then iterate through said table to insert into my (database) error table. This works great for my first validation, but when I use the pl/sql table for the second validation, I get ORA-22167, which basically complains about the subscript supplied to TRIM being out of range. I've tried DELETEing the pl/sql table, setting it to NULL, re-initializing it... none of which works. I have also tried using a brand new table for each validation, but I still get the same message. What am I missing?
    Psuedo-code is like this (please ignore any syntax errors... real code is syntactically correct) :
    DECLARE
    TYPE RECORD_SEQ_TBL IS TABLE OF fcsf_arc.record_seq_nbr%TYPE;
    lt_bad_fcsf_tbl RECORD_SEQ_TBL := NULL;
    BEGIN
    UPDATE <stg_tbl>
    SET valid_ind = 'N'
    WHERE <error condition 1>
    RETURNING seq_nbr BULK COLLECT INTO lt_bad_fcsf_tbl;
    FORALL j IN lt_bad_fcsf_tbl.FIRST..lt_bad_fcsf_tbl.LAST
    INSERT INTO <error_tbl>
    VALUES ('message', lt_bad_fcsf_tbl(j));
    -- works ok so far...
    -- I've tried various combinations of the next three comments to no avail (including doing nothing at all)
    -- lt_bad_fcsf_tbl.DELETE;
    -- lt_bad_fcsf_tbl := NULL;
    -- lt_bad_fcsf_tbl := RECORD_SEQ_TBL();
    -- now I want to do my second validation
    UPDATE <stg_tbl>
    SET valid_ind = 'N'
    WHERE <error condition 2>
    RETURNING seq_nbr BULK COLLECT INTO lt_bad_fcsf_tbl;
    -- and THAT is where I get the ORA-22167

    Thanks for the pointer, Sy. I'm trying to track down soembody with a valid metalink account... everybody I know that has one is getting 'invalid login' messages.
    In the meantime, I have switched from nested tables to associative arrays, and this change seems to be working (so far).
    Thanks again for your feedback!

  • Use of FOR Cursor and BULK COLLECT INTO

    Dear all,
    in which case we prefer to use FOR cursor and cursor with BULK COLLECT INTO? The following contains two block that query identically where one is using FOR cursor, the other is using BULK COLLECT INTO . Which one that performs better given in the existing task? How do we measure performance between these two?
    I'm using sample HR schema:
    declare
    l_start number;
    BEGIN
    l_start:= DBMS_UTILITY.get_time;
    dbms_lock.sleep(1);
    FOR employee IN (SELECT e.last_name, j.job_title FROM employees e,jobs j
    where e.job_id=j.job_id and  e.job_id LIKE '%CLERK%' AND e.manager_id > 120 ORDER BY e.last_name)
    LOOP
      DBMS_OUTPUT.PUT_LINE ('Name = ' || employee.last_name || ', Job = ' || employee.job_title);
    END LOOP;
    DBMS_OUTPUT.put_line('total time: ' || to_char(DBMS_UTILITY.get_time - l_start) || ' hsecs');
    END;
    declare
    l_start number;
    type rec_type is table of varchar2(20);
    name_rec rec_type;
    job_rec rec_type;
    begin
    l_start:= DBMS_UTILITY.get_time;
    dbms_lock.sleep(1);
    SELECT e.last_name, j.job_title bulk collect into name_rec,job_rec FROM employees e,jobs j
    where e.job_id=j.job_id and  e.job_id LIKE '%CLERK%' AND e.manager_id > 120 ORDER BY e.last_name;
    for j in name_rec.first..name_rec.last loop
      DBMS_OUTPUT.PUT_LINE ('Name = ' || name_rec(j) || ', Job = ' || job_rec(j));
    END LOOP;
    DBMS_OUTPUT.put_line('total time: ' || to_char(DBMS_UTILITY.get_time - l_start) || ' hsecs');
    end;
    /In this code, I put timestamp in each block, but they are useless since they both run virtually instantaneous...
    Best regards,
    Val

    If you want to get 100% benifit of bulk collect then it must be implemented as below
    declare
         Cursor cur_emp
         is
         SELECT     e.last_name, j.job_title
         FROM     employees e,jobs j
         where     e.job_id=j.job_id
                   and  e.job_id LIKE '%CLERK%'
                   AND e.manager_id > 120
         ORDER BY e.last_name;
         l_start number;
         type rec_type is table of varchar2(20);
         name_rec rec_type;
         job_rec rec_type;
    begin
         l_start:= DBMS_UTILITY.get_time;
         dbms_lock.sleep(1);
         /*SELECT e.last_name, j.job_title bulk collect into name_rec,job_rec FROM employees e,jobs j
         where e.job_id=j.job_id and  e.job_id LIKE '%CLERK%' AND e.manager_id > 120 ORDER BY e.last_name;
         OPEN cur_emp;
         LOOP
              FETCH cur_emp BULK COLLECT INTO name_rec LIMIT 100;
              EXIT WHEN name_rec.COUNT=0;
              FOR j in 1..name_rec.COUNT
              LOOP
                   DBMS_OUTPUT.PUT_LINE ('Name = ' || name_rec(j) || ', Job = ' || job_rec(j));          
              END LOOP;
              EXIT WHEN cur_emp%NOTFOUND;
         END LOOP;
            CLOSE cur_emp;
         DBMS_OUTPUT.put_line('total time: ' || to_char(DBMS_UTILITY.get_time - l_start) || ' hsecs');
    end;
    /

  • How to use BULK COLLECT in oracle forms

    hi gurus,
    I am using oracle forms
    Forms [32 Bit] Version 10.1.2.0.2 (Production)
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionI wanna use bulk collect from database table lets say <employees>
    while working on database level with collections and records it's working very well for me, but when I try to use that technique on oracle forms it hits me error
    error 591 this feature is not supported in client side programmingI know I can use cursors to loop through the records of oracle tables ,
    but I'm convenient while using collections and arrays
    for example
    Set Serveroutput On
    Declare
          Type Rec_T Is Record (     
           Empid Number ,
           Empname Varchar2(100)
          Type V_R Is Table Of Rec_T Index By Binary_Integer;     
          V_Array V_R;
    Begin
       Select Employee_Id , First_Name
       Bulk Collect
       Into V_Array
          From Employees; 
       For Indx In V_Array.First..V_Array.Last Loop
       Dbms_Output.Put_Line('employees id '||V_Array(Indx).Empid ||'and the name is '||V_Array(Indx).Empname);
       End Loop;      
         End;I wanna use this same way on oracle forms , for certain purposes , please guide me how can I use ...
    thanks...

    For information, you can use and populate a collection within the Forms application without using the BULK COLLECT
    Francoisactually I want to work with arrays , index tables ,
    like
             record_type (variable , variable2);
             type type_name <record_type>  index by binary_integer
            type_variable type_name;
            and in main body of program
            select something
            bulk collect into type_variable
            from any_table;
           loop
                type_variable(indx).variable , type_variable(indx).variable2;
           end loop;
           this is very useful for my logic on which I am working
              like
              type_variable(indx).variable || type_variable(indx-1);
             if it's possible with cursors then how can I use cursor that can fullfill my this logic@Francois
    if it's possible then how can i populate without using bulk collect?
    thanks
    and for others replies: if I can use stored procedures please give me any example..
    thanks

  • Bulk collect into using vector in where clause

    Hi,
    I have a java stored procedure which takes an array as input and returns an array as output.
    I want to select a column in to a collection of array, using array as the select criteria.
    For example
    create or replace type My_list as table of varchar(20);
    create or replace type outarray as table of BLOB;
    create or replace function myfunction ( inputlist My_list)
    return outarray
    AS
    o_data := outarray();
    BEGIN
    SELECT mycolumn from mytable BULK COLLECT INTO o_data where my_creteria=inputlist
    retrun o_data;
    END;
    Unless I use FORALL I can not retrieve the inputlist values. I am not sure how I can use the bulk collect and forall in the same statement?
    My data is arranged such that , for each value in the inputlist one row will be fetched. I want to fetch all these rows at one go using the inputlist as select criteria,
    I can use the for i in inputlist.first .. inputlist.LAST and iterate the inputlist but that process is quite expensive interms of the latency.
    You help in optimizing my query would be highly appreciated.
    Regards,
    Syam

    That only leaves ugly solutions, like:
    <ul>
    <li>Using dynamic SQL to create a temporary table, doing a bulk insert of the incoming array and then reading the table values using a subquery with the IN opeartor.</li>
    <li>Building a dyanmic list, like ('value1','value2', ..) and use it with the IN operator, this is a variable list and requires DBMS_SQL package.</li>
    <li>Ignore the bulk operations. :-(</li>
    </ul>

  • Bulk Collect into is storing less no of rows in collection when using LIMIT?

    I have written the following anonymous PL SQL Block. However, the line dbms_output.put_line(total_tckt_col.LAST) gives me output as 366 (in DBMS_OUTPUT is SQL Developer) which is correct when no limit is set. If the limit is set to 100 in the FETCH statement then dbms_output.put_line(total_tckt_col.LAST) gives me 66. What I am doing wrong here?
    DECLARE
       CURSOR cur_total_tckt 
       is
       select  t.ticket_id ticket_id, t.created_date created_date, t.created_by created_by, t.ticket_status ticket_status,
      t.last_changed last_changed, h.created_date closed_date
       from n01.cc_ticket_info t
       inner join n01.cc_ticket_status_history h
       on (t.ticket_id = h.ticket_id)
       where t.last_changed >= '6/28/2012 17:28:59' and t.last_changed < (sysdate + interval '1' day);
      type total_tckt_colcn
       is
       TABLE OF cur_total_tckt%rowtype;
      total_tckt_col total_tckt_colcn;
      total_coach_col total_tckt_colcn;
       begin
      total_tckt_col  := total_tckt_colcn ();
      total_coach_col := total_tckt_colcn ();
       OPEN cur_total_tckt;
      loop
       fetch cur_total_tckt bulk collect into total_tckt_col;
    -- fetch cur_total_tckt bulk collect into total_tckt_col limit 100;
       EXIT
       WHEN (cur_total_tckt%NOTFOUND);
       END LOOP ;
       CLOSE cur_total_tckt;  
      dbms_output.put_line(total_tckt_col.LAST); 
       FOR i IN total_tckt_col.first..total_tckt_col.last
      LOOP
      dbms_output.put_line(i);
       END LOOP;
       end;

    Ishan wrote:
    Here is modified version of your code on standard EMP table in scott schema.
    Did you test it? All you demonstrate is last batch has 4 rows. But you print it outsite the loop. This way if last batch is incomplete (has less than limit rows) your loop doesn't process last batch. Assume you want to print enames:
    DECLARE
        CURSOR cur_total_tckt
          IS
            select  ename
              from  emp; -- I have a total of 14 records in this table
            type total_tckt_colcn
              is
                TABLE OF cur_total_tckt%rowtype;
            total_tckt_col total_tckt_colcn;
    BEGIN
        total_tckt_col  := total_tckt_colcn ();
        OPEN cur_total_tckt;
        LOOP
          fetch cur_total_tckt bulk collect into total_tckt_col limit 5;
          EXIT WHEN cur_total_tckt%NOTFOUND;
          FOR v_i IN 1..total_tckt_col.count LOOP
            dbms_output.put_line(total_tckt_col(v_i).ename);
          END LOOP;
        END LOOP ;
        CLOSE cur_total_tckt;
    END;
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    PL/SQL procedure successfully completed.
    SQL>
    As you can see, it didn't print last batch. Why? Because NOTFOUND is set to true if exact number of rows you asked to fetch was not fetched. So last batch has 4 rows while code asks to fetch 5. Therefore, NOTFOUND is set to true and code exits before processing that last batch. So you have to repeat processing code again outside the loop:
    DECLARE
        CURSOR cur_total_tckt
          IS
            select  ename
              from  emp; -- I have a total of 14 records in this table
            type total_tckt_colcn
              is
                TABLE OF cur_total_tckt%rowtype;
            total_tckt_col total_tckt_colcn;
    BEGIN
        total_tckt_col  := total_tckt_colcn ();
        OPEN cur_total_tckt;
        LOOP
          fetch cur_total_tckt bulk collect into total_tckt_col limit 5;
          EXIT WHEN cur_total_tckt%NOTFOUND;
          FOR v_i IN 1..total_tckt_col.count LOOP
            dbms_output.put_line(total_tckt_col(v_i).ename);
          END LOOP;
        END LOOP ;
        FOR v_i IN 1..total_tckt_col.count LOOP
          dbms_output.put_line(total_tckt_col(v_i).ename);
        END LOOP;
        CLOSE cur_total_tckt;
    END;
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
    PL/SQL procedure successfully completed.
    SQL>
    But you must agree repeating that processing code twice isn't best solution. When using BULK COLLECT LIMIT we should exit not by NOTFOUND but rather by collection.count = 0:
    DECLARE
        CURSOR cur_total_tckt
          IS
            select  ename
              from  emp; -- I have a total of 14 records in this table
            type total_tckt_colcn
              is
                TABLE OF cur_total_tckt%rowtype;
            total_tckt_col total_tckt_colcn;
    BEGIN
        total_tckt_col  := total_tckt_colcn ();
        OPEN cur_total_tckt;
        LOOP
          fetch cur_total_tckt bulk collect into total_tckt_col limit 6;
          EXIT WHEN total_tckt_col.count = 0;
          FOR v_i IN 1..total_tckt_col.count LOOP
            dbms_output.put_line(total_tckt_col(v_i).ename);
          END LOOP;
        END LOOP ;
        CLOSE cur_total_tckt;
    END;
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
    PL/SQL procedure successfully completed.
    SQL>
    SY.

  • ORA-06502 during a procedure which uses Bulk collect feature and nested tab

    Hello Friends,
    have created one procedure which uses Bulk collect and nested table to hold the bulk data. This procedure was using one cursor and a nested table with the same type as the cursor to hold data fetched from cursor. Bulk collection technique was used to collect data from cursor to nested table. But it is giving ORA-06502 error.
    I reduced code of procedure to following to trace the error point. But still error is comming. Please help us to find the cause and solve it.
    Script which is giving error:
    declare
    v_Errorflag BINARY_INTEGER;
    v_flag number := 1;
    CURSOR cur_terminal_info Is
    SELECT distinct
    'a' SettlementType
    FROM
    dual;
    TYPE typ_cur_terminal IS TABLE OF cur_terminal_info%ROWTYPE;
    Tab_Terminal_info typ_cur_Terminal;
    BEGIN
    v_Errorflag := 2;
    OPEN cur_terminal_info;
    LOOP
    v_Errorflag := 4;
    FETCH cur_terminal_info BULK COLLECT INTO tab_terminal_info LIMIT 300;
    EXIT WHEN cur_terminal_info%rowcount &lt;= 0;
    v_Errorflag := 5;
    FOR Y IN Tab_Terminal_Info.FIRST..tab_terminal_info.LAST
    LOOP
    dbms_output.put_line(v_flag);
    v_flag := v_flag + 1;
    end loop;
    END LOOP;
    v_Errorflag := 13;
    COMMIT;
    END;
    I have updated script as following to change datatype as varchar2 for nested table, but still same error is
    comming..
    declare
    v_Errorflag BINARY_INTEGER;
    v_flag number := 1;
    CURSOR cur_terminal_info Is
    SELECT distinct
    'a' SettlementType
    FROM
    dual;
    TYPE typ_cur_terminal IS TABLE OF varchar2(50);
    Tab_Terminal_info typ_cur_Terminal;
    BEGIN
    v_Errorflag := 2;
    OPEN cur_terminal_info;
    LOOP
    v_Errorflag := 4;
    FETCH cur_terminal_info BULK COLLECT INTO tab_terminal_info LIMIT 300;
    EXIT WHEN cur_terminal_info%rowcount &lt;= 0;
    v_Errorflag := 5;
    FOR Y IN Tab_Terminal_Info.FIRST..tab_terminal_info.LAST
    LOOP
    dbms_output.put_line(v_flag);
    v_flag := v_flag + 1;
    end loop;
    END LOOP;
    v_Errorflag := 13;
    COMMIT;
    I could not find the exact reason of error.
    Please help us to solve this error.
    Thanks and Regards..
    Dipali..

    Hello Friends,
    I got the solution.. :)
    I did one mistake in procedure where the loop should end.
    I used the statemetn: EXIT WHEN cur_terminal_info%rowcount &lt;= 0;
    But it should be: EXIT WHEN Tab_Terminal_Info.COUNT &lt;= 0;
    Now my script is working fine.. :)
    Thanks and Regards,
    Dipali..

  • Calling Stored procedure which uses Bulk Collect

    Hi All, I have Oracle stored procedure which uses Bulk Collect and returns table type parameter as output. Can anyone please help me how Can I call this kind of stored procedures which returns table type output using VB and Oracle's Driver. (I am successfully able to call using MS ODBC driver, but I want to use OraOLEDB driver.)

    861412 wrote:
    how Can I call this kind of stored procedures which returns table type output using VB and Oracle's Driver. This forum deals with the server-side languages SQL and PL/SQL.
    Your question deals with the client side and Visual Basic language.

  • Please help with an embedded query (INSERT RETURNING BULK COLLECT INTO)

    I am trying to write a query inside the C# code where I would insert values into a table in bulk using bind variables. But I also I would like to receive a bulk collection of generated sequence number IDs for the REQUEST_ID. I am trying to use RETURNING REQUEST_ID BULK COLLECT INTO :REQUEST_IDs clause where :REQUEST_IDs is another bind variable
    Here is a full query that use in the C# code
    string sql = "INSERT INTO REQUESTS_TBL(REQUEST_ID, CID, PROVIDER_ID, PROVIDER_NAME, REQUEST_TYPE_ID, REQUEST_METHOD_ID, " +
    "SERVICE_START_DT, SERVICE_END_DT, SERVICE_LOCATION_CITY, SERVICE_LOCATION_STATE, " +
    "BENEFICIARY_FIRST_NAME, BENEFICIARY_LAST_NAME, BENEFICIARY_DOB, HICNUM, CCN, " +
    "CLAIM_RECEIPT_DT, ADMISSION_DT, BILL_TYPE, LANGUAGE_ID, CONTRACTOR_ID, PRIORITY_ID, " +
    "UNIVERSE_DT, REQUEST_DT, BENEFICIARY_M_INITIAL, ATTENDING_PROVIDER_NUMBER, " +
    "BILLING_NPI, BENE_ZIP_CODE, DRG, FINAL_ALLOWED_AMT, STUDY_ID, REFERRING_NPI) " +
    "VALUES " +
    "(SQ_CDCDATA.NEXTVAL, :CIDs, :PROVIDER_IDs, :PROVIDER_NAMEs, :REQUEST_TYPE_IDs, :REQUEST_METHOD_IDs, " +
    ":SERVICE_START_DTs, :SERVICE_END_DTs, :SERVICE_LOCATION_CITYs, :SERVICE_LOCATION_STATEs, " +
    ":BENEFICIARY_FIRST_NAMEs, :BENEFICIARY_LAST_NAMEs, :BENEFICIARY_DOBs, :HICNUMs, :CCNs, " +
    ":CLAIM_RECEIPT_DTs, :ADMISSION_DTs, :BILL_TYPEs, :LANGUAGE_IDs, :CONTRACTOR_IDs, :PRIORITY_IDs, " +
    ":UNIVERSE_DTs, :REQUEST_DTs, :BENEFICIARY_M_INITIALs, :ATTENDING_PROVIDER_NUMBERs, " +
    ":BILLING_NPIs, :BENE_ZIP_CODEs, :DRGs, :FINAL_ALLOWED_AMTs, :STUDY_IDs, :REFERRING_NPIs) " +
    " RETURNING REQUEST_ID BULK COLLECT INTO :REQUEST_IDs";
    int[] REQUEST_IDs = new int[range];
    cmd.Parameters.Add(":REQUEST_IDs", OracleDbType.Int32, REQUEST_IDs, System.Data.ParameterDirection.Output);
    However, when I run this query, it gives me a strange error ORA-00925: missing INTO keyword. I am not sure what that error means since I am not missing any INTOs
    Please help me resolve this error or I would appreciate a different solution
    Thank you

    It seems you are not doing a bulk insert but rather an array bind.
    (Which you will also find that it is problematic to do an INSERT with a bulk collect returning clause (while this works just fine for update/deletes) :
    http://www.oracle-developer.net/display.php?id=413)
    But you are using array bind, so you simply just need to use a
    ... Returning REQUEST_ID INTO :REQUEST_IDand that'll return you a Rquest_ID[]
    see below for a working example (I used a procedure but the result is the same)
    //Create Table Zzztab(Deptno Number, Deptname Varchar2(50) , Loc Varchar2(50) , State Varchar2(2) , Idno Number(10)) ;
    //create sequence zzzseq ;
    //CREATE OR REPLACE PROCEDURE ZZZ( P_DEPTNO   IN ZZZTAB.DEPTNO%TYPE,
    //                      P_DEPTNAME IN ZZZTAB.DEPTNAME%TYPE,
    //                      P_LOC      IN ZZZTAB.LOC%TYPE,
    //                      P_State    In Zzztab.State%Type ,
    //                      p_idno     out zzztab.idno%type
    //         IS
    //Begin
    //      Insert Into Zzztab (Deptno,   Deptname,   Loc,   State , Idno)
    //                  Values (P_Deptno, P_Deptname, P_Loc, P_State, Zzzseq.Nextval)
    //                  returning idno into p_idno;
    //END ZZZ;
    //Drop Procedure Zzz ;
    //Drop Sequence Zzzseq ;
    //drop Table Zzztab;
      class ArrayBind
        static void Main(string[] args)
          // Connect
            string connectStr = GetConnectionString();
          // Setup the Tables for sample
          Setup(connectStr);
          // Initialize array of data
          int[]    myArrayDeptNo   = new int[3]{1, 2, 3};
          String[] myArrayDeptName = {"Dev", "QA", "Facility"};
          String[] myArrayDeptLoc  = {"New York", "Chicago", "Texas"};
          String[] state = {"NY","IL","TX"} ;
          OracleConnection connection = new OracleConnection(connectStr);
          OracleCommand    command    = new OracleCommand (
            "zzz", connection);
          command.CommandType = CommandType.StoredProcedure;
          // Set the Array Size to 3. This applied to all the parameter in
          // associated with this command
          command.ArrayBindCount = 3;
          command.BindByName = true;
          // deptno parameter
          OracleParameter deptNoParam = new OracleParameter("p_deptno",OracleDbType.Int32);
          deptNoParam.Direction       = ParameterDirection.Input;
          deptNoParam.Value           = myArrayDeptNo;
          command.Parameters.Add(deptNoParam);
          // deptname parameter
          OracleParameter deptNameParam = new OracleParameter("p_deptname", OracleDbType.Varchar2);
          deptNameParam.Direction       = ParameterDirection.Input;
          deptNameParam.Value           = myArrayDeptName;
          command.Parameters.Add(deptNameParam);
          // loc parameter
          OracleParameter deptLocParam = new OracleParameter("p_loc", OracleDbType.Varchar2);
          deptLocParam.Direction       = ParameterDirection.Input;
          deptLocParam.Value           = myArrayDeptLoc;
          command.Parameters.Add(deptLocParam);
          //P_STATE -- -ARRAY
          OracleParameter stateParam = new OracleParameter("P_STATE", OracleDbType.Varchar2);
          stateParam.Direction = ParameterDirection.Input;
          stateParam.Value = state;
          command.Parameters.Add(stateParam);
                  //idParam-- ARRAY
          OracleParameter idParam = new OracleParameter("p_idno", OracleDbType.Int64 );
          idParam.Direction = ParameterDirection.Output ;
          idParam.OracleDbTypeEx = OracleDbType.Int64;
          command.Parameters.Add(idParam);
          try
            connection.Open();
            command.ExecuteNonQuery ();
            Console.WriteLine("{0} Rows Inserted", command.ArrayBindCount);
              //now cycle through the output param array
            foreach (Int64 i in (Int64[])idParam.Value)
                Console.WriteLine(i);
          catch (Exception e)
            Console.WriteLine("Execution Failed:" + e.Message);
          finally
            // connection, command used server side resource, dispose them
            // asap to conserve resource
            connection.Close();
            command.Dispose();
            connection.Dispose();
          Console.WriteLine("Press Enter to finish");
          Console.ReadKey();
        }

Maybe you are looking for

  • Voice Memos won't sync to iTunes anymore

    So for some reason when I sync my iPhone 3G, the voice memos won't sync to my iTunes library. The "Sync voice memos" box is checked and older voice memos from April and before synced in the past. Now there's just a Voice Memos folder under my iPhone

  • How to select data from a PL/SQL table

    Hi, I am selecting data from database after doing some screening i want to store it in a PL/SQL table (temporary area) and pass it to oracle reports. Is there any way to select the data from a PL/SQL table as a cursor. Or is there any other way of ho

  • HOW TO KNOW WHAT APPLICATION HAS OPEN A PDF FORM

    Hello, I would like to know how I can verify that application has opened a certain PDF form (for example Reader or Professional). This checking must be done from the same form when the document is opened (using JavaScript for example). b Thank you fo

  • TV Tuner

    I wanted to buy the MSI TV@nywhere, but after reading the forum... do you think I should get the Winfast TV2000 Deluxe or the Asus TV Tuner?

  • __buildin_expect not available with Solaris 10 x64?

    I would need to build a package called iRRAM which allows the calculation of real number to any accuracy. For example the number "e" to 65 decimals as given bellow. // example input/output of "echo 65|e_example": // Desired Decimals: 65 //+.271828182