I need to write a plsql code which should read channel_id, retailer_id, start_date and end_date column from table multiple_retailer . Then pass these column data as fetch condition in Register table to retrieve data and finally create a csv file out of it.
For example:
select * from register where channel_id=563454 and retailer_id=53 and read_time between '30/08/2018 00:00:00' and '30/08/2018 23:00:00:00';
create a csv file for above result.
Again go to 2nd row of multiple_retailer, pass these columns in register table, fetch the data and append the result in csv file.
Please help me on this.
Edited: I am able to create single file with all retailer_id. How can i split them into multiple files based on Retailer_id.
For example: As shown in below image, i want to create 2 files : 1 with BUSTREAM-R and 1 with CASTLE-R
Below is my code
declare CURSOR C IS select dsc.name Retailer_Name, ch.UDC_ID Meter_Unique_Identifier, dpf.value Frequency, --ch.channel_id,m.start_date,m.end_date,rr.read_time, m.retailer_id ,m.insert_time, TO_CHAR(m.start_date, 'YYYY')||TO_CHAR(m.start_date, 'MM')||TO_CHAR(m.start_date, 'DD')||TO_CHAR(m.start_date, 'HH24')|| TO_CHAR(m.start_date,'MI')||TO_CHAR(m.start_date,'SS')Start_Date, TO_CHAR(m.end_date, 'YYYY')||TO_CHAR(m.end_date, 'MM')||TO_CHAR(m.end_date, 'DD')||TO_CHAR(m.end_date, 'HH24')|| TO_CHAR(m.end_date,'MI')||TO_CHAR(m.end_date,'SS') End_Date, TO_CHAR(rr.Read_time, 'YYYY')||TO_CHAR(rr.Read_time, 'MM')||TO_CHAR(rr.Read_time, 'DD')||TO_CHAR(rr.Read_time, 'HH24')|| TO_CHAR(rr.Read_time,'MI')||TO_CHAR(rr.Read_time,'SS') Meter_Read_Timestamp, TO_CHAR(rr.read_value, '9999999.9') Meter_Read, dp.value Meter_Mode, svc.value SPID --,dense_rank() over ( ORDER BY m.retailer_id ) AS rnk from multiple_retailer m left join (select d.mfg_serial_num,d.udc_id, d.id device_id,c.id as channel_Id, c.name,c.type,dcr.eff_end_time from device d join device_channel_rel dcr on( d.id=dcr.device_id) and dcr.eff_end_time is null join channel c on (dcr.channel_id=c.id) and c.type='Register' ) ch on ch.mfg_serial_num=m.mfg_serial_num left join mudr.register_read rr on rr.read_time between m.start_date and m.end_date and rr.channel_id=ch.channel_id left join data_svc_class dsc on dsc.id=m.retailer_id left join device_param dp on dp.device_id=ch.device_id left join device_param dpf on dpf.device_id=ch.device_id left join svc_pt_device_rel SDR on SDR.device_id=ch.device_id left join (select * from svc_pt_param where name='Water SPID') SVC on SVC.SVC_PT_ID=SDR.SVC_PT_ID where m.status='pending' and dp.name='Connection Mode' and dpf.name='Read Frequency' and dp.eff_end_time is null and dpf.eff_end_time is null order by dsc.name,ch.UDC_ID,rr.read_time --and dsc.name like 'DTS Class for%' ; TYPE rec_list_I IS TABLE OF C%ROWTYPE; recs_I rec_list_I; V_CODE NUMBER; V_ERRM VARCHAR2(1000); v_file UTL_FILE.FILE_TYPE; v_out_file VARCHAR2(1000) ; ldir VARCHAR2(100) := 'ET_MDMSTEST'; f_exists BOOLEAN; F_Size PLS_INTEGER; f_blk_size PLS_INTEGER; --v_Retailer_id varchar2(100); BEGIN --MeterReadsForPAENERGY_20201009042001 SELECT 'MeterReadsFor'|| EXTRACT(year FROM sysdate)||TO_CHAR(sysdate, 'MM')|| TO_CHAR(sysdate, 'DD')||TO_CHAR(SYSDATE,'HH24MISS')||'.CSV' into v_out_file from dual; v_file := UTL_FILE.FOPEN( ldir,v_out_file ,'w',32000); OPEN C; LOOP FETCH C BULK COLLECT INTO recs_I; IF C%ROWCOUNT >0 THEN UTL_FILE.PUT_LINE(v_file, '"Retailer ID","Applicant Company Name",SPID,"Meter Unique Identifier",Frequency,"Start Date","End Date","Meter Read Timestamp","Meter Read","Meter Mode",Comments' ); -- inserting header into file FOR i IN recs_I.FIRST .. recs_I.LAST LOOP UTL_FILE.PUT_LINE(v_file, '"'|| recs_I(i).Retailer_Name || '",' || recs_I(i).SPID || ',' || recs_I(i).Meter_Unique_Identifier || ',' || '"'||recs_I(i).Frequency || '",' || recs_I(i).Start_Date || ',' || recs_I(i).END_DATE || ',' || recs_I(i).Meter_Read_Timestamp || ',' || recs_I(i).Meter_Read || ',' || recs_I(i).Meter_Mode || ',' || ''); END LOOP; UTL_FILE.PUT_LINE(v_file,'row_count='|| C%ROWCOUNT); END IF; exit when C%notfound; END LOOP; UTL_FILE.FCLOSE(v_file); CLOSE C; utl_file.fgetattr(ldir, v_out_file , f_exists, f_size, f_blk_size); -- dbms_output.put_line(f_size); if f_size = 0 then utl_file.fremove(ldir, v_out_file); end if; EXCEPTION WHEN NO_DATA_FOUND THEN UTL_FILE.FCLOSE(v_file); WHEN OTHERS THEN UTL_FILE.FCLOSE(v_file); --DBMS_OUTPUT.PUT_LINE('An EXECUTION!! occured during the process of insert' ); V_CODE := SQLCODE; V_ERRM := SUBSTR(SQLERRM, 1,64); DBMS_OUTPUT.PUT_LINE('PROCESS TERMINATED!! An Exception occured due to '||V_CODE||' ' ||V_ERRM); END; /
Advertisement
Answer
Added my comment as an answer. Please tick it is you’re happy with it as a solution…
If you order your cursor by Retailer_ID then you should be able to use logic in your LOOP to open a new file (and close the previous file) every time the value of Retailer_ID changes