PDA

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?

Fuerchau
23-10-13, 16:05
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))

B.Hauser
23-10-13, 16:20
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.

B.Hauser
24-10-13, 09:54
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.