For Example We have data in Excel File.
------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------
Now Using the below code as i take example of "viON Consulting Organization".
------------------------------------------------------------------------------------------------------------
Create Custom table to upload the excel file data.
Script:
CREATE TABLE XXviON_HR_POSITION
(
EFFECTIVE_DATE DATE,
SEGMENT1 VARCHAR2(1000 BYTE),
SEGMENT2 VARCHAR2(1000 BYTE),
SEGMENT3 VARCHAR2(1000 BYTE),
SEGMENT4 VARCHAR2(1000 BYTE),
SEGMENT5 VARCHAR2(1000 BYTE),
SEGMENT6 VARCHAR2(1000 BYTE),
TYPE VARCHAR2(1000 BYTE),
STATUS VARCHAR2(1000 BYTE),
ORGANIZATION VARCHAR2(1000 BYTE),
JOB VARCHAR2(1000 BYTE),
LOCATION VARCHAR2(1000 BYTE),
FTE NUMBER,
MAX_PERSONS NUMBER,
PROCESS_FLAG VARCHAR2(1000 BYTE),
ERR_MESSAGE VARCHAR2(1000 BYTE),
POSITION_ID NUMBER,
POSITION_DEFINITION_ID NUMBER
);
------------------------------------------------------------------------------------------------------------
API:
------------------------------------------------------------------------------------------------------------
Create or Replace
PROCEDURE XXviON_create_position_p(errbuf VARCHAR2,retcode NUMBER)
AS
/**************************************************************************
* Developed by : Mandeep Srivastava
*
* Module : APPS.
*
* Title : Create Position
*
* Purpose : API Wrapper script - Position MIGRATION
* This will take the data residing in XXviON_HR_POSITION table and call
* the following API(s):-
*
* apps.hr_position_api.create_position
**************************************************************************/
CURSOR c_position
IS
SELECT *
FROM XXviON_HR_POSITION
WHERE process_flag ='N'
and segment1='Absence Clerk';
v_business_group_id NUMBER := 7954;--viON BG
v_organization_id NUMBER := 0;
v_err_message VARCHAR2 (1000);
v_job_id NUMBER := 0;
v_location_id NUMBER := 0;
v_available_status_type_id NUMBER := 0;
v_position_type VARCHAR2 (1000);
v_position_id NUMBER := 0;
v_effective_start_date DATE;
v_effective_end_date DATE;
v_position_definition_id NUMBER;
v_name VARCHAR2 (1000);
v_object_version_number NUMBER := 0;
x_effective_date DATE ;
/*CREATE TABLE XXviON_HR_POSITION
(
EFFECTIVE_DATE DATE,
SEGMENT1 VARCHAR2(1000 BYTE),
SEGMENT2 VARCHAR2(1000 BYTE),
SEGMENT3 VARCHAR2(1000 BYTE),
SEGMENT4 VARCHAR2(1000 BYTE),
SEGMENT5 VARCHAR2(1000 BYTE),
SEGMENT6 VARCHAR2(1000 BYTE),
TYPE VARCHAR2(1000 BYTE),
STATUS VARCHAR2(1000 BYTE),
ORGANIZATION VARCHAR2(1000 BYTE),
JOB VARCHAR2(1000 BYTE),
LOCATION VARCHAR2(1000 BYTE),
FTE NUMBER,
MAX_PERSONS NUMBER,
PROCESS_FLAG VARCHAR2(1000 BYTE),
ERR_MESSAGE VARCHAR2(1000 BYTE),
POSITION_ID NUMBER,
POSITION_DEFINITION_ID NUMBER
);*/
BEGIN
FOR x IN c_position
LOOP
BEGIN
SELECT haou.organization_id
INTO v_organization_id
FROM apps.hr_all_organization_units haou
WHERE haou.business_group_id = v_business_group_id
AND UPPER (haou.NAME) =
UPPER (RTRIM (LTRIM (x.ORGANIZATION)))
/* AND x_effective_date BETWEEN haou.date_from
AND NVL (haou.date_to,
'31-Dec-4712')*/ ;
EXCEPTION
WHEN OTHERS
THEN
v_organization_id := NULL;
END;
BEGIN
SELECT pj.job_id
INTO v_job_id
FROM apps.per_jobs pj
WHERE UPPER (pj.NAME) = UPPER (RTRIM (LTRIM (x.job)))
AND pj.business_group_id = v_business_group_id
/* AND x_effective_date BETWEEN pj.date_from
AND NVL (pj.date_to,
'31-Dec-4712') */ ;
EXCEPTION
WHEN OTHERS
THEN
v_job_id := NULL;
END;
BEGIN
SELECT hla.location_id
INTO v_location_id
FROM apps.hr_locations_all hla
WHERE UPPER (hla.location_code) = x.LOCATION;
-- AND hla.business_group_id = v_business_group_id;
EXCEPTION
WHEN OTHERS
THEN
v_location_id := NULL;
END;
BEGIN
SELECT pst.shared_type_id
INTO v_available_status_type_id
FROM apps.per_shared_types pst
WHERE lookup_type = 'POSITION_AVAILABILITY_STATUS'
AND UPPER (pst.shared_type_name) = UPPER (x.status);
EXCEPTION
WHEN OTHERS
THEN
v_available_status_type_id := NULL;
END;
BEGIN
SELECT lookup_code
INTO v_position_type
FROM apps.hr_lookups
WHERE lookup_type = 'POSITION_TYPE'
AND UPPER (meaning) = UPPER (x.TYPE);
EXCEPTION
WHEN OTHERS
THEN
v_position_type := NULL;
END;
BEGIN
v_position_id := NULL;
v_effective_start_date := NULL;
v_effective_end_date := NULL;
v_position_definition_id := NULL;
v_name := NULL;
v_object_version_number := NULL;
apps.hr_position_api.create_position (
p_validate => FALSE,
p_position_id => v_position_id,
p_effective_start_date => v_effective_start_date,
p_effective_end_date => v_effective_end_date,
p_position_definition_id => v_position_definition_id,
p_name => v_name,
p_object_version_number => v_object_version_number,
p_job_id => v_job_id,
p_organization_id => v_organization_id,
p_effective_date => x.EFFECTIVE_DATE ,
p_date_effective => x.EFFECTIVE_DATE ,
p_language_code => 'US',
p_availability_status_id => v_available_status_type_id,
p_business_group_id => v_business_group_id,
p_entry_step_id => NULL,
p_entry_grade_rule_id => NULL,
p_location_id => v_location_id,
p_pay_freq_payroll_id => NULL,
p_position_transaction_id => NULL,
p_prior_position_id => NULL,
p_relief_position_id => NULL,
p_entry_grade_id => NULL,
p_successor_position_id => NULL,
p_supervisor_position_id => NULL,
p_amendment_date => NULL,
p_amendment_recommendation => NULL,
p_amendment_ref_number => NULL,
p_bargaining_unit_cd => NULL,
p_comments => NULL,
p_current_job_prop_end_date => NULL,
p_current_org_prop_end_date => NULL,
p_avail_status_prop_end_date => NULL,
p_date_end => NULL,
p_earliest_hire_date => NULL,
p_fill_by_date => NULL,
p_frequency => NULL,
p_fte => x.fte,
p_max_persons => x.fte,
p_overlap_period => NULL,
p_overlap_unit_cd => NULL,
p_pay_term_end_day_cd => NULL,
p_pay_term_end_month_cd => NULL,
p_permanent_temporary_flag => NULL,
p_permit_recruitment_flag => NULL,
p_position_type => NVL (v_position_type, 'NONE'),
p_posting_description => NULL,
p_probation_period => NULL,
p_probation_period_unit_cd => NULL,
p_replacement_required_flag => NULL,
p_review_flag => NULL,
p_seasonal_flag => NULL,
p_security_requirements => NULL,
p_status => NULL,
p_term_start_day_cd => NULL,
p_term_start_month_cd => NULL,
p_time_normal_finish => NULL,
p_time_normal_start => NULL,
p_update_source_cd => NULL,
p_working_hours => NULL,
p_works_council_approval_flag => NULL,
p_work_period_type_cd => NULL,
p_work_term_end_day_cd => NULL,
p_work_term_end_month_cd => NULL,
p_proposed_fte_for_layoff => NULL,
p_proposed_date_for_layoff => NULL,
p_pay_basis_id => NULL,
p_supervisor_id => NULL,
-- ,p_copied_to_old_table_flag in varchar2 default null ,
p_information1 => NULL,
p_information2 => NULL,
p_information3 => NULL,
p_information4 => NULL,
p_information5 => NULL,
p_information6 => NULL,
p_information7 => NULL,
p_information8 => NULL,
p_information9 => NULL,
p_information10 => NULL,
p_information11 => NULL,
p_information12 => NULL,
p_information13 => NULL,
p_information14 => NULL,
p_information15 => NULL,
p_information16 => NULL,
p_information17 => NULL,
p_information18 => NULL,
p_information19 => NULL,
p_information20 => NULL,
p_information21 => NULL,
p_information22 => NULL,
p_information23 => NULL,
p_information24 => NULL,
p_information25 => NULL,
p_information26 => NULL,
p_information27 => NULL,
p_information28 => NULL,
p_information29 => NULL,
p_information30 => NULL,
p_information_category => NULL,
p_attribute1 => NULL,
p_attribute2 => NULL,
p_attribute3 => NULL,
p_attribute4 => NULL,
p_attribute5 => NULL,
p_attribute6 => NULL,
p_attribute7 => NULL,
p_attribute8 => NULL,
p_attribute9 => NULL,
p_attribute10 => NULL,
p_attribute11 => NULL,
p_attribute12 => NULL,
p_attribute13 => NULL,
p_attribute14 => NULL,
p_attribute15 => NULL,
p_attribute16 => NULL,
p_attribute17 => NULL,
p_attribute18 => NULL,
p_attribute19 => NULL,
p_attribute20 => NULL,
p_attribute21 => NULL,
p_attribute22 => NULL,
p_attribute23 => NULL,
p_attribute24 => NULL,
p_attribute25 => NULL,
p_attribute26 => NULL,
p_attribute27 => NULL,
p_attribute28 => NULL,
p_attribute29 => NULL,
p_attribute30 => NULL,
p_attribute_category => NULL,
p_segment1 => x.SEGMENT1,
-- p_segment2 => x.SEGMENT2,
p_segment3 => NULL,
p_segment4 => NULL,
p_segment5 => NULL,
p_segment6 => NULL,
p_segment7 => NULL,
p_segment8 => NULL,
p_segment9 => NULL,
p_segment10 => NULL,
p_segment11 => NULL,
p_segment12 => NULL,
p_segment13 => NULL,
p_segment14 => NULL,
p_segment15 => NULL,
p_segment16 => NULL,
p_segment17 => NULL,
p_segment18 => NULL,
p_segment19 => NULL,
p_segment20 => NULL,
p_segment21 => NULL,
p_segment22 => NULL,
p_segment23 => NULL,
p_segment24 => NULL,
p_segment25 => NULL,
p_segment26 => NULL,
p_segment27 => NULL,
p_segment28 => NULL,
p_segment29 => NULL,
p_segment30 => NULL,
p_concat_segments => NULL,
p_request_id => NULL,
p_program_application_id => NULL,
p_program_id => NULL,
p_program_update_date => NULL,
p_security_profile_id => apps.hr_security.get_security_profile
);
UPDATE XXviON_HR_POSITION t
SET t.process_flag = 'Y',
t.position_id = v_position_id,
t.position_definition_id = v_position_definition_id
WHERE t.SEGMENT1 = x.SEGMENT1 ;
-- COMMIT;
EXCEPTION
WHEN OTHERS
THEN
v_err_message := SUBSTR (SQLERRM, 1, 1000);
UPDATE XXviON_HR_POSITION t
SET t.process_flag = 'E', t.err_message = v_err_message
WHERE t.SEGMENT1 = x.SEGMENT1 ;
-- COMMIT;
END;
END LOOP;
COMMIT;
END XXviON_create_position_p;
----------------------------------------------------------------------------------------------------
After Sucessfully execution of API now verify from front hand.
Navigation.:-
work Structure-->Position-->Description
------------------------------------------------------------------------------------------------------------
| Position Name | Organization | Job | Type |
| Absence Clerk | Payroll | Clerk | Single Incumbent |
| Accounts Assistant | Accounts | Assistant | Single Incumbent |
| Accounts Manager | Accounts | Manager | Single Incumbent |
| Accounts Supervisor | Accounting | Supervisor | Single Incumbent |
| Buyer | Purchasing | Buyer | None |
| Chairman | viON BG | Chairman | Single Incumbent |
| Compensation Analyst | Compensation and Benefits | Analyst | Single Incumbent |
| Compensation and Benefits Assistant | Compensation and Benefits | Assistant | Single Incumbent |
| Compensation and Benefits Manager | Compensation and Benefits | Manager | Single Incumbent |
------------------------------------------------------------------------------------------------------------
Now Using the below code as i take example of "viON Consulting Organization".
------------------------------------------------------------------------------------------------------------
Create Custom table to upload the excel file data.
Script:
CREATE TABLE XXviON_HR_POSITION
(
EFFECTIVE_DATE DATE,
SEGMENT1 VARCHAR2(1000 BYTE),
SEGMENT2 VARCHAR2(1000 BYTE),
SEGMENT3 VARCHAR2(1000 BYTE),
SEGMENT4 VARCHAR2(1000 BYTE),
SEGMENT5 VARCHAR2(1000 BYTE),
SEGMENT6 VARCHAR2(1000 BYTE),
TYPE VARCHAR2(1000 BYTE),
STATUS VARCHAR2(1000 BYTE),
ORGANIZATION VARCHAR2(1000 BYTE),
JOB VARCHAR2(1000 BYTE),
LOCATION VARCHAR2(1000 BYTE),
FTE NUMBER,
MAX_PERSONS NUMBER,
PROCESS_FLAG VARCHAR2(1000 BYTE),
ERR_MESSAGE VARCHAR2(1000 BYTE),
POSITION_ID NUMBER,
POSITION_DEFINITION_ID NUMBER
);
------------------------------------------------------------------------------------------------------------
API:
------------------------------------------------------------------------------------------------------------
Create or Replace
PROCEDURE XXviON_create_position_p(errbuf VARCHAR2,retcode NUMBER)
AS
/**************************************************************************
* Developed by : Mandeep Srivastava
*
* Module : APPS.
*
* Title : Create Position
*
* Purpose : API Wrapper script - Position MIGRATION
* This will take the data residing in XXviON_HR_POSITION table and call
* the following API(s):-
*
* apps.hr_position_api.create_position
**************************************************************************/
CURSOR c_position
IS
SELECT *
FROM XXviON_HR_POSITION
WHERE process_flag ='N'
and segment1='Absence Clerk';
v_business_group_id NUMBER := 7954;--viON BG
v_organization_id NUMBER := 0;
v_err_message VARCHAR2 (1000);
v_job_id NUMBER := 0;
v_location_id NUMBER := 0;
v_available_status_type_id NUMBER := 0;
v_position_type VARCHAR2 (1000);
v_position_id NUMBER := 0;
v_effective_start_date DATE;
v_effective_end_date DATE;
v_position_definition_id NUMBER;
v_name VARCHAR2 (1000);
v_object_version_number NUMBER := 0;
x_effective_date DATE ;
/*CREATE TABLE XXviON_HR_POSITION
(
EFFECTIVE_DATE DATE,
SEGMENT1 VARCHAR2(1000 BYTE),
SEGMENT2 VARCHAR2(1000 BYTE),
SEGMENT3 VARCHAR2(1000 BYTE),
SEGMENT4 VARCHAR2(1000 BYTE),
SEGMENT5 VARCHAR2(1000 BYTE),
SEGMENT6 VARCHAR2(1000 BYTE),
TYPE VARCHAR2(1000 BYTE),
STATUS VARCHAR2(1000 BYTE),
ORGANIZATION VARCHAR2(1000 BYTE),
JOB VARCHAR2(1000 BYTE),
LOCATION VARCHAR2(1000 BYTE),
FTE NUMBER,
MAX_PERSONS NUMBER,
PROCESS_FLAG VARCHAR2(1000 BYTE),
ERR_MESSAGE VARCHAR2(1000 BYTE),
POSITION_ID NUMBER,
POSITION_DEFINITION_ID NUMBER
);*/
BEGIN
FOR x IN c_position
LOOP
BEGIN
SELECT haou.organization_id
INTO v_organization_id
FROM apps.hr_all_organization_units haou
WHERE haou.business_group_id = v_business_group_id
AND UPPER (haou.NAME) =
UPPER (RTRIM (LTRIM (x.ORGANIZATION)))
/* AND x_effective_date BETWEEN haou.date_from
AND NVL (haou.date_to,
'31-Dec-4712')*/ ;
EXCEPTION
WHEN OTHERS
THEN
v_organization_id := NULL;
END;
BEGIN
SELECT pj.job_id
INTO v_job_id
FROM apps.per_jobs pj
WHERE UPPER (pj.NAME) = UPPER (RTRIM (LTRIM (x.job)))
AND pj.business_group_id = v_business_group_id
/* AND x_effective_date BETWEEN pj.date_from
AND NVL (pj.date_to,
'31-Dec-4712') */ ;
EXCEPTION
WHEN OTHERS
THEN
v_job_id := NULL;
END;
BEGIN
SELECT hla.location_id
INTO v_location_id
FROM apps.hr_locations_all hla
WHERE UPPER (hla.location_code) = x.LOCATION;
-- AND hla.business_group_id = v_business_group_id;
EXCEPTION
WHEN OTHERS
THEN
v_location_id := NULL;
END;
BEGIN
SELECT pst.shared_type_id
INTO v_available_status_type_id
FROM apps.per_shared_types pst
WHERE lookup_type = 'POSITION_AVAILABILITY_STATUS'
AND UPPER (pst.shared_type_name) = UPPER (x.status);
EXCEPTION
WHEN OTHERS
THEN
v_available_status_type_id := NULL;
END;
BEGIN
SELECT lookup_code
INTO v_position_type
FROM apps.hr_lookups
WHERE lookup_type = 'POSITION_TYPE'
AND UPPER (meaning) = UPPER (x.TYPE);
EXCEPTION
WHEN OTHERS
THEN
v_position_type := NULL;
END;
BEGIN
v_position_id := NULL;
v_effective_start_date := NULL;
v_effective_end_date := NULL;
v_position_definition_id := NULL;
v_name := NULL;
v_object_version_number := NULL;
apps.hr_position_api.create_position (
p_validate => FALSE,
p_position_id => v_position_id,
p_effective_start_date => v_effective_start_date,
p_effective_end_date => v_effective_end_date,
p_position_definition_id => v_position_definition_id,
p_name => v_name,
p_object_version_number => v_object_version_number,
p_job_id => v_job_id,
p_organization_id => v_organization_id,
p_effective_date => x.EFFECTIVE_DATE ,
p_date_effective => x.EFFECTIVE_DATE ,
p_language_code => 'US',
p_availability_status_id => v_available_status_type_id,
p_business_group_id => v_business_group_id,
p_entry_step_id => NULL,
p_entry_grade_rule_id => NULL,
p_location_id => v_location_id,
p_pay_freq_payroll_id => NULL,
p_position_transaction_id => NULL,
p_prior_position_id => NULL,
p_relief_position_id => NULL,
p_entry_grade_id => NULL,
p_successor_position_id => NULL,
p_supervisor_position_id => NULL,
p_amendment_date => NULL,
p_amendment_recommendation => NULL,
p_amendment_ref_number => NULL,
p_bargaining_unit_cd => NULL,
p_comments => NULL,
p_current_job_prop_end_date => NULL,
p_current_org_prop_end_date => NULL,
p_avail_status_prop_end_date => NULL,
p_date_end => NULL,
p_earliest_hire_date => NULL,
p_fill_by_date => NULL,
p_frequency => NULL,
p_fte => x.fte,
p_max_persons => x.fte,
p_overlap_period => NULL,
p_overlap_unit_cd => NULL,
p_pay_term_end_day_cd => NULL,
p_pay_term_end_month_cd => NULL,
p_permanent_temporary_flag => NULL,
p_permit_recruitment_flag => NULL,
p_position_type => NVL (v_position_type, 'NONE'),
p_posting_description => NULL,
p_probation_period => NULL,
p_probation_period_unit_cd => NULL,
p_replacement_required_flag => NULL,
p_review_flag => NULL,
p_seasonal_flag => NULL,
p_security_requirements => NULL,
p_status => NULL,
p_term_start_day_cd => NULL,
p_term_start_month_cd => NULL,
p_time_normal_finish => NULL,
p_time_normal_start => NULL,
p_update_source_cd => NULL,
p_working_hours => NULL,
p_works_council_approval_flag => NULL,
p_work_period_type_cd => NULL,
p_work_term_end_day_cd => NULL,
p_work_term_end_month_cd => NULL,
p_proposed_fte_for_layoff => NULL,
p_proposed_date_for_layoff => NULL,
p_pay_basis_id => NULL,
p_supervisor_id => NULL,
-- ,p_copied_to_old_table_flag in varchar2 default null ,
p_information1 => NULL,
p_information2 => NULL,
p_information3 => NULL,
p_information4 => NULL,
p_information5 => NULL,
p_information6 => NULL,
p_information7 => NULL,
p_information8 => NULL,
p_information9 => NULL,
p_information10 => NULL,
p_information11 => NULL,
p_information12 => NULL,
p_information13 => NULL,
p_information14 => NULL,
p_information15 => NULL,
p_information16 => NULL,
p_information17 => NULL,
p_information18 => NULL,
p_information19 => NULL,
p_information20 => NULL,
p_information21 => NULL,
p_information22 => NULL,
p_information23 => NULL,
p_information24 => NULL,
p_information25 => NULL,
p_information26 => NULL,
p_information27 => NULL,
p_information28 => NULL,
p_information29 => NULL,
p_information30 => NULL,
p_information_category => NULL,
p_attribute1 => NULL,
p_attribute2 => NULL,
p_attribute3 => NULL,
p_attribute4 => NULL,
p_attribute5 => NULL,
p_attribute6 => NULL,
p_attribute7 => NULL,
p_attribute8 => NULL,
p_attribute9 => NULL,
p_attribute10 => NULL,
p_attribute11 => NULL,
p_attribute12 => NULL,
p_attribute13 => NULL,
p_attribute14 => NULL,
p_attribute15 => NULL,
p_attribute16 => NULL,
p_attribute17 => NULL,
p_attribute18 => NULL,
p_attribute19 => NULL,
p_attribute20 => NULL,
p_attribute21 => NULL,
p_attribute22 => NULL,
p_attribute23 => NULL,
p_attribute24 => NULL,
p_attribute25 => NULL,
p_attribute26 => NULL,
p_attribute27 => NULL,
p_attribute28 => NULL,
p_attribute29 => NULL,
p_attribute30 => NULL,
p_attribute_category => NULL,
p_segment1 => x.SEGMENT1,
-- p_segment2 => x.SEGMENT2,
p_segment3 => NULL,
p_segment4 => NULL,
p_segment5 => NULL,
p_segment6 => NULL,
p_segment7 => NULL,
p_segment8 => NULL,
p_segment9 => NULL,
p_segment10 => NULL,
p_segment11 => NULL,
p_segment12 => NULL,
p_segment13 => NULL,
p_segment14 => NULL,
p_segment15 => NULL,
p_segment16 => NULL,
p_segment17 => NULL,
p_segment18 => NULL,
p_segment19 => NULL,
p_segment20 => NULL,
p_segment21 => NULL,
p_segment22 => NULL,
p_segment23 => NULL,
p_segment24 => NULL,
p_segment25 => NULL,
p_segment26 => NULL,
p_segment27 => NULL,
p_segment28 => NULL,
p_segment29 => NULL,
p_segment30 => NULL,
p_concat_segments => NULL,
p_request_id => NULL,
p_program_application_id => NULL,
p_program_id => NULL,
p_program_update_date => NULL,
p_security_profile_id => apps.hr_security.get_security_profile
);
UPDATE XXviON_HR_POSITION t
SET t.process_flag = 'Y',
t.position_id = v_position_id,
t.position_definition_id = v_position_definition_id
WHERE t.SEGMENT1 = x.SEGMENT1 ;
-- COMMIT;
EXCEPTION
WHEN OTHERS
THEN
v_err_message := SUBSTR (SQLERRM, 1, 1000);
UPDATE XXviON_HR_POSITION t
SET t.process_flag = 'E', t.err_message = v_err_message
WHERE t.SEGMENT1 = x.SEGMENT1 ;
-- COMMIT;
END;
END LOOP;
COMMIT;
END XXviON_create_position_p;
----------------------------------------------------------------------------------------------------
After Sucessfully execution of API now verify from front hand.
Navigation.:-
work Structure-->Position-->Description
Kindly provide your feedback.
Leave a comment for any query.
|

this is very nice article and very good information for Oracle Learners. our Cubtraining also provide all Oracle Courses
ReplyDelete