KEY and KEYREF support in Oracle XML DB
335420Nov 5 2003 — edited Jan 27 2004First of all, sorry for my english but I am a spanish researcher who have not been abroad too much :-).
I�m trying to use XML DB to store XML documents that represents UML models and the way I've choosed to map relationships in my schema is using KEY and KEYREFs. The fact is that It seems to me that XML DB does not use them whem it creates the different objects that results on the schema's load. Does XMLDB support the definitons of KEYs and KEYREFs in the schema?? If so, how does it do?? Defining constraints oon the objects created?? I suppose no, because the KEYs and KEYREFs are defined on 'complexTypes' and the Oracle's constraints goes to tables (not to object types).
I'm worling with the next schema:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="Kybele/MetaModel_Schema_All" targetNamespace="Kybele/MetaModel_Schema_All" xmlns:xdb="http://xmlns.oracle.com/xdb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- En esta version, representaremos las relaciones usando atributos KEYs y KEYREFs
Ademas, en esta version mapeamos el metamodelo de UML por completo-->
<!-- En las anotaciones para XML DB usaremos el prefijo MMALL(MetaModelo Completo) -->
<!--******************** DECLARACION DE LOS ELEMENTOS DEL METAMODELO *********************-->
<xsd:element name="MetaModel" xdb:defaultTable="MMALL_METAMODELS_TABLE">
<xsd:complexType xdb:SQLType="MMALL_METAMODELS_TYPE">
<xsd:sequence>
<xsd:element name="ModelElements" type="ModelElement" maxOccurs="unbounded"/>
<xsd:element name="Dependencies" type="Dependency" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- Es en este punto donde definiremos las "PRIMARYKEYS"(KEYs) Y "FOREIGNKEYS"(KEYREFs) para simular relaciones -->
<!-- ************************************************************************************************* *-->
<!-- RELACIONES ModelElement - Dependency -->
<xsd:key name="Dependency_PK">
<xsd:selector xpath="Dependencies"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:key name="ModelElement_PK">
<xsd:selector xpath="ModelElements"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:keyref name="Requirement_FK" refer="Dependency_PK">
<xsd:selector xpath="ModelElements"/>
<xsd:field xpath="requirement"/>
</xsd:keyref>
<xsd:keyref name="Provision_FK" refer="Dependency_PK">
<xsd:selector xpath="ModelElements"/>
<xsd:field xpath="provision"/>
</xsd:keyref>
<xsd:keyref name="Client_FK" refer="ModelElement_PK">
<xsd:selector xpath="Dependencies"/>
<xsd:field xpath="client"/>
</xsd:keyref>
<xsd:keyref name="Supplier_FK" refer="ModelElement_PK">
<xsd:selector xpath="Dependencies"/>
<xsd:field xpath="supplier"/>
</xsd:keyref>
<!-- RELACIONES Generalization - GeneralizableElement -->
<xsd:key name="Generalization_PK">
<xsd:selector xpath="Generalization"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:key name="GeneralizableElement_PK">
<xsd:selector xpath="GeneralizableElement"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:keyref name="Subtype_FK" refer="GeneralizableElement_PK">
<xsd:selector xpath="Generalization"/>
<xsd:field xpath="subtype"/>
</xsd:keyref>
<xsd:keyref name="Type_FK" refer="GeneralizableElement_PK">
<xsd:selector xpath="Generalization"/>
<xsd:field xpath="type"/>
</xsd:keyref>
<xsd:keyref name="Generalization_FK" refer="GeneralizableElement_PK">
<xsd:selector xpath="GeneralizableElement"/>
<xsd:field xpath="generalization"/>
</xsd:keyref>
<xsd:keyref name="Specilization_FK" refer="GeneralizableElement_PK">
<xsd:selector xpath="GeneralizableElement"/>
<xsd:field xpath="specialization"/>
</xsd:keyref>
<!-- RELACIONES Classifier - AssociationEnd -->
<xsd:key name="Classifier_PK">
<xsd:selector xpath="Classifier"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:key name="AssociationEnd_PK">
<xsd:selector xpath="AssociationEnd"/>
<xsd:field xpath="Nombre"/>
</xsd:key>
<xsd:keyref name="AssociationEnd_FK" refer="AssociationEnd_PK">
<xsd:selector xpath="Classifier"/>
<xsd:field xpath="associationEnd"/>
</xsd:keyref>
<xsd:keyref name="Participant_FK" refer="AssociationEnd_PK">
<xsd:selector xpath="Classifier"/>
<xsd:field xpath="participant"/>
</xsd:keyref>
<xsd:keyref name="AssociationEnd_Type_FK" refer="Classifier_PK">
<xsd:selector xpath="AssociationEnd"/>
<xsd:field xpath="type"/>
</xsd:keyref>
<xsd:keyref name="AssociationEnd_Specification_FK" refer="Classifier_PK">
<xsd:selector xpath="AssociationEnd"/>
<xsd:field xpath="specification"/>
</xsd:keyref>
<!-- RELACIONES AssociatioEnd - Attribute -->
<xsd:keyref name="AttributeCompose_FK" refer="AssociationEnd_PK">
<xsd:selector xpath="Attribute"/>
<xsd:field xpath="associationEnd_member"/>
</xsd:keyref>
<!-- RELACIONES AssociatioEnd - Association -->
<xsd:keyref name="AssociationEndCompose_FK" refer="Association_PK">
<xsd:selector xpath="Association"/>
<xsd:field xpath="Association_member"/>
</xsd:keyref>
</xsd:element>
<!--***************************** DEFINICION DE TIPOS SIMPLES *****************************-->
<!-- TIPO ENUMERADO AGGREGATIONTYPE -->
<xsd:simpleType name="AggregationType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="none"/>
<xsd:enumeration value="aggregate"/>
<xsd:enumeration value="composite"/>
</xsd:restriction>
</xsd:simpleType>
<!-- TIPO ENUMERADO SCOPETYPE -->
<xsd:simpleType name="ScopeType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="instance"/>
<xsd:enumeration value="classifier"/>
</xsd:restriction>
</xsd:simpleType>
<!-- TIPO ENUMERADO MULTIPLICITYTYPE -->
<xsd:simpleType name="MultiplicityType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="0..1"/>
<xsd:enumeration value="1..1"/>
<xsd:enumeration value="0..N"/>
<xsd:enumeration value="1..N"/>
</xsd:restriction>
</xsd:simpleType>
<!-- TIPO ENUMERADO CHANGEABLETYPE -->
<xsd:simpleType name="ChangeableType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="none"/>
<xsd:enumeration value="frozen"/>
<xsd:enumeration value="add_only"/>
</xsd:restriction>
</xsd:simpleType>
<!--**************************** DEFINICION DE TIPOS COMPLEJOS **********************************************-->
<!-- TIPO COMPLEJO MODELELEMENT -->
<xsd:complexType name="ModelElement" xdb:SQLType="MMALL_ModelElement_Type">
<xsd:sequence>
<xsd:element name="nombre" type="xsd:string"/>
<!-- Subelementos para representar sus relaciones -->
<xsd:element name="requirement" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="provision" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- TIPO COMPLEJO DEPENDENCY -->
<xsd:complexType name="Dependency" xdb:SQLType="MMALL_Dependency_Type">
<xsd:complexContent>
<xsd:extension base="ModelElement">
<xsd:sequence>
<xsd:element name="description" type="xsd:string"/>
<!-- Subelementos para representar sus relaciones -->
<xsd:element name="client" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="supplier" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO GENERALIZATION -->
<xsd:complexType name="Generalization" xdb:SQLType="MMALL_Generalization_Type">
<xsd:complexContent>
<xsd:extension base="ModelElement">
<xsd:sequence>
<xsd:element name="discriminator" type="xsd:string"/>
<!-- Subelementos para representar sus relaciones -->
<xsd:element name="subtype" type="xsd:string"/>
<xsd:element name="supertype" type="xsd:string"/>
<!-- Al quitar minOccurs y maxOccurs obligamos a que siempre haya un (Y SOLO UNO)
subelemento 'subtype' y 'supertype' -->
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO NAMESPACE -->
<xsd:complexType name="NameSpace" xdb:SQLType="MMALL_NameSpace_Type">
<xsd:complexContent>
<xsd:extension base="ModelElement"/>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO GENERALIZABLEELEMENT -->
<xsd:complexType name="GeneralizableElement" xdb:SQLType="MMALL_GeneralizableElement_Type">
<xsd:complexContent>
<xsd:extension base="NameSpace">
<xsd:sequence>
<xsd:element name="isRoot" type="xsd:boolean"/>
<xsd:element name="isLeaf" type="xsd:boolean"/>
<xsd:element name="isAbstract" type="xsd:boolean"/>
<!-- Subelementos para representar sus relaciones -->
<xsd:element name="generalization" type="xsd:string"/>
<xsd:element name="specification" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO: ASSOCIATIONEND -->
<xsd:complexType name="AssociationEnd" xdb:SQLType="MMALL_ASSOCIATIONEND_TYPE">
<xsd:complexContent>
<xsd:extension base="ModelElement">
<xsd:sequence>
<xsd:element name="IsNavigable" type="xsd:boolean"/>
<xsd:element name="IsOrdered" type="xsd:boolean"/>
<xsd:element name="Aggregation" type="AggregationType"/>
<xsd:element name="Multiplicity" type="MultiplicityType" minOccurs="0"/>
<xsd:element name="Changeable" type="ChangeableType"/>
<xsd:element name="TargetScope" type="ScopeType"/>
<!-- Subelementos para representar las relaciones -->
<xsd:element name="Qualifier" type="Attribute" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="Association_member" type="xsd:string"/>
<xsd:element name="Type" type="xsd:string"/>
<xsd:element name="Specification" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO CLASSIFIER -->
<xsd:complexType name="Classifier" xdb:SQLType="MMALL_CLASSIFIER_TYPE">
<xsd:complexContent>
<xsd:restriction base="GeneralizableElement">
<xsd:sequence>
<!-- Subelementos para representar las relaciones -->
<xsd:element name="AssociationEnd" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="Participant" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO CLASS -->
<xsd:complexType name="Class" xdb:SQLType="MMALL_CLASS_TYPE">
<xsd:complexContent>
<xsd:extension base="Classifier"/>
</xsd:complexContent>
</xsd:complexType>
<!-- TIPO COMPLEJO ATTRIBUTE -->
<xsd:complexType name="Attribute" xdb:SQLType="MMALL_ATTRIBUTE_TYPE">
<xsd:sequence>
<xsd:element name="associationEnd_member" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
<!-- TIPO COMPLEJO ASSOCIATION -->
<xsd:complexType name="Association" xdb:SQLType="MMALL_ASSOCIATION_TYPE">
<xsd:complexContent>
<xsd:restriction base="GeneralizableElement">
<xsd:sequence>
<xsd:element name="connection" type="AssociationEnd" minOccurs="2" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
and when I try to load it into XMLDB it fails:
SQL> @registerSchema oe oe /home/OE/Metamodel_Schema_All.xsd "http://kybele.escet.urjc.es/ejemplos/x
ml_schema/Metamodel_Schema_All.xsd"
SQL> set echo on
SQL> connect &1/&2@xmlrep.kybele.escet.urjc.es
Conectado.
SQL> alter session set events='31098 trace name context forever';
Sesi�n modificada.
SQL> begin
2 dbms_xmlschema.registeruri(
3 '&4',
4 '&3',
5 TRUE,TRUE,FALSE,TRUE);
6 end;
7 /
antiguo 3: '&4',
nuevo 3: 'http://kybele.escet.urjc.es/ejemplos/xml_schema/Metamodel_Schema_All.xsd',
antiguo 4: '&3',
nuevo 4: '/home/OE/Metamodel_Schema_All.xsd',
begin
*
ERROR en l�nea 1:
ORA-31154: invalid XML document
ORA-19202: Se ha producido un error en el procesamiento
LPX-00217: invalid character 0 (\u0000) de XML
ORA-06512: en "XDB.DBMS_XMLSCHEMA_INT", l�nea 0
ORA-06512: en "XDB.DBMS_XMLSCHEMA", l�nea 166
ORA-06512: en l�nea 2
it says.
I have done several attempts, deleting and including just some of the KEYs/KEYREFs in the schema and it seems to me that the problem is that it let me include so much keys as I want but it fails when the number of KEYREFs that I include increase.
Help!!!
Thanks on advance for spare your time helping us.