bcp out for Oracle
As of Oracle 8i (which I believe is no longer supported) there was no utility to unload data. I guess Oracle felt that once the got the data, there was no reason to relinquesh it. In any case, for myself, and my rusty Oracle, here a sample of code on how to code in PLSQL as well as how to perform an extract. I know it'll be hard from a sql server perspective, but this actually flies.
-- @Q:\Packages\Ben_Extract_Package.pkg;
-- EXEC Ben_Extract_Package.Ex_ENR_PARTIC_sp;
-- EXEC Ben_Extract_Package.Ex_ENR_PARTIC_PLAN_sp;
-- EXEC Ben_Extract_Package.Ex_ENR_PARTIC_DPND_sp;
-- EXEC Ben_Extract_Package.Ex_ENR_DPND_BENEF_sp;
-- ***********************************************************************
-- * Prudential Benefits Annual Enrollment System *
-- * *
-- * Description: Extract Feed to PeopleSoft *
-- * Specifications used: *
-- * Web-IVR_To_PeopleSoft_Files_Layout.doc *
-- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - *
-- * Modifications Log: *
-- * *
-- * User Date Description *
-- * -------- ---------- ------------------------------------------------*
-- * x002548 07/19/2000 Initial Version *
-- * x002548 10/12/2000 Modify PESP Extract to include format changes, *
-- * Change the amount fields to 2 byte integers *
-- * x002548 09/25/2000 Modify PESP Extract to include format changes, *
-- * truncate the National_Id to 9 bytes from 15, and*
-- * add a trailer record *
-- * - - - - - - - - - - - - - 2002 Changes - - - - - - - - - - - - - - -*
-- * x091589 08/22/2001 Add SCHED_ID to Ex_ENR_PARTIC_sp *
-- * Ex_ENR_PARTIC_PLAN_sp *
-- * Ex_ENR_PARTIC_DPND_sp *
-- * x091589 08/22/2001 Add STUDENT_CERTIFY to Ex_ENR_DPND_BENEF_sp *
-- * x091589 08/22/2001 Remove Ex_PESP_sp *
-- * x091589 10/03/2001 Increase the size of EMPL_CONTRBUTN_AMT from 8-9*
-- * When Null *
-- * *
-- ***********************************************************************
-- ********** S T A R T - G L O B A L - D E C L A R A T I O N S **********
-- ***********************************************************************
CREATE OR REPLACE PACKAGE Ben_Extract_Package AS
I_FileType utl_file.file_type;
I_FilePath VarChar2(200);
I_FileName VarChar2(50);
O_SqlCode Number;
O_SqlErrM VarChar2(254);
O_RowCount Number;
-- ***********************************************************************
-- * Procedure Calls *
-- ***********************************************************************
PROCEDURE Ex_ENR_PARTIC_sp;
PROCEDURE Ex_ENR_PARTIC_PLAN_sp;
PROCEDURE Ex_ENR_PARTIC_DPND_sp;
PROCEDURE Ex_ENR_DPND_BENEF_sp;
END Ben_Extract_Package;
/
CREATE OR REPLACE PACKAGE BODY Ben_Extract_Package
AS
-- **********************************************************************
-- *** P R O C E D U R E (Ex_ENR_PARTIC_sp) D E C L A R A T I O N S *****
-- **********************************************************************
PROCEDURE Ex_ENR_PARTIC_sp AS
v_row_count number := 0;
Begin
-- Declare Cursor to extract the ENR_PARTIC table as a 1 Column fixed width 124 bytes
-- called Unload_String
Declare Cursor
CSR_ENR_PARTIC IS
SELECT
RPAD(A.EMPLID,11)
||NVL((RPAD(A.BENEFIT_PROGRAM,3)), ' ')
||NVL((RPAD(A.EVENT_CLASS,3)), ' ')
||NVL((RPAD(A.EVENT_STATUS,1)), ' ')
||NVL((RPAD(A.BAS_PROCESS_STATUS,2)), ' ')
||NVL((TO_CHAR(A.EVENT_DT, 'YYYY-MM-DD')),' ')
||NVL((RPAD(A.ELECT_SUMM,1)), ' ')
||NVL((TO_CHAR(A.ELECT_SUMM_DT, 'YYYY-MM-DD')),' ')
||NVL((RPAD(A.SURVEY_COMPLETE,1)), ' ')
||NVL((TO_CHAR(A.SURVEY_COMPLETE_DT, 'YYYY-MM-DD')),' ')
||NVL((TO_CHAR(A.DATAASOF_DT, 'YYYY-MM-DD')),' ')
||NVL((TO_CHAR(A.DATAIN_DT, 'YYYY-MM-DD')),' ')
||NVL((TO_CHAR(A.DATAOUT_DT, 'YYYY-MM-DD')),' ')
||TO_CHAR(A.LASTUPDDTTM, 'yyyy-mm-dd-hh24.mi.ss')||'.000000'
||NVL((RPAD(A.LASTUPDUSER,15)),' ')
||NVL((RPAD(A.LASTUPDVEH,1)), ' ')
||RPAD(NVL(C.SCHED_ID,' '),6) AS Unload_String
FROM ENR_PARTIC A
,ENR_EMPLOY_DATA B
,ENR_USER_SCRTY C
WHERE A.EMPLID = B.EMPLID
AND B.NATIONAL_ID = C.NATIONAL_ID;
csr_Columns CSR_ENR_PARTIC%ROWTYPE;
Begin
Ben_Extract_Package.O_SqlCode := 0;
Ben_Extract_Package.O_SqlErrM := 'Normal Completion';
Ben_Extract_Package.I_FileName := 'ENR_PARTIC.txt';
Ben_Extract_Package.I_FilePath := 'D:\Benefits\Extracts\';
I_FileType := utl_file.fopen (I_FilePath,I_FileName,'W');
Ben_Extract_Package.O_RowCount := 0;
-- Fetch rows and write records. The Cursor Open, Fetch and Close is dynamic
For csr_Columns IN CSR_ENR_PARTIC
Loop
v_row_count := v_row_count + 1;
utl_file.put_line(Ben_Extract_Package.I_FileType, csr_Columns.Unload_String);
Ben_Extract_Package.O_RowCount := Ben_Extract_Package.O_RowCount + 1;
End Loop;
utl_file.fclose (Ben_Extract_Package.I_FileType);
dbms_output.put_line('ENR_PARTIC EXTRACT COUNT:'||to_char(v_row_count));
EXCEPTION
WHEN utl_file.invalid_path THEN
dbms_output.put_line(' FAILS Extract - Invalid path');
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid File Path';
WHEN utl_file.invalid_operation THEN
dbms_output.put_line(' FAILS Extract - Invalid operation');
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Operation';
WHEN utl_file.invalid_mode THEN
dbms_output.put_line(' FAILS Extract - Invalid mode');
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Mode';
WHEN OTHERS THEN
dbms_output.put_line('SqlError:='||SQLERRM||' SQLCODE:='||SQLCODE);
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := SqlErrM(SqlCode);
End;
END Ex_ENR_PARTIC_sp;
-- ***************************************************************************
-- *** P R O C E D U R E (Ex_ENR_PARTIC_PLAN_sp) D E C L A R A T I O N S *****
-- ***************************************************************************
PROCEDURE Ex_ENR_PARTIC_PLAN_sp AS
v_row_count number := 0;
Begin
-- Declare Cursor to extract the ENR_PARTIC_PLAN table as fixed width 124 bytes
Declare Cursor
CSR_ENR_PARTIC_PLAN IS
SELECT
RPAD(A.EMPLID,11)
||RPAD(A.PLAN_TYPE,2)
||RPAD(NVL(A.BENEFIT_PROGRAM,' '),3)
||RPAD(NVL(TO_CHAR(A.EVENT_DT, 'YYYY-MM-DD'), ' '),10)
||RPAD(NVL(A.DISPLAY_PLN_SEQ,' '),2)
||RPAD(NVL(A.ELECTION_MADE,' '),1)
||RPAD(NVL(A.PROOF_RCVD,' '),1)
||RPAD(NVL(A.OPTION_CD,' '),3)
||RPAD(NVL(A.ALT_OPTION_CD,' '),3)
||NVL(LPAD(TO_CHAR(A.PCT_GROSS, +990.999),8,0),' 0.000')
||NVL(LPAD(TO_CHAR(A.PCT_GROSS_ATAX, +990.999),8,0),' 0.000')
||NVL(LPAD(TO_CHAR(A.CUR_PCT_GROSS, +990.999),8,0),' 0.000')
||NVL(LPAD(TO_CHAR(A.CUR_PCT_GROSS_ATAX, +990.999),8,0),' 0.000')
||NVL(LPAD(TO_CHAR(A.EMPL_CONTRBUTN_AMT, +99990.99),9,0),' 0.00')
||NVL(LPAD(TO_CHAR(A.ANNUAL_PLEDGE, +99990.99),9,0),' 0.00')
||RPAD(NVL(A.CUR_HLTH_PROVIDER,' '),1)
||RPAD(NVL(A.HLTH_PROVIDER_ID1,' '),30)
||RPAD(NVL(A.HLTH_PROVIDER_ID2,' '),30)
||RPAD(NVL(A.HIGHLY_COMP_EE,' '),1)
||RPAD(NVL((TO_CHAR(A.LASTUPDDTTM, 'yyyy-mm-dd-hh24.mi.ss')||'.000000'),' '),26)
||RPAD(NVL(A.LASTUPDUSER,' '),15)
||RPAD(NVL(A.LASTUPDVEH,' '),1)
||RPAD(NVL(C.SCHED_ID,' '),6) AS Unload_String
FROM ENR_PARTIC_PLAN A
,ENR_EMPLOY_DATA B
,ENR_USER_SCRTY C
WHERE A.EMPLID = B.EMPLID
AND B.NATIONAL_ID = C.NATIONAL_ID;
csr_Columns CSR_ENR_PARTIC_PLAN%ROWTYPE;
Begin
Ben_Extract_Package.O_SqlCode := 0;
Ben_Extract_Package.O_SqlErrM := 'Normal Completion';
Ben_Extract_Package.I_FileName := 'ENR_PARTIC_PLAN.txt';
Ben_Extract_Package.I_FilePath := 'D:\Benefits\Extracts\';
-- Open File
Ben_Extract_Package.I_FileType := utl_file.fopen (Ben_Extract_Package.I_FilePath,Ben_Extract_Package.I_FileName,'w');
Ben_Extract_Package.O_RowCount := 0;
-- Fetch rows and write records. The Cursor Open, Fetch and Close is dynamic
For csr_Columns IN CSR_ENR_PARTIC_PLAN
Loop
v_row_count := v_row_count + 1;
utl_file.put_line(Ben_Extract_Package.I_FileType, csr_Columns.Unload_String);
Ben_Extract_Package.O_RowCount := Ben_Extract_Package.O_RowCount + 1;
End Loop;
utl_file.fclose (Ben_Extract_Package.I_FileType);
dbms_output.put_line('ENR_PARTIC_PLAN EXTRACT COUNT:'||to_char(v_row_count));
EXCEPTION
WHEN utl_file.invalid_path THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid File Path';
WHEN utl_file.invalid_operation THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Operation';
WHEN utl_file.invalid_mode THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Mode';
WHEN OTHERS THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := SqlErrM(SqlCode);
End;
END Ex_ENR_PARTIC_PLAN_sp;
-- ***************************************************************************
-- *** P R O C E D U R E (Ex_ENR_PARTIC_DPND_sp) D E C L A R A T I O N S *****
-- ***************************************************************************
PROCEDURE Ex_ENR_PARTIC_DPND_sp AS
v_row_count number := 0;
Begin
-- Declare Cursor to extract the ENR_PARTIC_DPND table as fixed width n bytes
Declare Cursor
CSR_ENR_PARTIC_DPND IS
SELECT
RPAD(A.EMPLID,11)
||RPAD(A.PLAN_TYPE,2)
||RPAD(NVL(A.DEPENDENT_BENEF,' '),2)
||RPAD(NVL(A.BENEFIT_PROGRAM,' '),3)
||RPAD(NVL(TO_CHAR(A.EVENT_DT, 'YYYY-MM-DD'), ' '),10)
||RPAD(NVL(A.DISPLAY_PLN_SEQ,' '),2)
||LPAD(TO_CHAR(NVL(A.BENEF_PCT,0)),3,'0')
||RPAD(NVL(A.CONTINGENT,' '),1)
||RPAD(NVL(A.HLTH_PROVIDER_ID1,' '),30)
||RPAD(NVL(A.HLTH_PROVIDER_ID2,' '),30)
||RPAD(NVL(A.CUR_HLTH_PROVIDER,' '),1)
||RPAD(NVL(C.SCHED_ID,' '),6) AS Unload_String
FROM ENR_PARTIC_DPND A
,ENR_EMPLOY_DATA B
,ENR_USER_SCRTY C
WHERE A.EMPLID = B.EMPLID
AND B.NATIONAL_ID = C.NATIONAL_ID;
csr_Columns CSR_ENR_PARTIC_DPND%ROWTYPE;
Begin
Ben_Extract_Package.O_SqlCode := 0;
Ben_Extract_Package.O_SqlErrM := 'Normal Completion';
Ben_Extract_Package.I_FileName := 'ENR_PARTIC_DPND.txt';
Ben_Extract_Package.I_FilePath := 'D:\Benefits\Extracts\';
-- Open File
Ben_Extract_Package.I_FileType := utl_file.fopen (Ben_Extract_Package.I_FilePath,Ben_Extract_Package.I_FileName,'w');
Ben_Extract_Package.O_RowCount := 0;
-- Fetch rows and write records. The Cursor Open, Fetch and Close is dynamic
For csr_Columns IN CSR_ENR_PARTIC_DPND
Loop
v_row_count := v_row_count + 1;
utl_file.put_line(Ben_Extract_Package.I_FileType, csr_Columns.Unload_String);
Ben_Extract_Package.O_RowCount := Ben_Extract_Package.O_RowCount + 1;
End Loop;
utl_file.fclose (Ben_Extract_Package.I_FileType);
dbms_output.put_line('ENR_PARTIC_DPND EXTRACT COUNT:'||to_char(v_row_count));
EXCEPTION
WHEN utl_file.invalid_path THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid File Path';
WHEN utl_file.invalid_operation THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Operation';
WHEN utl_file.invalid_mode THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Mode';
WHEN OTHERS THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := SqlErrM(SqlCode);
End;
END Ex_ENR_PARTIC_DPND_sp;
-- **************************************************************************
-- *** P R O C E D U R E (Ex_ENR_DPND_BENEF_sp) D E C L A R A T I O N S *****
-- **************************************************************************
PROCEDURE Ex_ENR_DPND_BENEF_sp AS
v_row_count number := 0;
Begin
-- Declare Cursor to extract the ENR_DPND_BENEF table as fixed width n bytes
Declare Cursor
CSR_ENR_DPND_BENEF IS
SELECT
RPAD(A.EMPLID,11)
||RPAD(A.DEPENDENT_BENEF,2)
||RPAD(NVL(A.NAME,' '),50)
||RPAD(NVL(A.SAME_ADDRESS_EMPL,' '),1)
||RPAD(NVL(A.ADDRESS1,' '),35)
||RPAD(NVL(A.ADDRESS2,' '),35)
||RPAD(NVL(A.ADDRESS3,' '),35)
||RPAD(NVL(A.ADDRESS4,' '),35)
||RPAD(NVL(A.CITY,' '),30)
||RPAD(NVL(A.STATE,' '),6)
||RPAD(NVL(A.POSTAL,' '),12)
||RPAD(NVL(A.RELATIONSHIP,' '),2)
||RPAD(NVL(A.DEP_BENEF_TYPE,' '),1)
||RPAD(NVL(A.MAR_STATUS,' '),1)
||RPAD(NVL(TO_CHAR(A.MAR_STATUS_DT, 'YYYY-MM-DD'), ' '),10)
||RPAD(NVL(A.SEX,' '),1)
||RPAD(NVL(TO_CHAR(A.BIRTHDATE, 'YYYY-MM-DD'), ' '),10)
||RPAD(NVL(A.STUDENT,' '),1)
||RPAD(NVL(A.DISABLED,' '),1)
||RPAD(NVL(A.NATIONAL_ID,' '),15)
||RPAD(NVL(A.DPND_CERTIFY,' '),1)
||RPAD(NVL(A.QA_CERTIFY,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP1,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP2,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP3,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP4,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP5,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP6,' '),1)
||RPAD(NVL(A.QA_CERTIFY_DP7,' '),1)
||RPAD(NVL(A.QA_CERTIFY_EF1,' '),1)
||RPAD(NVL(A.QA_CERTIFY_EF2,' '),1)
||RPAD(NVL(A.QA_CERTIFY_EF3,' '),1)
||RPAD(NVL(A.QA_CERTIFY_EF4,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR1,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR2,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR3,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR4,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR5,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR6,' '),1)
||RPAD(NVL(A.QA_CERTIFY_AR7,' '),1)
||RPAD(NVL(A.NEW_RCD,' '),1)
||RPAD(NVL((TO_CHAR(A.LASTUPDDTTM, 'yyyy-mm-dd-hh24.mi.ss')||'.000000'),' '),26)
||RPAD(NVL(A.LASTUPDUSER,' '),15)
||RPAD(NVL(A.LASTUPDVEH,' '),1)
||RPAD(NVL(A.STUDENT_CERTIFY,' '),1) AS Unload_String
FROM ENR_DPND_BENEF A;
csr_Columns CSR_ENR_DPND_BENEF%ROWTYPE;
Begin
Ben_Extract_Package.O_SqlCode := 0;
Ben_Extract_Package.O_SqlErrM := 'Normal Completion';
Ben_Extract_Package.I_FileName := 'ENR_DPND_BENEF.txt';
Ben_Extract_Package.I_FilePath := 'D:\Benefits\Extracts\';
-- Open File
Ben_Extract_Package.I_FileType := utl_file.fopen (Ben_Extract_Package.I_FilePath,Ben_Extract_Package.I_FileName,'w');
Ben_Extract_Package.O_RowCount := 0;
-- Fetch rows and write records. The Cursor Open, Fetch and Close is dynamic
For csr_Columns IN CSR_ENR_DPND_BENEF
Loop
v_row_count := v_row_count + 1;
utl_file.put_line(Ben_Extract_Package.I_FileType, csr_Columns.Unload_String);
Ben_Extract_Package.O_RowCount := Ben_Extract_Package.O_RowCount + 1;
End Loop;
utl_file.fclose (Ben_Extract_Package.I_FileType);
dbms_output.put_line('ENR_DPND_BENEF EXTRACT COUNT:'||to_char(v_row_count));
EXCEPTION
WHEN utl_file.invalid_path THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid File Path';
WHEN utl_file.invalid_operation THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Operation';
WHEN utl_file.invalid_mode THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := 'Invalid Mode';
WHEN OTHERS THEN
Ben_Extract_Package.O_SqlCode := SqlCode;
Ben_Extract_Package.O_SqlErrM := SqlErrM(SqlCode);
End;
END Ex_ENR_DPND_BENEF_sp;
END Ben_Extract_Package;
/
Legacy Comments
breakdance
2005-05-06 |
re: bcp out for Oracle thanks |
eyechart
2005-05-18 |
re: bcp out for Oracle this seems overly complicated. why not use something like this: set echo off newpage 0 space 0 pagesize 0 feed off head off trimspool on spool oradata.txt select col1 || ',' || col2 || ',' || col3 from tab1 where col2 = 'XYZ'; spool off -ec |
Brett (Not just a Number...huh?)
2005-05-18 |
re: bcp out for Oracle Thanks eyechart...but how do you move that to a production environment so it can run completely hands off. Also, don't forget that there is a potential that you will blow out the buffer depending on the volume of the data. Unless the options feed off head off trimspool on handle that? Also can that be run in a package? And does anyone have a prefered method as proposed by Oracle? To me it's akin to the DTS vs. bcp debate (is there really a debate) on which to use. Moving DTS to a production environment is not easy. Or can be fully tested. Does anyone know if Oracle developed a utility to perform this? They've had SQL Loader around since 8i. Why wouldn't they have provided a SQL unloader? |