View Full Version : SQL und XML: Fehler bei Create Procedure
Allrounder
23-10-13, 15:55
Hallo,
ich experimentiere gerade mit XML und SQL (V7R1).
Ein Beispiel aus dem Handbuch "Database SQL programming" bekomme ich nicht zum Laufen.
Mit einer SQL-Prozedur soll ein XML-Schema im XSR registriert werden. Beim Versuch die Prozedur zu erstellen bekomme ich die Nachricht "Anzahl definierter oder registrierter Parameterwerte stimmt nicht mit Anzahl der Parameter überein" (SQL-State 07001).
Hier der Code:
CREATE PROCEDURE SAMPLE_REGISTER
LANGUAGE SQL
BEGIN
DECLARE CONTENT BLOB(1M);
VALUES BLOB(’<?xml version="1.0"?><xs:schema ..... </xs:schema>’)
INTO CONTENT;
CALL SYSPROC.XSR_REGISTER(’POSAMPLE’, ’CUSTOMER’,
’http://posample.org’, CONTENT, null);
END
Syntaxfehler?
Prüfe mal die Parameter für XSR_REGISTER.
Problematisch erscheint mir der NULL-Parameter.
da der unspezifiziert ist, musst du hier entsprechend dem Parameter casten, z.B.
CAST(NULL AS VARCHAR(N))
Die Registrierung läuft über IBM i Navigator korrekt (mit NULL).
Es könnte sein, dass die Zuordnung zum Datentyp innerhalb einer stored procedure nicht funktioniert. Definiere doch einfach eine BLOB-Variable, die nicht initialisiert wird (also Wert NULL hat) und übergib diese Variable als Parameter.
Ich hab' es übrigens auch noch nicht geschafft ein gültiges Schema zu registrieren. Der XSR_REGISTER hat zwar funktioniert, aber der XSR_COMPLETE läuft bei mir jedes Mal auf Fehler.
Birgitta
andreaspr@aon.at
24-10-13, 07:21
Hallo,
also bei mir hat beides funktioniert.
Hier ein kleiner Auszug aus meiner Schulung:
(P.S.: Commit ist erforderlich!! Also auch zwischendurch ein COMMIT absetzen)
1. Sicherstellen, dass das XSD nicht schon zuvor registriert wurde
CALL SYSPROC.XSR_remove ('PRANLIB', 'ArrayOfLogin')
2. Variable erstellen und das XSD aus dem IFS importieren
create or replace variable pranlib.var1 blob
set pranlib.var1 =GET_xml_FILE('/home/prouza/login.xsd')
3. XSD registirieren
CALL SYSPROC.XSR_REGISTER('PRANLIB', 'ArrayOfLogin', null,
pranlib.var1 , null)
4. Finalisieren
call sysproc.xsr_complete ('PRANLIB', 'ArrayOfLogin', null, 0)
XSD selbst schaut vereinfacht wie folgt aus:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ArrayOfLogIn">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="LogIn">
<xs:complexType>
<xs:sequence>
<xs:element name="User" type="xs:string" minOccurs="0" />
<xs:element name="Password" type="xs:string" minOccurs="0" />
<!-- usw... -->
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
Interessant wird es dann, wenn du dann das XML in eine Relationale Datenbank importieren willst. Dafür musst du zusätzlich im XSD ein entsprechendes Mapping includieren.
lg Andreas
Allrounder
24-10-13, 09:34
Vielen Dank schonmal für eure Antworten.
Und danke Andreas für das schöne Beispiel.
Schonmal gut zu wissen, dass es funktionieren kann. :)
Auflösen eines XML in eine relationale Datenbank ist das Endziel.
Werde erst einmal einiges umbauen und melde mich dann wieder.
Wenn Du unbedingt mit XML-Schema arbeiten musst, sind die Stlored Procedures die beste Möglichkeit.
Ansonsten kannst Du Dir auch mal den XMLTABLE anschauen. Mit dieser UDTF kann man Werte gezielt aus einem XML-Dokument auslesen und in eine relationale Form bringen. Das SELECT-Statement kann man dann einfach in einem INSERT-Statement unterbringen. Etwa so:
Insert into YourTable
Select *
From XMLTABLE('/root/Dir1/Dir2'
Passing xmlparse(Document Get_xml_file('/home/MyDir/YourXMLDoc.xml'))
Columns "Fld1" Varchar(30),
"Fld2" Varchar(35) Path 'Dir3/Fld2',
"Fld3" Dec(11, 2) Path '../Wert') x;
Birgitta
Allrounder
24-10-13, 10:26
Danke Birgitta für den Tipp, so weit bin ich noch nicht vorgedrungen ... noch ca. 30 Seiten ^^ )
Übrigens habe ich gerade herausgefunden, wo das Problem lag.
Ganz gemein:
Durch das Kopieren des Beispiels aus dem PDF wurde im Navigator das Hochkomma nicht mehr erkannt. :mad:
Nach find / replace funktioniert es jetzt.