xml de lecture d'erreur de la procédure PLSQL
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.
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));