Question

Je suis en train de lire un xml de la procédure PLSQL en utilisant le package xmlparser, je reçois cette erreur

ORA-31020: The operation is not allowed, Reason: Not supported
ORA-06512: at "XDB.DBMS_XMLPARSER", line 395
ORA-06512: at "SYS.DOMSAMPLE", line 75
ORA-06512: at line 2

DOMSAMPLE est mon nom de la procédure, et aucune déclaration sont là au numéro de la ligne 75 et la ligne suivante contient p := xmlparser.newParser.

Quelqu'un peut-il aider à me s'il vous plaît résoudre ce problème. Ou suggérer un moyen simple de lire xml dans PLSQL.

Était-ce utile?

La solution

Vous avez fourni des détails au sujet de quelques maigres ce que vous faites réellement, alors je crains que je ne peux que deviner.

Je ne peux pas reproduire le message d'erreur que vous avez, mais je n'ai essayé quelques petites choses. Peut-être que vous appelez les API XML Oracle de façon incorrecte? Peut-être il y a quelque chose d'étrange au sujet du document XML que vous essayez d'analyser? Je crains que je ne sais pas, puisque vous ne nous avez pas donné la source de votre procédure de DOMSAMPLE ni le document XML que vous essayez d'analyser.

Je ne peux pas croire la ligne 75 de votre procédure est une ligne blanche. Est-ce la ligne 75 de la procédure, ou la ligne 75 du fichier qui contient la procédure?

Voici un exemple en utilisant DBMS_XMLPARSER et DBMS_XMLDOM. Il lit simplement le nom de l'élément racine de la chaîne XML donné:

SET SERVEROUTPUT ON;

DECLARE
   p    dbms_xmlparser.parser;
   d    dbms_xmldom.domdocument;
   e    dbms_xmldom.domelement;
BEGIN
   p := dbms_xmlparser.newParser;
   dbms_xmlparser.parseBuffer(p, '<thisIsATest />');
   d := dbms_xmlparser.getDocument(p);
   e := dbms_xmldom.getDocumentElement(d);
   dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e));
END;
/

Quand je lance cela, il me donne la Tag name is thisIsATest de sortie.

Pour ce qui est des moyens plus simples à lire XML, il y a une dans une question que je répondais plus tôt . Je ne sais pas si cela va vous aider, parce que je sais très peu de choses sur ce que vous essayez d'atteindre.

Enfin, s'il vous plaît ne pas créer des objets dans le schéma SYS.

EDIT : dans votre commentaire, vous mentionnez que vous utilisez dbms_xmlparser.parse au lieu de dbms_xmlparser.parseBuffer. J'ai eu un jeu avec dbms_xmlparser.parse et a frappé les mêmes « poignée de ressource non valide ou nom de chemin » erreur plusieurs fois avant de trouver quelque chose qui a fonctionné. Voici ce que j'ai réussi à travailler; il peut bien être une meilleure solution à ce que vous voulez que cela.

Avant de pouvoir faire tout ce que je fichier / O avec Oracle, et qui semble inclure l'utilisation dbms_xmlparser.parse, vous devez d'abord créer un « répertoire » d'Oracle. Répertoires Oracle correspondent aux répertoires du système de fichiers. Notez que ceci est le système de fichiers sur la machine sur laquelle se exécute les bases de données Oracle. Si le fichier XML est pas sur le même système de fichiers (par exemple la base de données Oracle est sur un serveur et votre fichier XML est sur votre PC de développement), vous ne serez pas en mesure d'utiliser dbms_xmlparser.parse, à moins que vous devez d'abord transférer ce fichier dans un répertoire sur le système de fichiers du serveur de base de données.

Je vais commencer par la création d'un répertoire Oracle correspondant à un répertoire sur mon système de fichiers:

SQL> create or replace directory ora_dir as '/home/luke/ora_dir';

Directory created.

Je suis sous Linux ici. Si vous utilisez Windows, vous pouvez inverser le sens des barres obliques.

Avant d'aller plus loin, nous allons jeter un coup d'œil sur le fichier XML que nous lirons dans:

SQL> host cat /home/luke/ora_dir/example.xml
<?xml version="1.0" ?>
<root>
  <child />
</root>

Dans SQL * Plus, host envoie le reste de la ligne à la coque ou cmd.exe sous Windows. Sous Windows vous utiliseriez également type au lieu de cat.

Enfin, voici un bloc PL / SQL qui lit ce fichier XML:

SQL> set serveroutput on
SQL> DECLARE
  2     p    dbms_xmlparser.parser;
  3     d    dbms_xmldom.domdocument;
  4     e    dbms_xmldom.domelement;
  5  BEGIN
  6     p := dbms_xmlparser.newParser;
  7     dbms_xmlparser.setBaseDir(p, 'ORA_DIR');
  8     dbms_xmlparser.parse(p, 'example.xml');
  9     d := dbms_xmlparser.getDocument(p);
 10     e := dbms_xmldom.getDocumentElement(d);
 11     dbms_output.put_line('Tag name is ' || dbms_xmldom.getTagName(e));
 12  END;
 13  /
Tag name is root

PL/SQL procedure successfully completed.

SQL>

La seule différence entre ce bloc et celui plus haut est que la ligne appelée dbms_xmlparser.parseBuffer a été remplacé par deux lignes. La première de ces deux lignes appels dbms_xmlparser.setBaseDir pour définir un répertoire de base pour l'analyseur, et le second appels dbms_xmlparser.parse en utilisant un nom de fichier par rapport à ce répertoire.

EDIT 2: Votre code, ce qui ne fonctionnait pas tout à fait comme vous l'aviez espéré, et que vous avez modifié dans ma réponse est la suivante:

create or replace procedure printElements(doc xmldom.DOMDocument) is
nl xmldom.DOMNodeList;
len number;
n xmldom.DOMNode;
e xmldom.DOMElement;
nodeval varchar2(100);
begin
   -- get all elements
   nl := xmldom.getElementsByTagName(doc, '*');
   len := xmldom.getLength(nl);   
   -- loop through elements
   for i in 0..len-1 loop
      n := xmldom.item(nl, i);
      e := xmldom.makeElement(n => n);
      dbms_output.put(xmldom.getNodeName(n) || ' ');
      nodeval := xmldom.getNodeValue(n);
      -- here nodeval i am getting as null, what mistake am doing?
      dbms_output.put_line('  Value: '|| nodeval );

   end loop;

   dbms_output.put_line('');
end printElements;

Cette apparence revenait toutes les valeurs nulles, comme le suggère le dernier des trois commentaires.

une réponse précédente de mine sur une question similaire :

Dans DOM XML, les éléments ne pas de « valeur » à proprement parler. nœuds éléments contiennent des noeuds de texte que les enfants, et ce sont ces noeuds qui contiennent les valeurs que vous souhaitez.

Alors, essayez de remplacer la ligne

      nodeval := xmldom.getNodeValue(n);

avec

      nodeval := xmldom.getNodeValue(xmldom.getFirstChild(n));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top