Oracle, The World's Largest Enterprise Software Company
  |  WorldwideChange Country, Oracle Worldwide Web SitesSitefinder
Secure Search
PRODUCTS AND SERVICES INDUSTRIES SUPPORT PARTNERS COMMUNITIES ABOUT

/* Formatted on 2001/06/13 10:13 (RevealNet Formatter v4.4.0) */
CREATE OR REPLACE PROCEDURE loaderrata (xmlfile VARCHAR2)
-- Demonstration of use of Xpath syntax to extract specific values
-- from the infoset and move them into an Oracle table.
IS
   doc      xmldom.domdocument;
   l_isbn   book.isbn%TYPE;

   PROCEDURE parse_document (
      file_in   IN       VARCHAR2,
      doc_out   OUT      xmldom.domdocument
   )
   IS
      prsr   xmlparser.parser;
   BEGIN
      prsr := xmlparser.newparser;
      xmlparser.parse (prsr, file_in);
      doc_out := xmlparser.getdocument (prsr);
      xmlparser.freeparser (prsr);
   END parse_document;

   FUNCTION selected_nodes (
      doc_in     IN   xmldom.domdocument,
      xpath_in   IN   VARCHAR2
   )
      RETURN xmldom.domnodelist
   IS
      retval   xmldom.domnodelist;
   BEGIN
      retval :=
            xslprocessor.selectnodes (
               xmldom.makenode (doc_in),
               xpath_in
            );
      RETURN retval;
   END;

   PROCEDURE load_book (
      doc_in     IN       xmldom.domdocument,
      isbn_out   OUT      book.isbn%TYPE
   )
   IS
      book_info   xmldom.domnodelist;
      l_node      xmldom.domnode;
      book_rec    book%ROWTYPE;
   BEGIN
      book_info := selected_nodes (doc_in, '/errata/book');
      l_node := xmldom.item (book_info, 0);
      book_rec.title :=
                     xslprocessor.valueof (l_node, '@title');
      book_rec.author :=
                    xslprocessor.valueof (l_node, '@author');
      book_rec.isbn :=
                      xslprocessor.valueof (l_node, '@isbn');

      INSERT INTO book
                  (title, author,
                   isbn)
           VALUES (book_rec.title, book_rec.author,
                   book_rec.isbn);

      isbn_out := book_rec.isbn;
   END;

   PROCEDURE extract_errata (
      erratas_in       IN       xmldom.domnodelist,
      index_in         IN       PLS_INTEGER,
      errata_rec_out   OUT      errata%ROWTYPE
   )
   IS
      l_node   xmldom.domnode;
   BEGIN
      l_node := xmldom.item (erratas_in, index_in);
      errata_rec_out.reported_by :=
                xslprocessor.valueof (l_node, 'reported_by');
      errata_rec_out.pagenumber :=
                 xslprocessor.valueof (l_node, 'pagenumber');
      errata_rec_out.problem :=
                    xslprocessor.valueof (l_node, 'problem');
      errata_rec_out.solution :=
                   xslprocessor.valueof (l_node, 'solution');
   END;

   PROCEDURE load_errata (
      doc_in    IN   xmldom.domdocument,
      isbn_in   IN   book.isbn%TYPE
   )
   IS
      erratas      xmldom.domnodelist;
      errata_rec   errata%ROWTYPE;
   BEGIN
      erratas :=
               selected_nodes (doc_in, '/errata/book/entry');

      FOR entry_index IN 0 ..   xmldom.getlength (erratas)
                              - 1
      LOOP
         extract_errata (erratas, entry_index, errata_rec);

         INSERT INTO errata
                     (isbn, reported_by,
                      reported_on, pagenumber,
                      problem,
                      solution)
              VALUES (isbn_in, errata_rec.reported_by,
                      SYSDATE, errata_rec.pagenumber,
                      errata_rec.problem,
                      errata_rec.solution);
      END LOOP;
   END;

   PROCEDURE cleanup (doc IN xmldom.domdocument)
   IS
   BEGIN
      COMMIT;
      xmldom.freedocument (doc);
   END;
BEGIN
   parse_document (xmlfile, doc);
   load_book (doc, l_isbn);
   load_errata (doc, l_isbn);
   cleanup (doc);
EXCEPTION
   WHEN xmldom.index_size_err
   THEN
      raise_application_error (-20120, 'INDEX SIZE error');
   WHEN xmldom.domstring_size_err
   THEN
      raise_application_error (-20120, 'String SIZE error');
   WHEN xmldom.hierarchy_request_err
   THEN
      raise_application_error (
         -20120,
         'Hierarchy request error'
      );
   WHEN xmldom.wrong_document_err
   THEN
      raise_application_error (-20120, 'Wrong doc error');
   WHEN xmldom.invalid_character_err
   THEN
      raise_application_error (-20120, 'Invalid CHAR error');
   WHEN xmldom.no_data_allowed_err
   THEN
      raise_application_error (
         -20120,
         'Nod data allowed error'
      );
   WHEN xmldom.no_modification_allowed_err
   THEN
      raise_application_error (
         -20120,
         'No MOD allowed error'
      );
   WHEN xmldom.not_found_err
   THEN
      raise_application_error (-20120, 'NOT FOUND error');
   WHEN xmldom.not_supported_err
   THEN
      raise_application_error (
         -20120,
         'NOT supported error'
      );
   WHEN xmldom.inuse_attribute_err
   THEN
      raise_application_error (-20120, 'IN USE attr error');
END loaderrata;
/
 E-mail this page  Printer View
Oracle Is The Information Company About Oracle | Oracle RSS Feeds | Subscribe | Careers | Contact Us | Site Maps | Legal Notices | Terms of Use | Privacy