--create types
CREATE OR REPLACE TYPE FILE_CONTENTS_OBJ AS OBJECT
(
              LOG_CONTENTS CLOB
)
; CREATE OR REPLACE TYPE FILE_CONTENTS_TBL_OBJ AS TABLE OF FILE_CONTENTS_OBJ;
-- Create ORACLE directory
CREATE OR REPLACE DIRECTORY MY_DIR AS '/home/your/directory';
-- Create pipelined function using they types and directory
CREATE OR REPLACE FUNCTION RETURN_FILE_CONTENTS
(
              ORACLE_DIR VARCHAR2
             ,FILE_NAME VARCHAR2
) RETURN FILE_CONTENTS_TBL_OBJ PIPELINED AS
              LOG_CONTENT_REC FILE_CONTENTS_OBJ := FILE_CONTENTS_OBJ(LOG_CONTENTS => NULL);
              ALL_CONTENT CLOB;
              SRC_FILE BFILE := BFILENAME(ORACLE_DIR,FILENAME => FILE_NAME);
              OFFST PLS_INTEGER := 1;
              LANG_CTX NUMBER := DBMS_LOB.DEFAULT_LANG_CTX;
              V_WARNING NUMBER;
BEGIN
              DBMS_LOB.OPEN(SRC_FILE, DBMS_LOB.LOB_READONLY);
       
              DBMS_LOB.CREATETEMPORARY(LOB_LOC => ALL_CONTENT, CACHE   => FALSE);
              DBMS_LOB.LOADCLOBFROMFILE(DEST_LOB     => ALL_CONTENT
                                       ,SRC_BFILE    => SRC_FILE
                                       ,AMOUNT       => DBMS_LOB.LOBMAXSIZE
                                       ,SRC_OFFSET   => OFFST
                                       ,DEST_OFFSET  => OFFST
                                       ,BFILE_CSID   => DBMS_LOB.DEFAULT_CSID
                                       ,LANG_CONTEXT => LANG_CTX
                                       ,WARNING      => V_WARNING);
              DBMS_LOB.CLOSE(SRC_FILE);
              IF V_WARNING = 0 THEN
                            LOG_CONTENT_REC := FILE_CONTENTS_OBJ(ALL_CONTENT);
                            DBMS_LOB.FREETEMPORARY(ALL_CONTENT);
                            PIPE ROW(LOG_CONTENT_REC);
              ELSE
                            LOG_CONTENT_REC := FILE_CONTENTS_OBJ('Error reading file. Error number generated from dbms_lob.loadclobromfile was:' || V_WARNING);
                            DBMS_LOB.FREETEMPORARY(ALL_CONTENT);
                            PIPE ROW(LOG_CONTENT_REC);
              END IF;
              -- in a pipelined function, return is needed for syntax purposes only!
              RETURN;
EXCEPTION
              WHEN OTHERS THEN
                            DBMS_LOB.CLOSE(SRC_FILE);
                            DBMS_LOB.FREETEMPORARY(ALL_CONTENT);
            
                            LOG_CONTENT_REC := FILE_CONTENTS_OBJ('Error reading file. Error was: ' || SQLERRM);
                            PIPE ROW(LOG_CONTENT_REC);
            
                            -- in a pipelined function, return is needed for syntax purposes only!
                            RETURN;
            
END;
/* Usage examples */
--Select from pipelined function in your sql statment!:
--SELECT * FROM TABLE(rdsprd.return_file_contents('MY_DIR', 'yourfilename.log'))
A blog to help me remember what in the hell i've done and what not to do again. ever. Maybe you'll learn from my mistakes or epiphanies. Blog topics include SQL, T-SQL, Google, Windows, Visual Basic, Python, C#, etc.
Friday, June 10, 2011
Use select to query filesystem
Use the below code example to create a system that allows you to query system file info (logs, etc) and return them into a table you can select from - all in real time.
Subscribe to:
Post Comments (Atom)
 
No comments:
Post a Comment