Monday, 20 March 2017

Load formatted report in to Oracle using sqlloader

I this post we will learn to load formatted report data from excel or csv files into ORACLE database.

sample data in excel format.

Jan 2002- Dec 2002
St.NameNEJan_2002Feb_2002Mar_2002Apr_2002May_2002June_2002July_2002Aug_2002Sep_2002Oct_2002Nov_2002Dec_2002
Bhakkar31.6166771.06667000000000000
Bahawal-Nagar29.8809973.35250484430191628344040294048
Bahawal-Pur30.5333371.78333454133182029364048414446
CHAKWAL32.9166772.85000000000000000
Jan 2003- Dec 2003
St.NameNEJan_2003Feb_2003Mar_2003Apr_2003May_2003June_2003July_2003Aug_2003Sep_2003Oct_2003Nov_2003Dec_2003
Bhakkar31.6166771.06667000000000000
Bahawal-Nagar29.8809973.35250585137201431555349282946
Bahawal-Pur30.5333371.78333535235191731535551354445
CHAKWAL32.9166772.85000000000000000
D-G-KHAN30.0500070.63333554438221525535453333040
Jan 2004- Dec 2004
St.NameNEJan_2004Feb_2004Mar_2004Apr_2004May_2004June_2004July_2004Aug_2004Sep_2004Oct_2004Nov_2004Dec_2004
Bhakkar31.6166771.06667000000000000
Bahawal-Nagar29.8809973.35250634026191932364939373545
Bahawal-Pur30.5333371.78333594632212230385648454348
CHAKWAL32.9166772.85000000000000000
D-G-KHAN30.0500070.63333554435212134465447404142


To load above data execute following scripts on your database with appropriate user.

I have used scott user for this demo.


Following scrip will create table in which data would be loaded.


create table climate_data
(
city_Name varchar2(100) ,
North varchar2(100) ,
East varchar2(100) ,
Jan varchar2(100) ,
Feb varchar2(100) ,
Mar varchar2(100) ,
Apr varchar2(100) ,
May varchar2(100) ,
Jun varchar2(100) ,
Jul varchar2(100) ,
Aug varchar2(100) ,
Sep varchar2(100) ,
Oct varchar2(100) ,
Nov varchar2(100) ,
Dec varchar2(100),
year_name varchar2(100) )
/


This package will help to hold data temporarily.


CREATE OR REPLACE PACKAGE uldemo7_climate_data AS
    year_name  varchar2(100);
END uldemo7_climate_data;
/


This trigger will convert the formatted data in to our required column in my case I want to populate year_name column.


CREATE OR REPLACE TRIGGER uldemo7_climate_data_insert
  BEFORE INSERT ON climate_data
  FOR EACH ROW

  BEGIN
  IF substr(:new.Dec,1,3) ='Dec' THEN
     uldemo7_climate_data.year_name := substr(:new.Dec,5,4);   -- save value for later use
  ELSE
     :new.year_name := uldemo7_climate_data.year_name;   -- use last valid value
  END IF;

  END;
/


Following triggers is used to  delete extra/garbage  data form the table.


create or replace TRIGGER uldemo7_climate_data_aft_ins
  after INSERT ON climate_data

  BEGIN
 delete from climate_data where year_name is null or city_name like 'Jan%' or north is null;

  END;
  /
 

======================================

To load data using sqlloader


create load_data.ctl  with following contents in any folder  in my case I am using d:\dataloading.



------------------------------------------------------------
-- SQL-Loader Basic Control File
------------------------------------------------------------
options  ( skip=1 )
load data
  INFILE                'mydata.csv'          
truncate into table   scott.climate_data
fields terminated by ','  
trailing nullcols
  (
    city_Name ,
North ,
East ,
Jan ,
Feb ,
Mar ,
Apr ,
May ,
Jun ,
Jul ,
Aug ,
Sep ,
Oct ,
Nov ,
Dec ,
year_name
  )

 
  --------control file end ----------------------
 
in control file mydata.csv is c.v file that we want to load .
climate_data is table in which data would be loaded.
every time we will load data existing data in the table will be truncated.

Now place your mydata.csv in the same folder where control file is placed.i.e d:\dataloading

go to d:\dataloading using command prompt and execute following command.

  sqlldr scott/oracle@gisdb  control='load_data.ctl' log='result.log'

above command will upload data in results will be displayed.

now we can query climate_data to view loaded data.



 
 

No comments:

Post a Comment