JAXB mapping of complexType
Howdy.
I'm working with a schema that defines a record element with fields child elements, for example:
<xs:element name="record">
<xs:complexType>
<xs:sequence>
<xs:element ref="userid"/>
<xs:element ref="name"/>
<xs:element ref="address"/>
</xs:sequence>
</xs:complexType>
</xs:element>
I expect this sequences to map to a List type that I can retrieve from the container fields element and be able to iterate through a list of objects. But after compiling the schema I can only access them directly, and not through an ordered list. An ordered list is important for me to validate.
How can I generate a list out of this schema, or modify the schema if necessary?
Thanks.
if you want to return a list, you must define attribute "maxOccurs" for this tag
for example :
<xs:sequence>
<xs:element name="Task" type="TaskType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:complexType name="TaskType">
<xs:sequence>
<xs:element name="QueryCondition" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="QueryStatement" type="xs:string"/>
<xs:element name="MetadataFile" type="xs:string"/>
<xs:element name="DataHeaderFile" type="xs:string"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
After binding, you can get list of "Task"
Similar Messages
-
Hi.
I have a problem creating web service proxy in JDeveloper using particular WSDL. As I have deeply explored the cause of an error I found the complexType by name "objectFactory" inside WSDL which is mapped by JAXB to ObjectFactory object. So the tag inside WSDL file is :
<xs:complexType name="objectFactory"><xs:sequence/></xs:complexType>
And that is causing the error described below. Now the problem is ObjectFactory is also a name for object definition inside Java.
Hope I was clear enough. Is there a way to avoid this situation?
The error I get when creating web service proxy is
oracle.jdeveloper.webservices.model.WebServiceException: Error creating model from wsdl "file:/C:/temp/testVirWs.wsdl": null
at oracle.jdeveloper.webservices.model.java.JavaWebService.createPortTypes(JavaWebService.java:1635)
at oracle.jdeveloper.webservices.model.WebService.createServiceFromWSDL(WebService.java:2846)
at oracle.jdeveloper.webservices.model.WebService.createServiceFromWSDL(WebService.java:2611)
at oracle.jdeveloper.webservices.model.java.JavaWebService.<init>(JavaWebService.java:509)
at oracle.jdeveloper.webservices.model.java.JavaWebService.<init>(JavaWebService.java:461)
at oracle.jdeveloper.webservices.model.proxy.WebServiceProxy$ProxyJavaWebService.<init>(WebServiceProxy.java:2268)
at oracle.jdeveloper.webservices.model.proxy.WebServiceProxy.updateServiceModel(WebServiceProxy.java:1701)
at oracle.jdeveloper.webservices.model.proxy.WebServiceProxy.setDescription(WebServiceProxy.java:525)
at oracle.jdevimpl.webservices.wizard.jaxrpc.proxy.ProxyJaxWsSpecifyWSDLPanel.setDescription(ProxyJaxWsSpecifyWSDLPanel.java:238)
at oracle.jdevimpl.webservices.wizard.jaxrpc.common.SpecifyWsdlPanel.buildModel(SpecifyWsdlPanel.java:1109)
at oracle.jdevimpl.webservices.wizard.jaxrpc.common.SpecifyWsdlPanel$5.run(SpecifyWsdlPanel.java:661)
at oracle.ide.dialogs.ProgressBar.run(ProgressBar.java:655)
at java.lang.Thread.run(Thread.java:619)
Caused by: oracle.jdeveloper.webservices.tools.WsdlValidationException: Error creating model from wsdl "file:/C:/temp/testVirWs.wsdl": null
at oracle.jdevimpl.webservices.tools.wsa.WsaAdaptor.newWsdlValidationException(WsaAdaptor.java:825)
at oracle.jdevimpl.webservices.tools.wsa.WsaAdaptor.getSeiInfo(WsaAdaptor.java:515)
at oracle.jdeveloper.webservices.tools.WebServiceTools.getSeiInfo(WebServiceTools.java:523)
at oracle.jdeveloper.webservices.model.java.JavaWebService.getSeiInfo(JavaWebService.java:1741)
at oracle.jdeveloper.webservices.model.java.JavaWebService.createPortTypes(JavaWebService.java:1496)
... 12 more
Caused by: oracle.j2ee.ws.common.tools.api.ValidationException: Error creating model from wsdl "file:/C:/temp/testVirWs.wsdl": null
at oracle.j2ee.ws.tools.wsa.jaxws.JaxwsWsdlToJavaTool.getJAXWSModel(JaxwsWsdlToJavaTool.java:679)
at oracle.j2ee.ws.tools.wsa.WsdlToJavaTool.createJAXWSModel(WsdlToJavaTool.java:478)
at oracle.j2ee.ws.tools.wsa.Util.getJaxWsSeiInfo(Util.java:1360)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at oracle.jdevimpl.webservices.tools.wsa.Assembler$2$1.invoke(Assembler.java:218)
at $Proxy36.getJaxWsSeiInfo(Unknown Source)
at oracle.jdevimpl.webservices.tools.wsa.WsaAdaptor.getSeiInfo(WsaAdaptor.java:505)
... 15 more
Caused by: java.lang.NullPointerException
at com.sun.tools.xjc.util.Util.equals(Util.java:67)
at com.sun.tools.xjc.util.CodeModelClassFactory.createClass(CodeModelClassFactory.java:130)
at com.sun.tools.xjc.util.CodeModelClassFactory.createClass(CodeModelClassFactory.java:77)
at com.sun.tools.xjc.generator.bean.ImplStructureStrategy$1.createClasses(ImplStructureStrategy.java:78)
at com.sun.tools.xjc.generator.bean.BeanGenerator.generateClassDef(BeanGenerator.java:410)
at com.sun.tools.xjc.generator.bean.BeanGenerator.getClazz(BeanGenerator.java:442)
at com.sun.tools.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:209)
at com.sun.tools.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:182)
at com.sun.tools.xjc.model.Model.generateCode(Model.java:286)
at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:252)
at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:85)
at oracle.j2ee.ws.common.tools.databinding.jaxb20.JAXB20TypeGenerator.generateJavaTypes(JAXB20TypeGenerator.java:121)
at oracle.j2ee.ws.tools.wsa.SchemaTool.genValueTypes(SchemaTool.java:186)
at oracle.j2ee.ws.tools.wsa.jaxws.JaxwsWsdlToJavaTool.getJAXWSModel(JaxwsWsdlToJavaTool.java:662)
... 24 more
Any suggestion appreciated. Thanks.ObjectFactory is a special class used by jaxb, so you need to rename the class which is generated for the wsdl. you can rename objects using a binding file, see here for details:
http://download.oracle.com/javaee/5/tutorial/doc/bnbbf.html -
JAXB mapping of field to sub nodes
I have the following XML I consume:
<root>
<node1>
<node2 expirationDate="10/10/2012" />
</node1>
</root>
And the following Java class:
@XmlRootElement(name= "root")
class Foo
private String expirationDate;
My question is whether it is possible to map the expirationDate field member DIRECTLY to a <node2> value/attribute. Perhaps something like:
@XmlAttribute(name="node1/node2/expirationDate")
Currently, the only way I can think about doing it is by having another class I'll map for node1 and another class for node2 and have the first class have a field member of the second class.Totally unrelated to doubt..
Hi, I m new to JAXB and i tried various unmarshelling examples but could not able to access the values of sample xml using it.
could you please help me with it ? sample code with XSD , sample XML and Stub code which will retrieve some value out of sample XML would surely help .
Sorry for interrupting the conversation.
Even i would like to follow solution of your Question.
Thank you. -
JAXB map to java.lang.Object.
Hi people,
I need to create objects using the JAXB xjc tool.
There is an element/attribute in my XMLSchema that needs to be maped to java.lang.Object.
I tried to use anySimpleType this way:
<element name="try1" type="anySimpleType" maxOccurs="1" minOccurs="0"/>Also tried this:
<attribute name="try2" type="anySimpleType" use="optional"/>But this way it maps to java.lang.String.
Thanks for any help, references, sugestions.
Att,
TJ.Ok, try1 is working, I'm sorry.
Thanks. -
Hi,
i try to use the developer Preview 3(10.1.3.0)workbench
and it work fine with simple java class (two xml files generation).
But with java servlet who use the same classes nothing
work i got some exception :
05/03/01 08:24:33 exceptionProvider oracle.toplink.ox.jaxb.JAXBContextFactory could not be instantiated: java.lang.NoSuchMethodError: oracle.toplink.publicinterface.Session oracle.toplink.tools.sessionmanagement.SessionManager.getSession(oracle.toplink.tools.sessionconfiguration.XMLSessionConfigLoader, java.lang.String, java.lang.ClassLoader, boolean, boolean)
I have also a strange message in the log window in jdev 9052 :
Cutting log (size: 101767, max: 100000)Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Cutting log (size: 101866, max: 100000)Error cleaning up log: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISeekableStream.seek]
Thank you for your help.The version of TopLink on your application server class path may be an older version of TopLink that does not contain the method mentioned in the stack trace.
If you are using OC4J the toplink.jar can be found in the following location:
<OC4J_HOME>\toplink\jlib\toplink.jar
The 10.1.3 DP3 version of OC4J can be found on OTN in the following location:
http://www.oracle.com/technology/software/products/ias/preview.html -
Mapping complexType to an equivalent COBOL Structure layout
Hello,
In the context of migrating existant web-services from CICS to Tuxedo/SALT, I have two questions :
1 - Is there a way to "automatically" map a complexType to a buffer where the data will be layed out as expected by a Cobol structure equivalent to the complexType?
The main reason is to avoid having to "parse" the FML32 buffer in order to recompose the data that will be given as input to the Cobol programs of the web-service.
2 - Since it is about migrating existent services, we have some cases where sub-elements have the same names. This was not causing an issue on CICS. When doing some preliminary tests on SALT, we get the following warning:
WSDLCVT:26:WARNING: More than one field with different fullname or schema have the same name. Please resolve the naming conflict. ...
When the duplicate names are in different elements used separately in request/answer , it worked OK.
However, we have some cases when the duplicates are on a same complexType...
Is there a workaround to this or it is planned to remove this constraint in a future release of SALT.
Thanks in advance for your help.
Edited by: user12047311 on 13 août 2012 03:20Hi,
Tuxedo ships with a tool that can convert COBOL copybooks to Tuxedo VIEW/VIEW32 buffers. Using SALT, the migrated services can be directly accessed by SOAP/HTTP clients without any code changes to the COBOL programs as SALT supports mapping VIEW/VIEW32 buffers to SOAP and back.
The outbound calls are a bit more difficult because the buffer type used for outbound calls is FML32 as it is the only buffer type that can match the shape of the XML document required to make the outbound SOAP call. My recommendation would be to create a simple proxy service in Tuxedo that takes the VIEW/VIEW32 buffer the COBOL code is currently creating to call the external web service and map that to FML32. Depending upon the mapping requirements, it's possible the mapping could be done with a single call to the FML function that converts a VIEW/VIEW32 buffer to an FML32 buffer, but that would depend a lot on the mapping that needs to be done. In fact, if this is later option will work, it could be done right inside the COBOL program using the FVFTOS32 and FVSTOF32 COBOL APIs provided by Tuxedo.
Regards,
Todd Little
Oracle Tuxedo Chief Architect -
JAXB marshalling complexType elements
Does anyone know why JAXB always marshalls complexType elements with a seperate start and end tag, even if the element has no content?
i.e.
Given the schema element declaration:
<xs:element name="foo" type="fooType"/>
<xs:complexType name="fooType">
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
Why do I get:
<foo value="bar"></foo>
Instead of:
<foo value="bar"/>
Is their a setting / property to control this behaviour?
If not then I certainly think there should be because this will bloat the 5Mb XML files I am currently dealing with by quite a lot.
Cheers,
SimonI have exactly the same trouble here. Did you find a solution? If so, please contact me. I am so afraid of increase the amount space used to store all XML files.
Thanks in advance
Julio Garc�a
[email protected] -
How to map XSD complex type nodes
Hello In my XSD I have complex type like this:
How to map this node to Target filed, I can not see PostalCode node my graphical editor:
<xs:element name="InternationalAddress" nillable="true" type="tns:InternationalAddress" />
<xs:complexType name="CanadianAddress">
<xs:complexContent mixed="false">
<xs:extension base="tns:Address">
<xs:sequence>
<xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Province" nillable="true" type="tns:ProvinceCodes" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>How to handle this in my graphical mapping:
<xs:complexType name="Address">
<xs:complexContent mixed="false">
<xs:extension base="tns:BusinessObject">
<xs:sequence>
<xs:element minOccurs="0" name="City" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Country" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Line1" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Line2" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Line3" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Line4" nillable="true" type="xs:string">
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="Address" nillable="true" type="tns:Address" />
<xs:complexType name="InternationalAddress">
<xs:complexContent mixed="false">
<xs:extension base="tns:Address">
<xs:sequence>
<xs:element minOccurs="0" name="Region" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="InternationalAddress" nillable="true" type="tns:InternationalAddress" />
<xs:complexType name="CanadianAddress">
<xs:complexContent mixed="false">
<xs:extension base="tns:Address">
<xs:sequence>
<xs:element minOccurs="0" name="PostalCode" nillable="true" type="xs:string">
</xs:element>
<xs:element minOccurs="0" name="Province" nillable="true" type="tns:ProvinceCodes" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="CanadianAddress" nillable="true" type="tns:CanadianAddress" />
<xs:complexType name="AmericanAddress">
<xs:complexContent mixed="false">
<xs:extension base="tns:Address">
<xs:sequence>
<xs:element minOccurs="0" name="State" nillable="true" type="tns:StateCodes">
</xs:element>
<xs:element minOccurs="0" name="ZipCode" nillable="true" type="xs:string">
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="AmericanAddress" nillable="true" type="tns:AmericanAddress" /> -
Unable to see Messages in External Definitions
I imported the WSDL below and created a Message Interface based on JobSubmitRequest but, when I come to map to it, all I see in the tree structure is node 'JobSubmitRequest' with elements 'parameter' and 'request_header'.
I also cannot see any messages in External Definitions.
Can anyone help with a solution?
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xoa="http://xoa.xpedite.com/2004/11/xoa" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://xoa.xpedite.com/2004/11/xoa">
<types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://xoa.xpedite.com/2004/11/xoa" xmlns="http://xoa.xpedite.com/2004/11/xoa">
<!-- address type enum -->
<xs:simpleType name="AddressType">
<xs:restriction base="xs:string">
<xs:enumeration value="fax"/>
<xs:enumeration value="internet"/>
<xs:enumeration value="mbox"/>
<xs:enumeration value="x400"/>
<xs:enumeration value="telex"/>
<xs:enumeration value="cablegram"/>
<xs:enumeration value="mailgram"/>
<xs:enumeration value="ddd"/>
<xs:enumeration value="dedLine"/>
<xs:enumeration value="softswitch"/>
<xs:enumeration value="voice"/>
<xs:enumeration value="sms"/>
<xs:enumeration value="fod"/>
<xs:enumeration value="list"/>
<xs:enumeration value="smQuery"/>
</xs:restriction>
</xs:simpleType>
<!--includes for standalone validation
<xs:include schemaLocation="StatusType.xsd"/>
================ -->
<xs:element name="AuthenticateRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="Domain" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- The authenticate result (used to send back results for synchronous and asynchronous requests) -->
<xs:element name="AuthenticateResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- includes for standalone validation
<xs:include schemaLocation="StatusType.xsd"/>
================ -->
<xs:element name="CFSCreateDirRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="RelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CFSCreateDirResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="RelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- includes for standalone validation
<xs:include schemaLocation="StatusType.xsd"/>
================ -->
<xs:element name="CFSDeleteRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="RelativePath" type="xs:string"/>
<xs:element minOccurs="0" name="DeleteDir" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CFSDeleteResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="RelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- includes for standalone validation
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
<xs:include schemaLocation="StatusType.xsd"/>
<xs:include schemaLocation="Document.xsd"/>
================ -->
<xs:element name="CFSDownloadRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="RelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CFSDownloadResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="RelativePath" type="xs:string"/>
<xs:element minOccurs="0" name="FileData" type="xoa:DocDataType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- includes for standalone validation
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
<xs:include schemaLocation="StatusType.xsd"/>
<xs:include schemaLocation="Document.xsd"/>
================ -->
<xs:element name="CFSListRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="RelativePath" type="xs:string"/>
<xs:element minOccurs="0" name="IncludeSubDir" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="EntryType">
<xs:restriction base="xs:string">
<xs:enumeration value="file"/>
<xs:enumeration value="directory"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="CFSListResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="RelativePath" type="xs:string"/>
<xs:element maxOccurs="unbounded" minOccurs="0" name="DirectoryEntry" type="xoa:DirectoryEntryType">
<xs:annotation>
<xs:documentation>content of
DirectoryEntry is path relative to
the RelativePath</xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="DirectoryEntryType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="type" type="xoa:EntryType" use="required"/>
<xs:attribute name="modified" type="xs:dateTime" use="optional"/>
<xs:attribute name="size" type="xs:integer" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- includes for standalone validation
<xs:include schemaLocation="StatusType.xsd"/>
================ -->
<xs:element name="CFSRenameRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="OldRelativePath" type="xs:string"/>
<xs:element name="NewRelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CFSRenameResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="OldRelativePath" type="xs:string"/>
<xs:element minOccurs="0" name="NewRelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- includes for standalone validation
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
<xs:include schemaLocation="StatusType.xsd"/>
<xs:include schemaLocation="Document.xsd"/>
================ -->
<xs:element name="CFSUploadRequest">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element name="RelativePath" type="xs:string"/>
<xs:element name="FileData" type="xoa:DocDataType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CFSUploadResult">
<xs:complexType>
<xs:sequence>
<xs:element name="Status" type="xoa:StatusType"/>
<xs:element minOccurs="0" name="SubmitId" type="xs:string"/>
<xs:element minOccurs="0" name="RelativePath" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- ===============================
<xs:include schemaLocation="AddressType.xsd"/>
<xs:include schemaLocation="Document.xsd"/>
<xs:include schemaLocation="EncodableStringType.xsd"/>
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
<xs:include schemaLocation="StatusType.xsd"/>
=============================== -->
<!-- Type definitions -->
<!-- Phone element -->
<xs:element name="Phone">
<xs:simpleType>
<xs:restriction base="xs:string">
<!-- <xs:pattern value="[0-9+x\-() ]{5,20}"/> -->
</xs:restriction>
</xs:simpleType>
</xs:element>
<!-- Email element -->
<xs:element name="Email">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="2"/>
<!-- <xs:pattern value="[@]{1,64}@([@\.]{1,64}\.){1,10}[^@\.]{1,64}"/> -->
</xs:restriction>
</xs:simpleType>
</xs:element>
<!-- Eformat type -->
<xs:simpleType name="EformatType">
<xs:annotation>
<xs:documentation> Only used in messageREACH.
Indicates the preferred email format of the
message body the recipient will receive.
Leaving the field empty or setting it to
"default" will send a multipart message body
rather than just a single message body if
it would do so normally. </xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="html"/>
<xs:enumeration value="htmllite"/>
<xs:enumeration value="default"/>
</xs:restriction>
</xs:simpleType>
<!-- insert list element -->
<xs:element name="InsertList">
<xs:complexType>
<xs:choice>
<xs:element maxOccurs="unbounded" name="Insert">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="number" type="xs:integer"/>
<xs:attribute name="b64charset" type="xs:string" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
<!-- extension element -->
<xs:complexType name="SegmentType">
<xs:choice>
<xs:element maxOccurs="unbounded" name="Property">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="b64charset" type="xs:string" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
<xs:element name="Extension">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="Segment" type="xoa:SegmentType"/>
</xs:choice>
</xs:complexType>
</xs:element>
<!-- field mapping type -->
<xs:complexType name="FieldMappingType">
<xs:annotation>
<xs:documentation> Describes the correspondence
between the segment/keyword pairs in the
XDDS header file and columns in a table. Only
two table formats currently supported: CSV
(comma-separated values) and XSL (Excel
spreadsheet). The mapping may go either
from field name to the segment/keyword pair
or vice versa. In both cases, the same
structure may be used. </xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Map">
<xs:complexType>
<xs:sequence>
<xs:element name="FieldName" type="xs:string"/>
<xs:element minOccurs="0" name="SegmentName" type="xs:string"/>
<xs:element name="PropertyName" type="xs:string"/>
<xs:element minOccurs="0" name="IsBase64Encoded" type="xs:boolean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- class definitions -->
<!-- delivery item base class -->
<xs:element abstract="true" name="DeliveryItem" type="xoa:DeliveryItemType"/>
<xs:complexType abstract="true" name="DeliveryItemType">
<xs:attribute name="ref" type="xs:string" use="optional"/>
<xs:attribute name="refb64" type="xs:string" use="optional"/>
</xs:complexType>
<!-- new branch -->
<!-- delivery item container class -->
<xs:element abstract="true" name="DeliveryItemContainer" type="xoa:DeliveryItemContainerType"/>
<xs:complexType abstract="true" name="DeliveryItemContainerType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemType"/>
</xs:complexContent>
</xs:complexType>
<!-- list delivery item class -->
<xs:element name="List" type="xoa:ListType"/>
<xs:complexType name="ListType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemContainerType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
</xs:sequence>
<xs:attribute name="ownershipLevel" type="xoa:OwnershipLevelType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- SmQuery delivery item class -->
<xs:element name="SmQuery" type="xoa:SmQueryType"/>
<xs:complexType name="SmQueryType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemContainerType">
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
</xs:sequence>
<xs:attribute name="ownershipLevel" type="xoa:OwnershipLevelType"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- External table delivery item class -->
<!-- This includes CSV and XLS files -->
<xs:element name="Table" type="xoa:TableType"/>
<xs:complexType name="TableType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemContainerType">
<xs:sequence>
<xs:element minOccurs="0" name="FieldMapping" type="xoa:FieldMappingType"/>
<xs:choice>
<xs:element name="DocRef" type="xs:string"/>
<xs:element name="Document" type="xoa:DocumentType"/>
</xs:choice>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- new branch -->
<!-- delivery item simple class -->
<xs:element abstract="true" name="DeliveryItemSimple" type="xoa:DeliveryItemSimpleType"/>
<xs:complexType abstract="true" name="DeliveryItemSimpleType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemType">
<xs:sequence>
<xs:element minOccurs="0" name="Alternate">
<xs:complexType>
<xs:choice>
<xs:element ref="xoa:Fax"/>
<xs:element ref="xoa:Internet"/>
<xs:element ref="xoa:Voice"/>
<xs:element ref="xoa:Fod"/>
<xs:element ref="xoa:Mbox"/>
<xs:element ref="xoa:Sms"/>
<xs:element ref="xoa:Telex"/>
<xs:element ref="xoa:DeliveryItemGeneric"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- mbox delivery item class -->
<xs:element name="Mbox" type="xoa:MboxType"/>
<xs:complexType name="MboxType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemSimpleType">
<xs:sequence>
<xs:element name="UserId" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- telex delivery item class -->
<xs:element name="Telex" type="xoa:TelexType"/>
<xs:complexType name="TelexType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemSimpleType">
<xs:sequence>
<xs:element name="Number" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- FOD delivery item class -->
<xs:element name="Fod" type="xoa:FodType"/>
<xs:complexType name="FodType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemSimpleType">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- SMS delivery item class -->
<xs:element name="Sms" type="xoa:SmsType"/>
<xs:complexType name="SmsType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemSimpleType">
<xs:sequence>
<xs:element ref="xoa:Phone"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- new branch -->
<!-- Complex delivery item class -->
<xs:element abstract="true" name="DeliveryItemComplex" type="xoa:DeliveryItemComplexType"/>
<xs:complexType abstract="true" name="DeliveryItemComplexType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemSimpleType">
<xs:sequence>
<xs:element minOccurs="0" ref="xoa:InsertList"/>
<xs:element minOccurs="0" ref="xoa:Extension"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- fax delivery item class -->
<xs:element name="Fax" type="xoa:FaxType"/>
<xs:complexType name="FaxType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemComplexType">
<xs:sequence>
<xs:element ref="xoa:Phone"/>
<xs:element minOccurs="0" name="Att" type="xoa:EncodableStringType"/>
<xs:element minOccurs="0" name="From" type="xoa:EncodableStringType"/>
<xs:element minOccurs="0" name="To" type="xoa:EncodableStringType"/>
<xs:element minOccurs="0" name="Salutation" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- voice delivery item class -->
<xs:element name="Voice" type="xoa:VoiceType"/>
<xs:complexType name="VoiceType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemComplexType">
<xs:sequence>
<xs:element ref="xoa:Phone"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- internet delivery item class -->
<xs:element name="Internet" type="xoa:InternetType"/>
<xs:complexType name="InternetType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemComplexType">
<xs:sequence>
<xs:element ref="xoa:Email"/>
<xs:element minOccurs="0" name="Subject" type="xoa:EncodableStringType"/>
<xs:element minOccurs="0" name="From" type="xoa:EncodableStringType"/>
<xs:element minOccurs="0" name="Eformat" type="xoa:EformatType"/>
<xs:element minOccurs="0" name="Password" type="xs:string">
<xs:annotation>
<xs:documentation> Only used in
messageREACH. The password used
by this recipient to retrieve
pull attachments. </xs:documentation>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- fax delivery item class -->
<xs:element name="DeliveryItemGeneric" type="xoa:DeliveryItemGenericType"/>
<xs:complexType name="DeliveryItemGenericType">
<xs:complexContent>
<xs:extension base="xoa:DeliveryItemComplexType">
<xs:sequence>
<xs:element name="Address" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xoa:AddressType" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- Finally, delivery item list -->
<!-- delivery item list type -->
<xs:complexType name="DeliveryItemListType">
<xs:choice maxOccurs="unbounded">
<xs:element ref="xoa:List"/>
<xs:element ref="xoa:SmQuery"/>
<xs:element ref="xoa:Table"/>
<xs:element ref="xoa:DeliveryItemGeneric"/>
<xs:element ref="xoa:Fax"/>
<xs:element ref="xoa:Internet"/>
<xs:element ref="xoa:Voice"/>
<xs:element ref="xoa:Fod"/>
<xs:element ref="xoa:Mbox"/>
<xs:element ref="xoa:Sms"/>
<xs:element ref="xoa:Telex"/>
</xs:choice>
</xs:complexType>
<!--remove includes later
<xs:include schemaLocation="AddressType.xsd"/>
================ -->
<xs:complexType name="DestinationType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="type" type="xoa:AddressType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- ===============================
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
=============================== -->
<!-- Elementary definitions go first -->
<xs:element name="CharacterSet" type="xs:string">
<xs:annotation>
<xs:documentation>use ISO names</xs:documentation>
</xs:annotation>
</xs:element>
<!-- Document type -->
<xs:simpleType name="DocFormatType">
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="XMF"/>
<xs:enumeration value="TIFF"/>
<xs:enumeration value="XAR"/>
<xs:enumeration value="PS"/>
<xs:enumeration value="PCL"/>
<xs:enumeration value="PDF"/>
<xs:enumeration value="MSW"/>
<xs:enumeration value="WAV"/>
<xs:enumeration value="RTF"/>
<xs:enumeration value="XLS"/>
<xs:enumeration value="HTML"/>
<xs:enumeration value="HTMLLITE"/>
<xs:enumeration value="unspec"/>
<xs:enumeration value="GIF"/>
<xs:enumeration value="JPEG"/>
<xs:enumeration value="PPT"/>
<xs:enumeration value="BMP"/>
<xs:enumeration value="VSD"/>
<xs:enumeration value="PUB"/>
<xs:enumeration value="MPP"/>
<xs:enumeration value="empty"/>
<!-- We do not need to know the document type for the -->
<!-- email attachments. -->
</xs:restriction>
</xs:simpleType>
<!-- Document Encoding format -->
<xs:simpleType name="DocEncodingFormat">
<xs:restriction base="xs:string">
<xs:enumeration value="text"/>
<xs:enumeration value="base64"/>
</xs:restriction>
</xs:simpleType>
<!-- Document embedded into the request -->
<xs:complexType name="DocDataType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="format" type="xoa:DocEncodingFormat" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- All supported stored object types -->
<xs:simpleType name="SosObjectType">
<xs:restriction base="xs:string">
<xs:enumeration value="tts"/>
<xs:enumeration value="vcs"/>
</xs:restriction>
</xs:simpleType>
<!-- The types of the sos stored objects -->
<xs:complexType name="SosObjectIdType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="sosType" type="xoa:SosObjectType" use="required"/>
<xs:attribute name="ownershipLevel" type="xoa:OwnershipLevelType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Another Document type -->
<xs:complexType name="DocumentType">
<xs:sequence>
<xs:element name="DocType" type="xoa:DocFormatType"/>
<xs:element minOccurs="0" name="Filename" type="xs:string"/>
<xs:choice>
<xs:element name="DocData" type="xoa:DocDataType"/>
<xs:element name="DocCfs" type="xs:string"/>
<xs:element name="DocUrl" type="xs:anyURI"/>
<xs:element name="SosObject" type="xoa:SosObjectIdType"/>
</xs:choice>
<xs:element minOccurs="0" ref="xoa:CharacterSet"/>
</xs:sequence>
<xs:attribute name="ref" type="xs:string" use="optional"/>
</xs:complexType>
<!-- The document set type -->
<xs:complexType name="DocumentSetType">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="Document" type="xoa:DocumentType"/>
</xs:sequence>
</xs:complexType>
<!-- The document by value or by reference -->
<xs:complexType name="DocumentOrRefType">
<xs:choice>
<xs:element name="DocRef" type="xs:string">
<xs:annotation>
<xs:documentation>must refer to a document
in document_set</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="Document" type="xoa:DocumentType"/>
</xs:choice>
</xs:complexType>
<xs:complexType name="EncodableStringType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="b64charset" type="xs:string" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!--includes for standalone validation
================ -->
<xs:simpleType name="HistoryActionType">
<xs:restriction base="xs:string">
<xs:enumeration value="inserted"/>
<xs:enumeration value="updated"/>
<xs:enumeration value="deleted"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="ItemCountType">
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="type" type="xoa:HistoryActionType"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="HistoryType">
<xs:sequence>
<xs:element name="Action" type="xs:string"/>
<xs:element name="Operator" type="xs:string"/>
<xs:element name="Agent" type="xs:string"/>
<xs:element name="Time" type="xs:dateTime"/>
<xs:element name="ItemCount" type="xoa:ItemCountType"/>
</xs:sequence>
</xs:complexType>
<!-- ================
<xs:include schemaLocation="AddressType.xsd"/>
<xs:include schemaLocation="DestinationType.xsd"/>
<xs:include schemaLocation="Document.xsd"/>
<xs:include schemaLocation="JobIdType.xsd"/>
<xs:include schemaLocation="OwnershipLevelType.xsd"/>
<xs:include schemaLocation="StatusType.xsd"/>
<xs:include schemaLocation="RecStatusType.xsd"/>
================ -->
<xs:simpleType name="JobCancelType">
<xs:annotation>
<xs:documentation>The set of cancellation types/options</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="All"/>
<xs:enumeration value="Deliveries"/>
<xs:enumeration value="Reports"/>
<xs:enumeration value="AcceptanceReport"/>
<xs:enumeration value="CancellationNotice"/>
<xs:enumeration value="Pulls"/>
<xs:enumeration value="FriendDeliveries"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="JobCancelItemType">
<xs:sequence>
<xs:element name="JobId" type="xoa:JobIdType">
<xs:annotation>
<xs:documentation>requested JobId</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element minOccurs="0" name="CancelType" type="xoa:JobCancelType"/>
<xs:element minOccurs="0" name="NotificationAddress" type="xoa:DestinationType"/>
<xs:choice minOccurs="0">
<xs:element name="NotificationType" type="xs:string"/>
<xs:element name="NotificationText" type="xoa:DocDataType"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
&Hi,
Not all data types from WSDL are supported during import. There is SAP Note about it.
please read it:
/people/kevin.liu/blog/2005/10/07/a-note-on-wsdl-and-xsd-imports--part-ii
regards,
wojtek
Message was edited by: Wojciech Gasiorowski -
ORA 01792 maximum number of columns in a table or view is 1000
Hello every1, I wish to register a large xmlschema doc, I am using the command
begin
dbms_xmlschema.registerschema(
schemaurl=>'xxxx',
schemadoc=>bfilename('XMLDIR','xxxxxx.xsd'),
csid=>nls_charset_id('AL32UTF8'));
end;
But the schema file exists 1000 col and it gives me the error msg of
ORA-01792: maximum number of columns in a table or view is 1000
is there anyway to solve the problems without edit the original schema document?
Thanks for your helpFirst create this package
create or replace package XDB_ANALYZE_XMLSCHEMA_10200
authid CURRENT_USER
as
function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2) return XMLTYPE;
function analyzeComplexType(COMPLEX_TYPE VARCHAR2) return XMLTYPE;
procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2);
function printNestedTables(XML_TABLE varchar2) return XMLType;
function getComplexTypeElementList(P_SQLTYPE VARCHAR2, P_SQLSCHEMA VARCHAR2) return XDB.XDB$XMLTYPE_REF_LIST_T;
procedure scopeXMLReferences;
procedure indexXMLReferences(INDEX_NAME VARCHAR2);
function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER) return XMLTYPE;
function showSQLTypes(schemaFolder varchar2) return XMLType;
function generateCreateTableStatement(XML_TABLE_NAME varchar2, NEW_TABLE_NAME varchar2) return CLOB;
end XDB_ANALYZE_XMLSCHEMA_10200;
show errors
create or replace package body XDB_ANALYZE_XMLSCHEMA_10200
as
G_DEPTH_COUNT NUMBER(2) := 0;
TYPE BASETYPE_T is RECORD
SUBTYPE varchar2(128),
SUBTYPE_OWNER varchar2(32),
BASETYPE varchar2(128),
BASETYPE_OWNER varchar2(32)
TYPE BASETYPE_LIST_T IS TABLE OF BASETYPE_T;
BASETYPE_LIST BASETYPE_LIST_T := BASETYPE_LIST_T();
function findStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2, P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES') return XMLType;
function getLocalAttributes(P_TYPE_NAME varchar2, P_TYPE_OWNER VARCHAR2) return XMLType;
function makeElement(P_NAME varchar2)
return xmltype
as
V_NAME varchar2(4000) := P_NAME;
begin
-- -- dbms_output.put_line('Processing : ' || P_NAME);
if (P_NAME LIKE '%$') then
V_NAME := SUBSTR(V_NAME,1,LENGTH(V_NAME) - 1);
end if;
if (P_NAME LIKE '%$%') then
V_NAME := REPLACE(V_NAME,'$','_0x22_');
end if;
return XMLTYPE( '<' || V_NAME || '/>');
end;
function getPathToRoot(SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
return varchar2
as
TYPE_HIERARCHY varchar2(4000);
begin
SELECT sys_connect_by_path( OWNER || '.' || TYPE_NAME , '/')
INTO TYPE_HIERARCHY
FROM ALL_TYPES
WHERE TYPE_NAME = SUBTYPE
AND OWNER = SUBTYPE_OWNER
CONNECT BY SUPERTYPE_NAME = PRIOR TYPE_NAME
AND SUPERTYPE_OWNER = PRIOR OWNER
START WITH SUPERTYPE_NAME IS NULL
AND SUPERTYPE_OWNER IS NULL;
return TYPE_HIERARCHY;
end;
function expandSQLType(ATTR_NAME VARCHAR2, SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
return XMLType
as
STORAGE_MODEL XMLTYPE;
ATTRIBUTES XMLTYPE;
EXTENDED_TYPE XMLTYPE;
ATTR_COUNT NUMBER := 0;
CURSOR FIND_EXTENDED_TYPES
is
select TYPE_NAME, OWNER
from ALL_TYPES
where SUPERTYPE_NAME = SUBTYPE
and SUPERTYPE_OWNER = SUBTYPE_OWNER;
begin
-- dbms_output.put_line('Processing SQLType : "' || SUBTYPE_OWNER || '.' || SUBTYPE || '".' );
STORAGE_MODEL := makeElement(ATTR_NAME);
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@type',SUBTYPE)
into STORAGE_MODEL
from dual;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@typeOwner',SUBTYPE_OWNER)
into STORAGE_MODEL
from dual;
ATTRIBUTES := getLocalAttributes(SUBTYPE, SUBTYPE_OWNER);
ATTR_COUNT := ATTR_COUNT + ATTRIBUTES.extract('/' || ATTRIBUTES.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),ATTRIBUTES)
into STORAGE_MODEL
from DUAL;
for t in FIND_EXTENDED_TYPES loop
EXTENDED_TYPE := expandSQLType('ExtendedType',T.TYPE_NAME,T.OWNER);
ATTR_COUNT := ATTR_COUNT + EXTENDED_TYPE.extract('/' || EXTENDED_TYPE.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),EXTENDED_TYPE)
into STORAGE_MODEL
from DUAL;
end loop;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@columns',ATTR_COUNT)
into STORAGE_MODEL
from dual;
return STORAGE_MODEL;
end;
function getLocalAttributes(P_TYPE_NAME varchar2, P_TYPE_OWNER VARCHAR2)
return XMLType
as
V_ATTRIBUTE_COUNT NUMBER := 0;
V_TOTAL_ATTRIBUTES NUMBER := 0;
V_TEMP_RESULT NUMBER;
V_COLLECTION_TYPE varchar2(32);
V_COLLECTION_OWNER varchar2(32);
CURSOR FIND_CHILD_ATTRS
is
select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
from ALL_TYPE_ATTRS
where TYPE_NAME = P_TYPE_NAME
and OWNER = P_TYPE_OWNER
and INHERITED = 'NO'
order by ATTR_NO;
V_ATTR DBMS_XMLDOM.DOMATTR;
V_ATTRIBUTE_LIST XMLTYPE;
V_ATTRIBUTE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ATTRIBUTE_LIST_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTRIBUTE XMLTYPE;
V_ATTRIBUTE_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ATTRIBUTE_ROOT DBMS_XMLDOM.DOMELEMENT;
V_TYPE_DEFINITION XMLTYPE;
V_TYPE_DEFINITION_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_TYPE_DEFINITION_ROOT DBMS_XMLDOM.DOMELEMENT;
begin
V_ATTRIBUTE_LIST := makeElement('Attributes');
V_ATTRIBUTE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
for ATTR in FIND_CHILD_ATTRS loop
-- Finding Element / Attribute Name could be tricky. Use SQLName
V_ATTRIBUTE := makeElement(ATTR.ATTR_NAME);
V_ATTRIBUTE_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE);
V_ATTRIBUTE_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_DOCUMENT);
begin
-- Check for Attributes based on collection types, With Nested Table storage each Collection will cost 2 columns.
select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
into V_COLLECTION_TYPE, V_COLLECTION_OWNER
from ALL_COLL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
-- -- dbms_output.put_line('Adding "' || ATTR.ATTR_NAME || '". Collection of "' || ATTR.ATTR_TYPE_OWNER || '"."' || ATTR.ATTR_TYPE_NAME || '".');
-- Attribute is a Collection Type.
-- Collection will be managed as a NESTED TABLE
-- Each Collection cost 2 columns.
-- May want to count the number of columns in the NESTED_TABLE at a later date.
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLCollType');
DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLCollTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_COLLECTION_TYPE);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_COLLECTION_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,2);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
exception
when no_data_found then
-- Attribute is not a collection type.
begin
-- Check for Attributes based on non-scalar types.
select 1
into V_TEMP_RESULT
from ALL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
-- Attribute is based on a non-scalar type. Find the Storage Model for this type.
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_TYPE_DEFINITION := findStorageModel(ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER, 'YES');
V_TYPE_DEFINITION_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_TYPE_DEFINITION_DOCUMENT);
V_ATTRIBUTE_COUNT := DBMS_XMLDOM.GETATTRIBUTE(V_TYPE_DEFINITION_ROOT,'columns');
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_ATTRIBUTE_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),TRUE));
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_TYPE_DEFINITION_DOCUMENT);
if (ATTR.ATTR_TYPE_NAME = 'XDB$ENUM_T' and ATTR.ATTR_TYPE_OWNER = 'XDB') then
-- The cost of a XDB$ENUM_T is 2 columns
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,2);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
else
-- The cost of a non scalar Type is the number of attributes plus one for Type and one for the TYPEID.
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT + 2);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
end if;
exception
when no_data_found then
-- Attribute is based on a scalar type
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'SQLType');
DBMS_XMLDOM.SETVALUE(V_ATTR,ATTR.ATTR_TYPE_NAME);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,1);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_ROOT,V_ATTR);
end;
end;
V_TOTAL_ATTRIBUTES := V_TOTAL_ATTRIBUTES + DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_ROOT,'columns');
V_ATTRIBUTE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_ATTRIBUTE_LIST_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT),TRUE));
V_ATTRIBUTE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_DOCUMENT);
if (V_TOTAL_ATTRIBUTES > 25000) then
exit;
end if;
end loop;
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_ATTRIBUTE_LIST_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_TOTAL_ATTRIBUTES);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ATTRIBUTE_LIST_ROOT,V_ATTR);
return V_ATTRIBUTE_LIST;
end;
function getSubTypes(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
return XMLType
as
CURSOR FIND_SUBTYPES
is
select TYPE_NAME, OWNER
from ALL_TYPES
where SUPERTYPE_NAME = P_TYPE_NAME
and SUPERTYPE_OWNER = P_TYPE_OWNER;
CURSOR FIND_SUBTYPE_HEIRARCHY
is
select LEVEL, TYPE_NAME, OWNER
from ALL_TYPES
where TYPE_NAME <> P_TYPE_NAME
and OWNER <> P_TYPE_OWNER
connect by SUPERTYPE_NAME = PRIOR TYPE_NAME
and SUPERTYPE_OWNER = PRIOR OWNER
start with TYPE_NAME = P_TYPE_NAME
and OWNER = P_TYPE_OWNER;
V_SUBTYPE_LIST XMLType;
V_SUBTYPE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_SUBTYPE_LIST_ROOT DBMS_XMLDOM.DOMELEMENT;
V_TYPE_DEFINITION XMLType;
V_TYPE_DEFINITION_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_TYPE_DEFINITION_ROOT DBMS_XMLDOM.DOMELEMENT;
V_SUBTYPE_DEFINITIONS XMLType;
V_SUBTYPE_DEFINITIONS_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_SUBTYPE_DEFINITIONS_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTRIBUTE_LIST XMLType;
V_ATTRIBUTE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ATTRIBUTE_LIST_ROOT DBMS_XMLDOM.DOMELEMENT;
V_SUBTYPES_EXIST BOOLEAN := FALSE;
V_TOTAL_columns number;
V_ATTRIBUTE_COUNT number;
V_ATTR DBMS_XMLDOM.DOMATTR;
V_COMPLEX_TYPE VARCHAR2(256);
begin
V_SUBTYPE_LIST := makeElement('SubTypeDefinitions');
V_SUBTYPE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_LIST);
V_SUBTYPE_LIST_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_LIST_DOCUMENT);
V_TOTAL_columns := 0;
for t in FIND_SUBTYPES() loop
V_SUBTYPES_EXIST := TRUE;
V_TYPE_DEFINITION := makeElement(t.TYPE_NAME);
V_TYPE_DEFINITION_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_TYPE_DEFINITION_DOCUMENT);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'SQLTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,t.OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
begin
select x.XMLDATA.NAME
into V_COMPLEX_TYPE
from XDB.XDB$COMPLEX_TYPE x
where x.XMLDATA.SQLTYPE = t.TYPE_NAME
and x.XMLDATA.SQLSCHEMA = t.OWNER;
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'type');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_COMPLEX_TYPE);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
-- Consider adding Schema URL Attribute
exception
when no_data_found then
null;
when others then
raise;
end;
V_ATTRIBUTE_LIST := getLocalAttributes(t.TYPE_NAME, t.OWNER);
V_ATTRIBUTE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
V_ATTRIBUTE_COUNT := DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_LIST_ROOT,'columns');
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_TYPE_DEFINITION_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),TRUE));
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_LIST_DOCUMENT);
V_SUBTYPE_DEFINITIONS := getSubTypes(t.TYPE_NAME,t.OWNER);
if (V_SUBTYPE_DEFINITIONS is not NULL) then
V_SUBTYPE_DEFINITIONS_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_DEFINITIONS);
V_SUBTYPE_DEFINITIONS_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_DEFINITIONS_DOCUMENT);
V_ATTRIBUTE_COUNT := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUBTYPE_DEFINITIONS_ROOT,'columns');
V_SUBTYPE_DEFINITIONS_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_TYPE_DEFINITION_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUBTYPE_DEFINITIONS_ROOT),TRUE));
V_SUBTYPE_DEFINITIONS_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),DBMS_XMLDOM.MAKENODE(V_SUBTYPE_DEFINITIONS_ROOT)));
end if;
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_TYPE_DEFINITION_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_TYPE_DEFINITION_ROOT,V_ATTR);
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_SUBTYPE_LIST_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT),TRUE));
V_TYPE_DEFINITION_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_SUBTYPE_LIST_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION_ROOT)));
V_TOTAL_columns := V_TOTAL_columns + V_ATTRIBUTE_COUNT;
end loop;
if (V_SUBTYPES_EXIST) then
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_SUBTYPE_LIST_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_TOTAL_columns);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_SUBTYPE_LIST_ROOT,V_ATTR);
return V_SUBTYPE_LIST;
else
return NULL;
end if;
end;
function findSuperTypeModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
return XMLType
as
begin
-- dbms_output.put_line('Processing Super Type : "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '"');
return findStorageModel(P_TYPE_NAME, P_TYPE_OWNER,'NO');
end;
function getStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2, P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES')
return XMLType
as
V_TYPE_DEFINITION XMLTYPE;
V_ATTRIBUTE_COUNT NUMBER := 0;
SUBTYPE_STORAGE_MODEL XMLTYPE;
V_SUPERTYPE_DEFINITION XMLTYPE;
V_SUPERTYPE_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_SUPERTYPE_ROOT DBMS_XMLDOM.DOMELEMENT;
V_SUBTYPE_DEFINITION XMLTYPE;
V_SUBTYPE_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_SUBTYPE_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTRIBUTE_LIST XMLTYPE;
V_ATTRIBUTE_LIST_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ATTRIBUTE_LIST_ROOT DBMS_XMLDOM.DOMELEMENT;
cursor FIND_SUPERTYPE_HEIRARCHY
is
select TYPE_NAME, OWNER
from ALL_TYPES
where TYPE_NAME <> P_TYPE_NAME
and OWNER <> P_TYPE_OWNER
connect by TYPE_NAME = PRIOR SUPERTYPE_NAME
and OWNER = PRIOR SUPERTYPE_OWNER
start with TYPE_NAME = P_TYPE_NAME
and OWNER = P_TYPE_OWNER
order by LEVEL;
V_COMPLEX_TYPE varchar2(256);
V_SUPERTYPE_NAME varchar2(256);
v_SUPERTYPE_OWNER varchar2(256);
V_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTR DBMS_XMLDOM.DOMATTR;
begin
-- dbms_output.put_line('Generating Storage Model for : "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '"');
V_TYPE_DEFINITION := makeElement(P_TYPE_NAME);
V_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_TYPE_DEFINITION);
V_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_DOCUMENT);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
begin
select x.XMLDATA.NAME
into V_COMPLEX_TYPE
from XDB.XDB$COMPLEX_TYPE x
where x.XMLDATA.SQLTYPE = P_TYPE_NAME
and x.XMLDATA.SQLSCHEMA = P_TYPE_OWNER;
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'type');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_COMPLEX_TYPE);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
-- Consider adding Schema URL Attribute
exception
when no_data_found then
null;
when others then
raise;
end;
select SUPERTYPE_NAME, SUPERTYPE_OWNER
into V_SUPERTYPE_NAME, V_SUPERTYPE_OWNER
from ALL_TYPES
where TYPE_NAME = P_TYPE_NAME
and OWNER = P_TYPE_OWNER;
-- Process SuperType.
if (V_SUPERTYPE_NAME is not null) then
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLParentType');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_SUPERTYPE_NAME);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLParentTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_SUPERTYPE_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
-- Find the Definition for the super type. Do not include the definition of it's subtypes.
V_SUPERTYPE_DEFINITION := findSuperTypeModel(V_SUPERTYPE_NAME, V_SUPERTYPE_OWNER);
-- -- dbms_output.put_line(dbms_lob.substr(V_SUPERTYPE_DEFINITION.getClobVal(),1000,1));
V_SUPERTYPE_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUPERTYPE_DEFINITION);
V_SUPERTYPE_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUPERTYPE_DOCUMENT);
V_ATTRIBUTE_COUNT := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUPERTYPE_ROOT,'columns');
V_SUPERTYPE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUPERTYPE_ROOT),TRUE));
V_SUPERTYPE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_SUPERTYPE_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_SUPERTYPE_DOCUMENT);
end if;
-- Process Attributes defined directly by the Type.
V_ATTRIBUTE_LIST := getLocalAttributes(P_TYPE_NAME, P_TYPE_OWNER);
V_ATTRIBUTE_LIST_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_ATTRIBUTE_LIST);
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_ATTRIBUTE_LIST_DOCUMENT);
V_ATTRIBUTE_COUNT := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_ATTRIBUTE_LIST_ROOT,'columns');
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT),TRUE));
V_ATTRIBUTE_LIST_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_ATTRIBUTE_LIST_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_ATTRIBUTE_LIST_DOCUMENT);
if (P_INCLUDE_SUBTYPES = 'YES') then
-- Process any Sub-Types...
V_SUBTYPE_DEFINITION := getSubTypes(P_TYPE_NAME, P_TYPE_OWNER);
if (V_SUBTYPE_DEFINITION is not null) then
V_SUBTYPE_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_SUBTYPE_DEFINITION);
V_SUBTYPE_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_SUBTYPE_DOCUMENT);
V_ATTRIBUTE_COUNT := V_ATTRIBUTE_COUNT + DBMS_XMLDOM.GETATTRIBUTE(V_SUBTYPE_ROOT,'columns');
V_SUBTYPE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_SUBTYPE_ROOT),TRUE));
V_SUBTYPE_ROOT := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_SUBTYPE_ROOT)));
DBMS_XMLDOM.FREEDOCUMENT(V_SUBTYPE_DOCUMENT);
end if;
end if;
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,V_ATTRIBUTE_COUNT);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
-- Cache the type definition.
-- dbms_output.put_line('Cached Storage Model for "' || P_TYPE_OWNER || '.' || P_TYPE_NAME || '".');
insert into XDBPM.XDBPM_STORAGE_MODEL_CACHE (TYPE_NAME, TYPE_OWNER, EXTENDED_DEFINITION, STORAGE_MODEL) VALUES (P_TYPE_NAME, P_TYPE_OWNER, P_INCLUDE_SUBTYPES, V_TYPE_DEFINITION);
return V_TYPE_DEFINITION;
end;
function findStorageModel(P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2, P_INCLUDE_SUBTYPES VARCHAR2 DEFAULT 'YES')
-- Find the Storage Model for the Base Type.
-- If the type is derived from another type we need the storage model of the Base Type
-- As storage models are calculated they are cached in the global temporary table XDBPM_STORAGE_MODEL_CACHE. This makes
-- the process much more efficient. A global temporary table is used to minimize memory usage.
return XMLType
as
V_STORAGE_MODEL XMLType;
V_STORAGE_MODEL_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_STORAGE_MODEL_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTRIBUTE_COUNT VARCHAR2(10);
begin
dbms_output.put_line('findStorageModel(' || G_DEPTH_COUNT || ') : Processing "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '".' );
begin
SELECT STORAGE_MODEL
into V_STORAGE_MODEL
from XDBPM.XDBPM_STORAGE_MODEL_CACHE
where TYPE_NAME = P_TYPE_NAME
and TYPE_OWNER = P_TYPE_OWNER
and EXTENDED_DEFINITION = P_INCLUDE_SUBTYPES;
-- dbms_output.put_line('Resolved Storage Model from cache.');
exception
when no_data_found then
G_DEPTH_COUNT := G_DEPTH_COUNT + 1;
V_STORAGE_MODEL := getStorageModel(P_TYPE_NAME,P_TYPE_OWNER, P_INCLUDE_SUBTYPES);
G_DEPTH_COUNT := G_DEPTH_COUNT - 1;
when others then
raise;
end;
V_STORAGE_MODEL_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_STORAGE_MODEL);
V_STORAGE_MODEL_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_STORAGE_MODEL_DOCUMENT);
V_ATTRIBUTE_COUNT := DBMS_XMLDOM.GETATTRIBUTE(V_STORAGE_MODEL_ROOT,'columns');
dbms_output.put_line('findStorageModel : Attribute Count for "' || P_TYPE_OWNER || '"."' || P_TYPE_NAME || '" = ' || V_ATTRIBUTE_COUNT || '.' );
return V_STORAGE_MODEL;
end;
function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2, P_TYPE_NAME VARCHAR2, P_TYPE_OWNER VARCHAR2)
-- Generate a map showing the number of columns required to persist an instance of the SQL type.
return XMLType
as
V_STORAGE_MODEL XMLTYPE;
V_COUNT NUMBER := 0;
V_DOCUMENT DBMS_XMLDOM.DOMDOCUMENT;
V_ROOT DBMS_XMLDOM.DOMELEMENT;
V_ATTR DBMS_XMLDOM.DOMATTR;
V_MODEL DBMS_XMLDOM.DOMELEMENT;
V_TYPE_DEFINITION DBMS_XMLDOM.DOMELEMENT;
begin
V_STORAGE_MODEL := makeElement(P_COMPLEX_TYPE_NAME);
V_DOCUMENT := DBMS_XMLDOM.NEWDOMDOCUMENT(V_STORAGE_MODEL);
V_ROOT := DBMS_XMLDOM.GETDOCUMENTELEMENT(V_DOCUMENT);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLType');
DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_NAME);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'SQLTypeOwner');
DBMS_XMLDOM.SETVALUE(V_ATTR,P_TYPE_OWNER);
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
V_TYPE_DEFINITION := DBMS_XMLDOM.GETDOCUMENTELEMENT(DBMS_XMLDOM.NEWDOMDOCUMENT(findStorageModel(P_TYPE_NAME, P_TYPE_OWNER, 'YES')));
V_TYPE_DEFINITION := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.IMPORTNODE(V_DOCUMENT,DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION),TRUE));
V_TYPE_DEFINITION := DBMS_XMLDOM.MAKEELEMENT(DBMS_XMLDOM.APPENDCHILD(DBMS_XMLDOM.MAKENODE(V_ROOT),DBMS_XMLDOM.MAKENODE(V_TYPE_DEFINITION)));
V_ATTR := DBMS_XMLDOM.CREATEATTRIBUTE(V_DOCUMENT,'columns');
DBMS_XMLDOM.SETVALUE(V_ATTR,DBMS_XMLDOM.GETATTRIBUTE(V_TYPE_DEFINITION,'columns'));
V_ATTR := DBMS_XMLDOM.SETATTRIBUTENODE(V_ROOT,V_ATTR);
return V_STORAGE_MODEL;
end;
function analyzeStorageModel(P_COMPLEX_TYPE_NAME VARCHAR2)
return XMLTYPE
-- Generate a map showing the number of columns required to persist an instance of the complex type.
as
pragma autonomous_transaction;
V_SQLTYPE VARCHAR2(128);
V_SQLSCHEMA VARCHAR2(32);
V_RESULT XMLType;
begin
G_DEPTH_COUNT := 0;
select ct.XMLDATA.SQLTYPE, ct.XMLDATA.SQLSCHEMA
into V_SQLTYPE, V_SQLSCHEMA
from XDB.XDB$COMPLEX_TYPE ct, XDB.XDB$SCHEMA s
where ct.XMLDATA.NAME = P_COMPLEX_TYPE_NAME
and ref(s) = ct.XMLDATA.PARENT_SCHEMA
and s.XMLDATA.SCHEMA_OWNER = USER;
delete from XDBPM.XDBPM_STORAGE_MODEL_CACHE;
-- delete from XDBPM.XDBPM_STORAGE_MODEL;
V_RESULT := analyzeStorageModel(P_COMPLEX_TYPE_NAME,V_SQLTYPE,V_SQLSCHEMA);
COMMIT;
return V_RESULT;
exception
when no_data_found then
-- dbms_output.put_line('Unable to find SQLType mapping for complexType : "' || USER || '"."' || P_COMPLEX_TYPE_NAME || '".' );
return null;
when others then
raise;
end;
function analyzeSQLType(ATTR_NAME VARCHAR2, TARGET_TYPE_NAME VARCHAR2, TARGET_TYPE_OWNER VARCHAR2)
return XMLType
as
ROOT_NODE_NAME VARCHAR2(128);
ATTR_DETAIL XMLTYPE;
XPATH_EXPRESSION VARCHAR2(129);
CURSOR FIND_CHILD_ATTRS is
select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
from ALL_TYPE_ATTRS
where OWNER = TARGET_TYPE_OWNER
and TYPE_NAME = TARGET_TYPE_NAME
order by ATTR_NO;
CHILD_ATTR XMLTYPE;
ATTR_COUNT NUMBER := 0;
TEMP number;
COLLECTION_TYPE_NAME varchar2(256);
COLLECTION_TYPE_OWNER varchar2(256);
begin
-- -- dbms_output.put_line('Processing Attribute ' || ATTR_NAME || ' of ' || TARGET_TYPE_OWNER || '.' || TARGET_TYPE_NAME );
ATTR_DETAIL := makeElement(ATTR_NAME);
XPATH_EXPRESSION := '/' || ATTR_DETAIL.GETROOTELEMENT();
for ATTR in FIND_CHILD_ATTRS loop
begin
select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
into COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER
from ALL_COLL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER );
ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT() || '/@sqlAttrs').getNumberVal();
select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
into ATTR_DETAIL
from DUAL;
exception
when no_data_found then
begin
select 1
into TEMP
from ALL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER );
ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT() || '/@sqlAttrs').getNumberVal();
select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
into ATTR_DETAIL
from DUAL;
exception
when no_data_found then
ATTR_COUNT := ATTR_COUNT + 1;
end;
end;
end loop;
select insertChildXML(ATTR_DETAIL,XPATH_EXPRESSION,'@sqlAttrs',ATTR_COUNT)
into ATTR_DETAIL
from dual;
return ATTR_DETAIL;
end;
function analyzeComplexType(COMPLEX_TYPE VARCHAR2)
return XMLType
as
RESULT xmltype;
SQLTYPE varchar2(128);
SQLTYPE_OWNER varchar2(32);
begin
select SQLTYPE, SQLTYPE_OWNER
into SQLTYPE, SQLTYPE_OWNER
from USER_XML_SCHEMAS,
xmlTable
xmlnamespaces
'http://www.w3.org/2001/XMLSchema' as "xsd",
'http://xmlns.oracle.com/xdb' as "xdb"
'/xsd:schema/xsd:complexType'
passing Schema
columns
COMPLEX_TYPE_NAME varchar2(4000) path '@name',
SQLTYPE varchar2(128) path '@xdb:SQLType',
SQLTYPE_OWNER varchar2(32) path '@xdb:SQLSchema'
where COMPLEX_TYPE_NAME = COMPLEX_TYPE;
result := analyzeSQLType(COMPLEX_TYPE,SQLTYPE,SQLTYPE_OWNER);
select insertChildXML(RESULT,'/' || COMPLEX_TYPE,'@SQLType',SQLTYPE)
into result
from dual;
return result;
end;
function showSQLTypes(schemaFolder varchar2) return XMLType
is
xmlSchema XMLTYPE;
begin
select xmlElement
"TypeList",
xmlAgg
xmlElement
"Schema",
xmlElement
"ResourceName",
extractValue(res,'/Resource/DisplayName')
xmlElement
"complexTypes",
select xmlAgg
xmlElement
"complexType",
xmlElement
"name",
extractValue(value(XML),'/xsd:complexType/@name',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)
xmlElement
"SQLType",
extractValue(value(XML),'/xsd:complexType/@xdb:SQLType',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)
from table
xmlsequence
extract
xdburitype(p.path).getXML(),
'/xsd:schema/xsd:complexType',
XDB_NAMESPACES.XDBSCHEMA_PREFIXES
) xml
-- order by extractValue(value(XML),'/xsd:complexType/@name',XDB_NAMESPACES.XDBSCHEMA_PREFIXES)
).extract('/*')
into xmlSchema
from path_view p
where under_path(res,schemaFolder) = 1
order by extractValue(res,'/Resource/DisplayName');
return xmlSchema;
end;
procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2)
as
SYSTEM_GENERATED_NAME varchar2(256);
COLLECTION_TABLE_NAME varchar2(256);
CLUSTERED_INDEX_NAME varchar2(256);
PARENT_INDEX_NAME varchar2(256);
RENAME_STATEMENT varchar2(4000);
begin
COLLECTION_TABLE_NAME := COLLECTION_TABLE_PREFIX || '_TABLE';
CLUSTERED_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_DATA';
PARENT_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_LIST';
select TABLE_NAME
into SYSTEM_GENERATED_NAME
from ALL_NESTED_TABLES
where PARENT_TABLE_NAME = XMLTABLE
and PARENT_TABLE_COLUMN = XPATH
and OWNER = USER;
RENAME_STATEMENT := 'alter table ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' ||COLLECTION_TABLE_NAME || '"';
-- -- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
begin
select INDEX_NAME
into SYSTEM_GENERATED_NAME
from ALL_INDEXES
where TABLE_NAME = COLLECTION_TABLE_NAME
and INDEX_TYPE = 'IOT - TOP'
and OWNER = USER;
RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || CLUSTERED_INDEX_NAME || '"';
-- -- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
exception
when NO_DATA_FOUND then
null;
end;
begin
select INDEX_NAME
into SYSTEM_GENERATED_NAME
from ALL_IND_columns
where COLUMN_NAME = XPATH
and TABLE_NAME = XMLTABLE
and TABLE_OWNER = USER;
RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || PARENT_INDEX_NAME || '"';
-- -- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
exception
when NO_DATA_FOUND then
null;
end;
end;
function processNestedTable(currentLevel in out number, currentNode in out XMLType, query SYS_REFCURSOR)
return XMLType
is
thisLevel number;
thisNode xmlType;
result xmlType;
begin
thisLevel := currentLevel;
thisNode := currentNode;
fetch query into currentLevel, currentNode;
if (query%NOTFOUND) then
currentLevel := -1;
end if;
while (currentLevel >= thisLevel) loop
-- Next Node is a decendant of sibling of this Node.
if (currentLevel > thisLevel) then
-- Next Node is a decendant of this Node.
result := processNestedTable(currentLevel, currentNode, query);
select xmlElement
"Collection",
extract(thisNode,'/Collection/*'),
xmlElement
"NestedCollections",
result
into thisNode
from dual;
else
-- Next node is a sibling of this Node.
result := processNestedTable(currentLevel, currentNode, query);
select xmlconcat(thisNode,result) into thisNode from dual;
end if;
end loop;
-- Next Node is a sibling of some ancestor of this node.
return thisNode;
end;
function printNestedTables(XML_TABLE varchar2)
return XMLType
is
query SYS_REFCURSOR;
result XMLType;
rootLevel number := 0;
rootNode xmlType;
begin
open query for
select level, xmlElement
"Collection",
xmlElement
"CollectionId",
PARENT_TABLE_COLUMN
) as XML
from USER_NESTED_TABLES
connect by PRIOR TABLE_NAME = PARENT_TABLE_NAME
start with PARENT_TABLE_NAME = XML_TABLE;
fetch query into rootLevel, rootNode;
result := processNestedTable(rootLevel, rootNode, query);
select xmlElement
"NestedTableStructure",
result
into result
from dual;
return result;
end;
function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER)
return XMLTYPE
as
xmlSchema XMLTYPE;
begin
select xmlElement
"xsd:schema",
xmlAttributes
'http://www.w3.org/2001/XMLSchema' as "xmlns:xsd",
'http://xmlns.oracle.com/xdb' as "xmlns:xdb"
xmlElement
"xsd:element",
xmlAttributes
'ROWSET' as "name",
'rowset' as "type"
xmlElement
"xsd:complexType",
xmlAttributes
'rowset' as "name"
xmlElement
"xsd:sequence",
xmlElement
"xsd:element",
xmlAttributes
'ROW' as "name",
table_name || '_T' as "type",
'unbounded' as "maxOccurs"
xmlElement
"xsd:complexType",
xmlAttributes
table_name || '_T' as "name"
xmlElement
"xsd:sequence",
xmlAgg(ELEMENT order by INTERNAL_COLUMN_ID)
into xmlSchema
from (select TABLE_NAME, INTERNAL_COLUMN_ID,
case
when DATA_TYPE in ('VARCHAR2','CHAR') then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLType"
xmlElement
"xsd:simpleType",
xmlElement
"xsd:restriction",
xmlAttributes
'xsd:string' as "base"
xmlElement
"xsd:maxLength",
xmlAttributes
DATA_LENGTH as "value"
when DATA_TYPE = 'NUMBER' then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLType"
xmlElement
"xsd:simpleType",
xmlElement
"xsd:restriction",
xmlAttributes
decode(DATA_SCALE, 0, 'xsd:integer', 'xsd:double') as "base"
xmlElement
"xsd:totalDigits",
xmlAttributes
DATA_PRECISION as "value"
when DATA_TYPE = 'DATE' then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
'xsd:date' as "type",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLType"
when DATA_TYPE like 'TIMESTAMP%WITH TIME ZONE' then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
'xsd:dateTime' as "type",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLType"
else
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
decode(NULLABLE, 'Y', 0, 1) as "minOccurs",
'xsd:anySimpleType' as "type",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLType"
end ELEMENT
from all_tab_cols c
where c.TABLE_NAME = P_TABLE_NAME
and c.OWNER = P_OWNER
group by TABLE_NAME;
return xmlSchema;
end;
function appendElementList(V_ELEMENT_LIST IN OUT XDB.XDB$XMLTYPE_REF_LIST_T, V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
function expandModel(P_MODEL XDB.XDB$MODEL_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
function expandChoiceList(P_CHOICE_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
function expandSequenceList(P_SEQUENCE_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
function expandGroupList(P_GROUP_LIST XDB.XDB$XMLTYPE_REF_LIST_T) return XDB.XDB$XMLTYPE_REF_LIST_T;
function appendElementList(V_ELEMENT_LIST IN OUT XDB.XDB$XMLTYPE_REF_LIST_T, V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
begin
SELECT CAST
SET
CAST(V_ELEMENT_LIST as XDBPM.XMLTYPE_REF_TABLE_T)
MULTISET UNION
CAST(V_CHILD_ELEMENT_LIST as XDBPM.XMLTYPE_REF_TABLE_T)
as XDB.XDB$XMLTYPE_REF_LIST_T
into V_ELEMENT_LIST
from DUAL;
return V_ELEMENT_LIST;
end;
function expandModel(P_MODEL XDB.XDB$MODEL_T)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
begin
V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
if P_MODEL.ELEMENTS is not null then
V_ELEMENT_LIST := P_MODEL.ELEMENTS;
end if;
if (P_MODEL.CHOICE_KIDS is not NULL) then
V_CHILD_ELEMENT_LIST := expandChoiceList(P_MODEL.CHOICE_KIDS);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end if;
if (P_MODEL.SEQUENCE_KIDS is not NULL) then
V_CHILD_ELEMENT_LIST := expandSequenceList(P_MODEL.SEQUENCE_KIDS);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end if;
-- Process ANYS
if (P_MODEL.GROUPS is not NULL) then
V_CHILD_ELEMENT_LIST := expandGroupList(P_MODEL.GROUPS);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end if;
return V_ELEMENT_LIST;
end;
function expandChoiceList(P_CHOICE_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
cursor getChoices is
select c.XMLDATA MODEL
from XDB.XDB$CHOICE_MODEL c, TABLE(P_CHOICE_LIST) cl
where ref(c) = value(cl);
begin
V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
for c in getChoices loop
V_CHILD_ELEMENT_LIST := expandModel(c.MODEL);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end loop;
return V_ELEMENT_LIST;
end;
function expandSequenceList(P_SEQUENCE_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
cursor getSequences is
select s.XMLDATA MODEL
from XDB.XDB$SEQUENCE_MODEL s, TABLE(P_SEQUENCE_LIST) sl
where ref(s) = value(sl);
begin
V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
for s in getSequences loop
V_CHILD_ELEMENT_LIST := expandModel(s.MODEL);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end loop;
return V_ELEMENT_LIST;
end;
function expandGroupList(P_GROUP_LIST XDB.XDB$XMLTYPE_REF_LIST_T)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T;
V_CHILD_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T; V_MODEL XDB.XDB$MODEL_T;
cursor getGroups is
SELECT CASE
-- Return The MODEL Definition for the CHOICE, ALL or SEQUENCE
WHEN gd.XMLDATA.ALL_KID is not NULL
THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
WHEN gd.XMLDATA.CHOICE_KID is not NULL
THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
END MODEL
FROM XDB.XDB$GROUP_DEF gd, XDB.XDB$GROUP_REF gr, TABLE(P_GROUP_LIST) gl
WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
and ref(gr) = value(gl);
begin
V_ELEMENT_LIST := XDB.XDB$XMLTYPE_REF_LIST_T();
for g in getGroups loop
V_CHILD_ELEMENT_LIST := expandModel(g.MODEL);
V_ELEMENT_LIST := appendElementList(V_ELEMENT_LIST,V_CHILD_ELEMENT_LIST);
end loop;
return V_ELEMENT_LIST;
end;
function getComplexTypeElementList(P_COMPLEX_TYPE_REF REF XMLTYPE)
return XDB.XDB$XMLTYPE_REF_LIST_T
as
V_MODEL XDB.XDB$MODEL_T;
V_BASE_TYPE REF XMLTYPE;
V_ELEMENT_LIST XDB.XDB$XMLTYPE_REF_LIST_T := XDB.XDB$XMLTYPE_REF_LIST_T();
begin
SELECT ct.XMLDATA.BASE_TYPE,
CASE
-- Return The MODEL Definition for the CHOICE, ALL or SEQUENCE
WHEN ct.XMLDATA.ALL_KID is not NULL
THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.ALL_KID)
WHEN ct.XMLDATA.SEQUENCE_KID is not NULL
THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.SEQUENCE_KID)
WHEN ct.XMLDATA.CHOICE_KID is not NULL
THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.CHOICE_KID)
WHEN ct.XMLDATA.GROUP_KID is not NULL
-- COMPLEXTYPE is based on a GROUP.
THEN (
-- RETURN The CHOICE, ALL or SEQUENCE for GROUP
SELECT CASE
WHEN gd.XMLDATA.ALL_KID is not NULL
THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
WHEN gd.XMLDATA.CHOICE_KID is not NULL
THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
END
FROM XDB.XDB$GROUP_DEF gd, xdb.xdb$GROUP_REF gr
WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
and ref(gr) = ct.XMLDATA.GROUP_KID
-- WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.ALL_KID is not NULL
-- THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.ALL_KID)
-- WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.SEQUENCE_KID is not NULL
-- THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.SEQUENCE_KID)
-- WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.CHOICE_KID is not NULL
-- THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.CHOICE_KID)
-- WHEN ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.GROUP_KID is not NULL
-- -- COMPLEXTYPE is based on a GROUP.
-- THEN (
-- -- RETURN The CHOICE, ALL or SEQUENCE for GROUP
-- SELECT CASE
-- WHEN gd.XMLDATA.ALL_KID is not NULL
-- THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
-- WHEN gd.XMLDATA.SEQUENCE_KID is not NULL
-- THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = gd.XMLDATA.SEQUENCE_KID)
-- WHEN gd.XMLDATA.CHOICE_KID is not NULL
-- THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = gd.XMLDATA.CHOICE_KID)
-- END
-- FROM XDB.XDB$GROUP_DEF gd, xdb.xdb$GROUP_REF gr
-- WHERE ref(gd) = gr.XMLDATA.GROUPREF_REF
-- and ref(gr) = ct.XMLDATA.COMPLEXCONTENT.RESTRICTION.GROUP_KID
WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.ALL_KID is not NULL
THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.ALL_KID)
WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.SEQUENCE_KID is not NULL
THEN ( SELECT s.XMLDATA from XDB.XDB$SEQUENCE_MODEL s where ref(s) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.SEQUENCE_KID)
WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.CHOICE_KID is not NULL
THEN ( SELECT c.XMLDATA from XDB.XDB$CHOICE_MODEL c where ref(c) = ct.XMLDATA.COMPLEXCONTENT.EXTENSION.CHOICE_KID)
WHEN ct.XMLDATA.COMPLEXCONTENT.EXTENSION.GROUP_KID is not NULL
-- COMPLEXTYPE is based on a GROUP.
THEN (
-- RETURN The CHOICE, ALL or SEQUENCE for GROUP
SELECT CASE
WHEN gd.XMLDATA.ALL_KID is not NULL
THEN ( SELECT a.XMLDATA from XDB.XDB$ALL_MODEL a where ref(a) = gd.XMLDATA.ALL_KID)
-
Passing complex object from bpel process to web service
I have deployed my web service on apache axis.The wsdl file looks like as follows,
<?xml version="1.0" encoding="UTF-8" ?>
- <wsdl:definitions targetNamespace="http://bpel.jmetro.actiontech.com" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="http://bpel.jmetro.actiontech.com" xmlns:intf="http://bpel.jmetro.actiontech.com" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <wsdl:types>
- <schema targetNamespace="http://bpel.jmetro.actiontech.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
- <complexType name="ADLevelBpelWS">
- <sequence>
<element name="adLevelStr" nillable="true" type="xsd:string" />
<element name="id" type="xsd:int" />
</sequence>
</complexType>
- <complexType name="TransResultWS">
- <sequence>
<element name="description" nillable="true" type="xsd:string" />
<element name="id" type="xsd:long" />
<element name="responseType" type="xsd:int" />
<element name="status" type="xsd:boolean" />
</sequence>
</complexType>
- <complexType name="NamespaceDataImplBpelWS">
- <sequence>
<element name="ADLevel" nillable="true" type="impl:ADLevelBpelWS" />
<element name="appdataDef" nillable="true" type="apachesoap:Map" />
<element name="description" nillable="true" type="xsd:string" />
<element name="name" nillable="true" type="xsd:string" />
</sequence>
</complexType>
- <complexType name="CreateSharedNamespaceBpelWS">
- <sequence>
<element name="actor" nillable="true" type="xsd:string" />
<element name="comment" nillable="true" type="xsd:string" />
<element name="from" nillable="true" type="xsd:string" />
<element name="namespaceData" nillable="true" type="impl:NamespaceDataImplBpelWS" />
<element name="priority" type="xsd:int" />
<element name="processAtTime" nillable="true" type="xsd:dateTime" />
<element name="replyTo" nillable="true" type="xsd:string" />
<element name="responseRequired" type="xsd:boolean" />
</sequence>
</complexType>
</schema>
- <schema targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
- <complexType name="mapItem">
- <sequence>
<element name="key" nillable="true" type="xsd:string" />
<element name="value" nillable="true" type="xsd:string" />
</sequence>
</complexType>
- <complexType name="Map">
- <sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem" />
</sequence>
</complexType>
</schema>
</wsdl:types>
+ <wsdl:message name="createNamespaceRequest">
<wsdl:part name="createNs" type="impl:CreateSharedNamespaceBpelWS" />
</wsdl:message>
- <wsdl:message name="createNamespaceResponse">
<wsdl:part name="createNamespaceReturn" type="impl:TransResultWS" />
</wsdl:message>
- <wsdl:portType name="JMetroWebService">
- <wsdl:operation name="createNamespace" parameterOrder="createNs">
<wsdl:input message="impl:createNamespaceRequest" name="createNamespaceRequest" />
<wsdl:output message="impl:createNamespaceResponse" name="createNamespaceResponse" />
</wsdl:operation>
</wsdl:portType>
- <wsdl:binding name="NAMESPACEWITHMAPSoapBinding" type="impl:JMetroWebService">
<wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
- <wsdl:operation name="createNamespace">
<wsdlsoap:operation soapAction="" />
- <wsdl:input name="createNamespaceRequest">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://bpel.jmetro.actiontech.com" use="encoded" />
</wsdl:input>
- <wsdl:output name="createNamespaceResponse">
<wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://bpel.jmetro.actiontech.com" use="encoded" />
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
- <wsdl:service name="JMetroWebServiceService">
- <wsdl:port binding="impl:NAMESPACEWITHMAPSoapBinding" name="NAMESPACEWITHMAP">
<wsdlsoap:address location="http://localhost:7001/axis/services/NAMESPACEWITHMAP" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
My NamespaceDataObjectImplBpelWS object contains element appDataDef which is of type java.util.Map.My bpel wsdl file is as below,
<?xml version="1.0"?>
<definitions name="NsWithMap"
targetNamespace="http://bpel.jmetro.actiontech.com"
xmlns:tns="http://bpel.jmetro.actiontech.com"
xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:apachesoap="http://xml.apache.org/xml-soap"
>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TYPE DEFINITION - List of services participating in this BPEL process
The default output of the BPEL designer uses strings as input and
output to the BPEL Process. But you can define or import any XML
Schema type and us them as part of the message types.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<types>
<schema targetNamespace="http://bpel.jmetro.actiontech.com" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<element name="createNamespace" type="tns:CreateSharedNamespaceBpelWS"/>
<element name="transResult" type="tns:TransResultWS"/>
<complexType name="TransResultWS">
<sequence>
<element name="description" type="string" />
<element name="id" type="long" />
<element name="responseType" type="int" />
<element name="status" type="boolean" />
</sequence>
</complexType>
<complexType name="ADLevelBpelWS">
<sequence>
<element name="adLevelStr" type="string" />
<element name="id" type="int" />
</sequence>
</complexType>
<complexType name="NamespaceDataImplBpelWS">
<sequence>
<element name="ADLevel" type="tns:ADLevelBpelWS" />
<element name="description" type="string" />
<element name="name" type="string" />
<element name="appdataDef" type="apachesoap:Map" />
</sequence>
</complexType>
<complexType name="CreateSharedNamespaceBpelWS">
<sequence>
<element name="namespaceData" type="tns:NamespaceDataImplBpelWS" />
</sequence>
</complexType>
<element name="desc" type="string"/>
</schema>
<schema targetNamespace="http://xml.apache.org/xml-soap" xmlns="http://www.w3.org/2001/XMLSchema">
<import namespace="http://schemas.xmlsoap.org/soap/encoding/" />
<complexType name="mapItem">
<sequence>
<element name="key" type="string" />
<element name="value" type="string" />
</sequence>
</complexType>
<complexType name="Map">
<sequence>
<element maxOccurs="unbounded" minOccurs="0" name="item" type="apachesoap:mapItem" />
</sequence>
</complexType>
</schema>
</types>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MESSAGE TYPE DEFINITION - Definition of the message types used as
part of the port type defintions
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<message name="NsWithMapRequestMessage">
<part name="payload" element="tns:createNamespace"/>
</message>
<message name="NsWithMapResponseMessage">
<part name="payload" element="tns:transResult"/>
</message>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PORT TYPE DEFINITION - A port type groups a set of operations into
a logical service unit.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<!-- portType implemented by the NsWithMap BPEL process -->
<portType name="NsWithMap">
<operation name="initiate">
<input message="tns:NsWithMapRequestMessage"/>
</operation>
</portType>
<!-- portType implemented by the requester of NsWithMap BPEL process
for asynchronous callback purposes
-->
<portType name="NsWithMapCallback">
<operation name="onResult">
<input message="tns:NsWithMapResponseMessage"/>
</operation>
</portType>
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PARTNER LINK TYPE DEFINITION
the NsWithMap partnerLinkType binds the provider and
requester portType into an asynchronous conversation.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
<plnk:partnerLinkType name="NsWithMap">
<plnk:role name="NsWithMapProvider">
<plnk:portType name="tns:NsWithMap"/>
</plnk:role>
<plnk:role name="NsWithMapRequester">
<plnk:portType name="tns:NsWithMapCallback"/>
</plnk:role>
</plnk:partnerLinkType>
</definitions>
I am trying to set this map data using java code ,
HashMap procADMap1 = new HashMap(5);
PropertyTypeWS pType = new PropertyTypeWS();
pType.setTypeIndex(2);
AppdataDefImplWS appData1 = new AppdataDefImplWS();
appData1.setName("Project");
appData1.setType(pType);
appData1.setMaxSize(400);
appData1.setLOB(false);
appData1.setDefaultValue("Project Default value");
procADMap1.put(appData1.getName(), appData1);
setVariableData("request","createNs","/createNs/namespaceData/appdataDef",procADMap1);
Then I am passing request object to the method which I want to invoke from bpel process.
I am able to deploy the application but when I do post message I am getting following exception,
NamespaceWithMap (createNamespace) (faulted)
[2004/09/09 18:35:54] "{http://schemas.oracle.com/bpel/extension}bindingFault" has been thrown. Less
faultName: {{http://schemas.oracle.com/bpel/extension}bindingFault}
messageType: {{http://schemas.oracle.com/bpel/extension}RuntimeFaultMessage}
code: {Server.userException}
summary: {org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.}
detail: {null}
Is there any other way to handle Map type in bpel process?
Thanks in advance,
SanjayThanks for the quick reply.Actually the web service is already deployed on the server.What I want to do is use existing wsdl file of the deployed web service and invoke the method of the same using oracle PM.
If I remove element which uses apachesoap:Map type it just works fine also I am getting the complex object returned by the web service method.But when I try to set appDataDef which is of type apachesoap:Map(Axis conversion for java.util.Map and it uses namespace xmlns:apachesoap="http://xml.apache.org/xml-soap") I am getting the error.
Can you give me some direction to use this exising wsdl file to set map object or it is not possible. -
Unable to invoke a EJB from a BPEL process
I am unable to invoke a EJB from a BPEL process. Whenever I try to test it from the oracle EM, I get the below exception. I am using WebLogic 10.3.3, SOA suite 11.1.1.3 and JDev 11.1.1.3 .
This is what I see from the EM....
Non Recoverable System Fault :
javaInterface attribute for the binding is missing or the inteface class is not available.
Below is a part of the stack trace from the soa server log…
Caused By: oracle.classloader.util.AnnotatedClassNotFoundException:
Missing class: com.abc.GreetingEJBBean
Dependent class: oracle.integration.platform.blocks.ejb.SDOEjbReferenceD
elegateImpl
Loader: sun.misc.Launcher$AppClassLoader@20929799
Code-Source: /C:/Oracle_latest/Middleware/home_11gR1/Oracle_SOA1/soa
/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar
Configuration: /C:/Oracle_latest/Middleware/home_11gR1/Oracle_SOA1/soa
/modules/oracle.soa.fabric_11.1.1/fabric-runtime.jar
Piece of xml from the composite.xml
<reference name="GreetingService"
ui:wsdlLocation="http://123.45.218.140:7001/GreetingEJBBean/GreetingEJBBeanService?wsdl">
<interface.wsdl interface="http://abc.com/#wsdl.interface(GreetingEJBBean)" />
<binding.ejb uri="GreetingEJB-GreetingEJB-GreetingEJB"
javaInterface="com.abc.GreetingEJB"/>
</reference>
Looks like its not able to find the javaInterface mentioned above.
I have a simple EJB with one business method and a very simple BPEL process.
@Stateless(name = "GreetingEJB", mappedName = "GreetingEJB-GreetingEJB-GreetingEJB")
@WebService
public class GreetingEJBBean implements GreetingEJB {
public GreetingEJBBean() {
public String greetUser(String name){
return ("Hello " + name);
Any help would be greatly appreciated.I haven't tried from a BPEL process, but I have had success (as in Lucas's blogs) of using services and references as EJB Java Interface. This is with EJB java interfaces solely of base types (i.e. String foo(String s)).
At high level here's what I have noted so far:
1. Per Lucas's blog, @javaInterface is not being added to the ejb.binding automatically but it's not clear to me when this is and is not required given that interface.java is specified for the reference or service. Would interface.java and @javaInterface ever be different? I've been adding @javaInterface manually anyways since Lucas is a smart guy and I'd rather avoid errors. :-)
2. Dropping an EJB interface jar in SCA-INF/lib works, but I've had the problem that the JDeveloper SOA Plugin doesn't see those classes until I stop and restart JDeveloper. Until then, I'm confronted with the java->wsdl mapping error. I was sort of primed to figure this one out since I ran into similar issues with SOA SpringBean components.
3. Dropping EJB interface source in SCA-INF/src is more reliable, because then I can build the project (i.e. create SCA-INF/classes) and the JDeveloper SOA Plugin seems to resolve these brand new classes immediately.
4. I've tried to invoke an EJB java-interface reference with a slightly complicated java interface (a class parameter with some fields, one of which is an array of another class). The auto-generated WSDL doesn't look exactly right to me (but I'm new to JAXB). Mediator maps to it just fine and the project compiles and deploys normally but fails at runtime. I have not researched in depth. It's not clear to me from the documentation and release notes whether I should expect for it to work, or whether I should expect to have to create my own JAXB mapping. If the latter, I really need a good example! -
Toplink xml binding session.xml and servlet
I made a project with toplink-jaxb mapping
with simple pojo object it works fine.
I made another project with servlet
and the same session.xml and java classes
but when my process start it throw an exception :
jaxbexception : Provider oracle.toplink.ox.jaxb.JAXBContextFactory could not be instantiated:
It is like the process could not read the session.xml files, but this file and two xml file for the mapping are in the classpath (in WEB-INF/classes).
Have i to put these files in another place ?
Thanks.Hi,
thank you for your response but
here is the code :
javax.xml.bind.JAXBContext jaxbContext = javax.xml.bind.JAXBContext.newInstance(
"fr.cnav.cramse.pgpe.contactsnationaux"),this.getClass().getClassLoader());
but i still got the same exception :
05/03/01 08:24:33 exceptionProvider oracle.toplink.ox.jaxb.JAXBContextFactory could not be instantiated: java.lang.NoSuchMethodError: oracle.toplink.publicinterface.Session oracle.toplink.tools.sessionmanagement.SessionManager.getSession(oracle.toplink.tools.sessionconfiguration.XMLSessionConfigLoader, java.lang.String, java.lang.ClassLoader, boolean, boolean)
I have also a stange message in the log window in jdev :
Cutting log (size: 101767, max: 100000)Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Component returned failure code: 0x80470002 (NS_BASE_STREAM_CLOSED) [nsIFileOutputStream.write]Cutting log (size: 101866, max: 100000)Error cleaning up log: Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISeekableStream.seek]
Thank you for your help. -
Hello,
I'm using Toplink JAXB to generate XML document from java classes in a JSF application (all in JDeveloper 10.1.3).
Everything works fine in JDeveloper embedded OC4J, but when deploed to OAS 10.1.3, the application gives the following exception:
Exception [TOPLINK-25007] (Oracle TopLink - 10g Release 3 (10.1.3.0.0) (Build 060118)): oracle.toplink.exceptions.XMLMarshalExceptionException Description: A descriptor for class com.allstate.mqq.re.xao.jaxb.map.MqqrequestImpl was not found in the project]
Has anyone experienced the same problem?
Please help
Thanks
KateSee:
Re: Toplink JAXB Marshalling
-Blaise -
Xpath performance and xsi namespace
In my xpath, I need to use the "xsi" namespace to specify the xpath condition. It seems to be the performance of the xpath that uses the "xsi" namespace is extremly slow, compared with a similar xpath that does not use the name space, although the number of retrieved objects are the same in my test case.
What causes such a big difference in speed? Is that possible when I use the "xsi" namespace in the xpath, the xpath is not get rewritten? How can I improve the performance when using "xsi" namespace.
1)xpath not use the namespace
select extract(object_value, '/Test/Group/Object[uniqueName="a1"]') from Test where existsNode(object_value, '/Test/Group[uniqueName="N10001"])=1;
2)xpath use the "xsi" namespace
select extract(object_value, '/Test/Group/Object[uniqueName="a1" and @xsi:type="Architecture"]', 'xmlns="http://www.myspace.com/testXML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"') from Test where existsNode(object_value, '/Test/Group[uniqueName="N10001"])=1;Yes, you'll need to workout where to split the document.. Good, and typical points to break up the entity are if you have a choice of one or more complex structures.
The following code may help with looking at this..
You'll need to register the XML Schema with gentables="false" so that all the types get generated.. You can then look at the types and see how many columns each type will generate if you build a table on it...
create or replace package XDB_ANALYZE_XMLSCHEMA_11100
authid CURRENT_USER
as
function analyzeStorageModel(COMPLEX_TYPE VARCHAR2) return XMLTYPE;
function analyzeStorageModel(ATTR_NAME VARCHAR2, SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2) return XMLType;
function analyzeComplexType(COMPLEX_TYPE VARCHAR2) return XMLTYPE;
procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2);
function printNestedTables(XML_TABLE varchar2) return XMLType;
function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER) return XMLTYPE;
function showSQLTypes(schemaFolder varchar2) return XMLType;
NAMESPACES varchar2(1024) := xdb_namespaces.XMLSCHEMA_PREFIX_XSD || ' ' || xdb_namespaces.XDBSCHEMA_PREFIX_XDB;
end XDB_ANALYZE_XMLSCHEMA_11100;
show errors
create or replace package body XDB_ANALYZE_XMLSCHEMA_11100
as
TYPE STORAGE_MODEL_T is RECORD
TYPE_NAME varchar2(128),
TYPE_OWNER varchar2(32),
STORAGE_MODEL XMLType
TYPE STORAGE_MODEL_LIST_T is TABLE OF STORAGE_MODEL_T;
TYPE BASETYPE_T is RECORD
SUBTYPE varchar2(128),
SUBTYPE_OWNER varchar2(32),
BASETYPE varchar2(128),
BASETYPE_OWNER varchar2(32)
TYPE BASETYPE_LIST_T IS TABLE OF BASETYPE_T;
DEPTH_COUNT NUMBER(2) := 0;
STORAGE_MODEL_LIST STORAGE_MODEL_LIST_T := STORAGE_MODEL_LIST_T();
BASETYPE_LIST BASETYPE_LIST_T := BASETYPE_LIST_T();
function getLocalAttributes(SQLTYPE varchar2, SQLTYPE_OWNER VARCHAR2) return XMLType;
function makeElement(ATTR_NAME varchar2)
return xmltype
as
VALID_NAME varchar2(4000) := ATTR_NAME;
begin
-- dbms_output.put_line('Processing : ' || ATTR_NAME);
if (ATTR_NAME LIKE '%$') THEN
VALID_NAME := SUBSTR(VALID_NAME,1,LENGTH(VALID_NAME) - 1);
end if;
return XMLTYPE( '<' || VALID_NAME || '/>');
end;
function getPathToRoot(SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
return varchar2
as
TYPE_HIERARCHY varchar2(4000);
begin
SELECT sys_connect_by_path( OWNER || '.' || TYPE_NAME , '/')
INTO TYPE_HIERARCHY
FROM ALL_TYPES
WHERE TYPE_NAME = SUBTYPE
AND OWNER = SUBTYPE_OWNER
CONNECT BY SUPERTYPE_NAME = PRIOR TYPE_NAME
AND SUPERTYPE_OWNER = PRIOR OWNER
START WITH SUPERTYPE_NAME IS NULL
AND SUPERTYPE_OWNER IS NULL;
return TYPE_HIERARCHY;
end;
function expandSQLType(ATTR_NAME VARCHAR2, SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
return XMLType
as
STORAGE_MODEL XMLTYPE;
ATTRIBUTES XMLTYPE;
EXTENDED_TYPE XMLTYPE;
ATTR_COUNT NUMBER := 0;
CURSOR FIND_EXTENDED_TYPES
is
select TYPE_NAME, OWNER
from ALL_TYPES
where SUPERTYPE_NAME = SUBTYPE
and SUPERTYPE_OWNER = SUBTYPE_OWNER;
begin
dbms_output.put_line('Processing SQLType : "' || SUBTYPE_OWNER || '.' || SUBTYPE || '".' );
STORAGE_MODEL := makeElement(ATTR_NAME);
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@type',SUBTYPE)
into STORAGE_MODEL
from dual;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@typeOwner',SUBTYPE_OWNER)
into STORAGE_MODEL
from dual;
ATTRIBUTES := getLocalAttributes(SUBTYPE, SUBTYPE_OWNER);
ATTR_COUNT := ATTR_COUNT + ATTRIBUTES.extract('/' || ATTRIBUTES.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),ATTRIBUTES)
into STORAGE_MODEL
from DUAL;
for t in FIND_EXTENDED_TYPES loop
EXTENDED_TYPE := expandSQLType('ExtendedType',T.TYPE_NAME,T.OWNER);
ATTR_COUNT := ATTR_COUNT + EXTENDED_TYPE.extract('/' || EXTENDED_TYPE.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),EXTENDED_TYPE)
into STORAGE_MODEL
from DUAL;
end loop;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@columns',ATTR_COUNT)
into STORAGE_MODEL
from dual;
return STORAGE_MODEL;
end;
function getTypeHierarchy(ELEMENT_NAME varchar2, TYPE_HIERARCHY varchar2)
return XMLType
as
SUBTYPE_HIERARCHY varchar2(4000);
ATTRIBUTES XMLTYPE;
SUBTYPE_STORAGE_MODEL XMLTYPE;
STORAGE_MODEL XMLTYPE;
ATTR_COUNT NUMBER := 0;
V_TYPE_OWNER varchar2(32);
V_TYPE_NAME varchar2(128);
CURSOR FIND_EXTENDED_TYPES
is
select TYPE_NAME, OWNER
from ALL_TYPES
where SUPERTYPE_NAME = V_TYPE_NAME
and SUPERTYPE_OWNER = V_TYPE_OWNER;
begin
dbms_output.put_line('Type Hierarchy : ' || TYPE_HIERARCHY );
if DEPTH_COUNT > 25 then
return null;
end if;
DEPTH_COUNT := DEPTH_COUNT + 1;
SUBTYPE_HIERARCHY := substr(TYPE_HIERARCHY,instr(TYPE_HIERARCHY,'/',2));
V_TYPE_OWNER := substr(TYPE_HIERARCHY,2,instr(TYPE_HIERARCHY,'.',2) - 2);
if (instr(TYPE_HIERARCHY,'/',-1) > 1) then
V_TYPE_NAME := substr(TYPE_HIERARCHY,instr(TYPE_HIERARCHY,'.',2) + 1,instr(TYPE_HIERARCHY,'/',2) - instr(TYPE_HIERARCHY,'.',2) -1);
else
V_TYPE_NAME := substr(TYPE_HIERARCHY,instr(TYPE_HIERARCHY,'.') + 1);
SUBTYPE_HIERARCHY := null;
end if;
dbms_output.put_line('Processing : "' || V_TYPE_OWNER || '"."' || V_TYPE_NAME || '"');
STORAGE_MODEL := makeElement(ELEMENT_NAME);
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@type',V_TYPE_NAME)
into STORAGE_MODEL
from dual;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@typeOwner',V_TYPE_OWNER)
into STORAGE_MODEL
from dual;
ATTRIBUTES := getLocalAttributes(V_TYPE_NAME, V_TYPE_OWNER);
ATTR_COUNT := ATTR_COUNT + ATTRIBUTES.extract('/' || ATTRIBUTES.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),ATTRIBUTES)
into STORAGE_MODEL
from DUAL;
if (SUBTYPE_HIERARCHY is not null) then
SUBTYPE_STORAGE_MODEL := getTypeHierarchy('subType',SUBTYPE_HIERARCHY);
ATTR_COUNT := ATTR_COUNT + SUBTYPE_STORAGE_MODEL.extract('/' || SUBTYPE_STORAGE_MODEL.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),SUBTYPE_STORAGE_MODEL)
into STORAGE_MODEL
from DUAL;
else
dbms_output.put_line('Processing All known SubTypes of : "' || V_TYPE_OWNER || '"."' || V_TYPE_NAME || '"');
for t in FIND_EXTENDED_TYPES loop
SUBTYPE_STORAGE_MODEL := expandSQLType('ExtendedType',T.TYPE_NAME,T.OWNER);
ATTR_COUNT := ATTR_COUNT + SUBTYPE_STORAGE_MODEL.extract('/' || SUBTYPE_STORAGE_MODEL.getRootElement() || '/@columns').getNumberVal();
select appendChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),SUBTYPE_STORAGE_MODEL)
into STORAGE_MODEL
from DUAL;
end loop;
end if;
select insertChildXML(STORAGE_MODEL,'/' || STORAGE_MODEL.getRootElement(),'@columns',ATTR_COUNT)
into STORAGE_MODEL
from dual;
DEPTH_COUNT := DEPTH_COUNT - 1;
return STORAGE_MODEL;
end;
function getStorageModel(TYPE_NAME VARCHAR2, TYPE_OWNER VARCHAR2)
return XMLType
as
BASETYPE varchar2(128);
BASETYPE_OWNER varchar2(32);
STORAGE_MODEL STORAGE_MODEL_T;
begin
dbms_output.put_line('Depth : ' || DEPTH_COUNT || '. Getting Storage Model for "' || TYPE_OWNER || '.' || TYPE_NAME || '".' );
if DEPTH_COUNT > 25 then
return null;
end if;
DEPTH_COUNT := DEPTH_COUNT + 1;
for i in 1..STORAGE_MODEL_LIST.count loop
STORAGE_MODEL := STORAGE_MODEL_LIST(i);
if (STORAGE_MODEL.TYPE_NAME = TYPE_NAME and STORAGE_MODEL.TYPE_OWNER = TYPE_OWNER) then
DEPTH_COUNT := DEPTH_COUNT - 1;
return STORAGE_MODEL.STORAGE_MODEL;
end if;
end loop;
STORAGE_MODEL.TYPE_NAME := TYPE_NAME;
STORAGE_MODEL.TYPE_OWNER := TYPE_OWNER;
STORAGE_MODEL.STORAGE_MODEL := getTypeHierarchy('RootType',getPathToRoot(TYPE_NAME,TYPE_OWNER));
STORAGE_MODEL_LIST.extend(1);
STORAGE_MODEL_LIST(STORAGE_MODEL_LIST.count) := STORAGE_MODEL;
DEPTH_COUNT := DEPTH_COUNT - 1;
return STORAGE_MODEL.STORAGE_MODEL;
end;
function getLocalAttributes(SQLTYPE varchar2, SQLTYPE_OWNER VARCHAR2)
return XMLType
as
CHILD_ATTR XMLTYPE;
ATTR_COUNT NUMBER := 0;
COLLECTION_TYPE varchar2(128);
COLLECTION_OWNER varchar2(32);
SUPERTYPE varchar2(128);
STORAGE_MODEL xmlType;
SQL_ATTRIBUTES XMLTYPE := xmlType('<SQLAttributes/>');
CURSOR FIND_CHILD_ATTRS
is
select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
from ALL_TYPE_ATTRS
where TYPE_NAME = SQLTYPE
and OWNER = SQLTYPE_OWNER
and INHERITED = 'NO'
order by ATTR_NO;
begin
for ATTR in FIND_CHILD_ATTRS loop
CHILD_ATTR := makeElement(ATTR.ATTR_NAME);
begin
-- Check for Attributes based on collection types, With Nested Table storage each Collection will cost 2 columns.
select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
into COLLECTION_TYPE, COLLECTION_OWNER
from ALL_COLL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
-- Attribute is a Collection Type. Each Collection requires 2 columns.
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@collectionType',COLLECTION_TYPE)
into CHILD_ATTR
from dual;
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@collectionOwner',COLLECTION_OWNER)
into CHILD_ATTR
from dual;
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@columns',2)
into CHILD_ATTR
from dual;
exception
when no_data_found then
-- Attribute is not a collection type.
begin
-- Check for Attributes based on non-scalar types.
select SUPERTYPE_NAME
into SUPERTYPE
from ALL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
-- Attribute is based on a non-scalar type. Find the Storage Model for this type.
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@type',ATTR.ATTR_TYPE_NAME)
into CHILD_ATTR
from dual;
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@owner',ATTR.ATTR_TYPE_OWNER)
into CHILD_ATTR
from dual;
STORAGE_MODEL := getStorageModel(ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER);
select appendChildXML(CHILD_ATTR,'/' || ATTR.ATTR_NAME,STORAGE_MODEL)
into CHILD_ATTR
from DUAL;
-- The cost of a non scalar Type is the number of attributes plus one for Type and one for the TYPEID.
select insertChildXML(CHILD_ATTR,'/' || ATTR.ATTR_NAME,'@columns',STORAGE_MODEL.extract(STORAGE_MODEL.GETROOTELEMENT() || '/@columns').getNumberVal() + 2)
into CHILD_ATTR
from dual;
exception
when no_data_found then
-- Attribute is based on a scalar type
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@type',ATTR.ATTR_TYPE_NAME)
into CHILD_ATTR
from dual;
select insertChildXML(CHILD_ATTR,'/' || CHILD_ATTR.getRootElement(),'@columns',1)
into CHILD_ATTR
from dual;
end;
end;
select appendChildXML(SQL_ATTRIBUTES,'/' || SQL_ATTRIBUTES.getRootElement(),CHILD_ATTR)
into SQL_ATTRIBUTES
from DUAL;
ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.getRootElement() || '/@columns').getNumberVal();
end loop;
select insertChildXML(SQL_ATTRIBUTES,'/' || SQL_ATTRIBUTES.getRootElement(),'@columns',ATTR_COUNT)
into SQL_ATTRIBUTES
from dual;
return SQL_ATTRIBUTES;
end;
function analyzeStorageModel(ATTR_NAME VARCHAR2, SUBTYPE VARCHAR2, SUBTYPE_OWNER VARCHAR2)
return XMLType
as
ROOT_NODE_NAME VARCHAR2(128);
TYPE_DEFINITION XMLTYPE;
STORAGE_MODEL XMLTYPE;
ATTR_COUNT NUMBER := 0;
begin
dbms_output.put_line('Processing Attribute : "' || ATTR_NAME || '". SQLType="' || SUBTYPE_OWNER || '.' || SUBTYPE || '".' );
TYPE_DEFINITION := makeElement(ATTR_NAME);
select insertChildXML(TYPE_DEFINITION,'/' || TYPE_DEFINITION.getRootElement(),'@type',SUBTYPE)
into TYPE_DEFINITION
from dual;
select insertChildXML(TYPE_DEFINITION,'/' || TYPE_DEFINITION.getRootElement(),'@owner',SUBTYPE_OWNER)
into TYPE_DEFINITION
from dual;
STORAGE_MODEL := getStorageModel(SUBTYPE, SUBTYPE_OWNER);
ATTR_COUNT := ATTR_COUNT + STORAGE_MODEL.extract('/' || STORAGE_MODEL.getRootElement() || '/@columns').getNumberVal();
select insertChildXML(TYPE_DEFINITION,'/' || TYPE_DEFINITION.getRootElement(),'@columns',ATTR_COUNT)
into TYPE_DEFINITION
from dual;
select appendChildXML
TYPE_DEFINITION,
'/' || TYPE_DEFINITION.getRootElement(),
STORAGE_MODEL
into TYPE_DEFINITION
from DUAL;
return TYPE_DEFINITION;
end;
function analyzeStorageModel(COMPLEX_TYPE VARCHAR2)
return XMLTYPE
as
SQLTYPE VARCHAR2(128);
SQLTYPE_OWNER VARCHAR2(32);
RESULT XMLTYPE;
begin
STORAGE_MODEL_LIST := STORAGE_MODEL_LIST_T();
select SQLTYPE, SQLTYPE_OWNER
into SQLTYPE, SQLTYPE_OWNER
from USER_XML_SCHEMAS,
xmlTable
xmlnamespaces
'http://www.w3.org/2001/XMLSchema' as "xsd",
'http://xmlns.oracle.com/xdb' as "xdb"
'/xsd:schema/xsd:complexType'
passing Schema
columns
COMPLEX_TYPE_NAME varchar2(4000) path '@name',
SQLTYPE varchar2(128) path '@xdb:SQLType',
SQLTYPE_OWNER varchar2(32) path '@xdb:SQLSchema'
where COMPLEX_TYPE_NAME = COMPLEX_TYPE;
-- dbms_output.put_line('Processing SQLType : "' || SQLTYPE_OWNER || '.' || SQLTYPE || '".' );
return analyzeStorageModel(COMPLEX_TYPE,SQLTYPE,SQLTYPE_OWNER);
exception
when no_data_found then
dbms_output.put_line('Unable to find SQLType mapping for complexType : "' || COMPLEX_TYPE || '".' );
return null;
end;
function analyzeSQLType(ATTR_NAME VARCHAR2, TARGET_TYPE_NAME VARCHAR2, TARGET_TYPE_OWNER VARCHAR2)
return XMLType
as
ROOT_NODE_NAME VARCHAR2(128);
ATTR_DETAIL XMLTYPE;
XPATH_EXPRESSION VARCHAR2(129);
CURSOR FIND_CHILD_ATTRS is
select ATTR_NAME, ATTR_TYPE_OWNER, ATTR_TYPE_NAME, INHERITED
from ALL_TYPE_ATTRS
where OWNER = TARGET_TYPE_OWNER
and TYPE_NAME = TARGET_TYPE_NAME
order by ATTR_NO;
CHILD_ATTR XMLTYPE;
ATTR_COUNT NUMBER := 0;
TEMP number;
COLLECTION_TYPE_NAME varchar2(256);
COLLECTION_TYPE_OWNER varchar2(256);
begin
-- dbms_output.put_line('Processing Attribute ' || ATTR_NAME || ' of ' || TARGET_TYPE_OWNER || '.' || TARGET_TYPE_NAME );
ATTR_DETAIL := makeElement(ATTR_NAME);
XPATH_EXPRESSION := '/' || ATTR_DETAIL.GETROOTELEMENT();
for ATTR in FIND_CHILD_ATTRS loop
begin
select ELEM_TYPE_NAME, ELEM_TYPE_OWNER
into COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER
from ALL_COLL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, COLLECTION_TYPE_NAME, COLLECTION_TYPE_OWNER );
ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT() || '/@columns').getNumberVal();
select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
into ATTR_DETAIL
from DUAL;
exception
when no_data_found then
begin
select 1
into TEMP
from ALL_TYPES
where TYPE_NAME = ATTR.ATTR_TYPE_NAME
and OWNER = ATTR.ATTR_TYPE_OWNER;
CHILD_ATTR := analyzeSQLType(ATTR.ATTR_NAME, ATTR.ATTR_TYPE_NAME, ATTR.ATTR_TYPE_OWNER );
ATTR_COUNT := ATTR_COUNT + CHILD_ATTR.extract('/' || CHILD_ATTR.GETROOTELEMENT() || '/@columns').getNumberVal();
select appendChildXML(ATTR_DETAIL,XPATH_EXPRESSION,CHILD_ATTR)
into ATTR_DETAIL
from DUAL;
exception
when no_data_found then
ATTR_COUNT := ATTR_COUNT + 1;
end;
end;
end loop;
select insertChildXML(ATTR_DETAIL,XPATH_EXPRESSION,'@columns',ATTR_COUNT)
into ATTR_DETAIL
from dual;
return ATTR_DETAIL;
end;
function analyzeComplexType(COMPLEX_TYPE VARCHAR2)
return XMLType
as
RESULT xmltype;
SQLTYPE varchar2(128);
SQLTYPE_OWNER varchar2(32);
begin
select SQLTYPE, SQLTYPE_OWNER
into SQLTYPE, SQLTYPE_OWNER
from USER_XML_SCHEMAS,
xmlTable
xmlnamespaces
'http://www.w3.org/2001/XMLSchema' as "xsd",
'http://xmlns.oracle.com/xdb' as "xdb"
'/xsd:schema/xsd:complexType'
passing Schema
columns
COMPLEX_TYPE_NAME varchar2(4000) path '@name',
SQLTYPE varchar2(128) path '@xdb:SQLType',
SQLTYPE_OWNER varchar2(32) path '@xdb:SQLSchema'
where COMPLEX_TYPE_NAME = COMPLEX_TYPE;
result := analyzeSQLType(COMPLEX_TYPE,SQLTYPE,SQLTYPE_OWNER);
select insertChildXML(RESULT,'/' || COMPLEX_TYPE,'@SQLType',SQLTYPE)
into result
from dual;
return result;
end;
function showSQLTypes(schemaFolder varchar2) return XMLType
is
xmlSchema XMLTYPE;
begin
select xmlElement
"TypeList",
xmlAgg
xmlElement
"Schema",
xmlElement
"ResourceName",
extractValue(res,'/Resource/DisplayName')
xmlElement
"complexTypes",
select xmlAgg
xmlElement
"complexType",
xmlElement
"name",
extractValue(value(XML),'/xsd:complexType/@name',NAMESPACES)
xmlElement
"SQLType",
extractValue(value(XML),'/xsd:complexType/@xdb:SQLType',NAMESPACES)
from table
xmlsequence
extract
xdburitype(p.path).getXML(),
'/xsd:schema/xsd:complexType',
NAMESPACES
) xml
-- order by extractValue(value(XML),'/xsd:complexType/@name',NAMESPACES)
).extract('/*')
into xmlSchema
from path_view p
where under_path(res,schemaFolder) = 1
order by extractValue(res,'/Resource/DisplayName');
return xmlSchema;
end;
procedure renameCollectionTable (XMLTABLE varchar2, XPATH varchar2, COLLECTION_TABLE_PREFIX varchar2)
as
SYSTEM_GENERATED_NAME varchar2(256);
COLLECTION_TABLE_NAME varchar2(256);
CLUSTERED_INDEX_NAME varchar2(256);
PARENT_INDEX_NAME varchar2(256);
RENAME_STATEMENT varchar2(4000);
begin
COLLECTION_TABLE_NAME := COLLECTION_TABLE_PREFIX || '_TABLE';
CLUSTERED_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_DATA';
PARENT_INDEX_NAME := COLLECTION_TABLE_PREFIX || '_LIST';
select TABLE_NAME
into SYSTEM_GENERATED_NAME
from ALL_NESTED_TABLES
where PARENT_TABLE_NAME = XMLTABLE
and PARENT_TABLE_COLUMN = XPATH
and OWNER = USER;
RENAME_STATEMENT := 'alter table ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' ||COLLECTION_TABLE_NAME || '"';
-- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
begin
select INDEX_NAME
into SYSTEM_GENERATED_NAME
from ALL_INDEXES
where TABLE_NAME = COLLECTION_TABLE_NAME
and INDEX_TYPE = 'IOT - TOP'
and OWNER = USER;
RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || CLUSTERED_INDEX_NAME || '"';
-- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
exception
when NO_DATA_FOUND then
null;
end;
begin
select INDEX_NAME
into SYSTEM_GENERATED_NAME
from ALL_IND_COLUMNS
where COLUMN_NAME = XPATH
and TABLE_NAME = XMLTABLE
and TABLE_OWNER = USER;
RENAME_STATEMENT := 'alter index ' || USER || '."' || SYSTEM_GENERATED_NAME || '" rename to "' || PARENT_INDEX_NAME || '"';
-- dbms_output.put_line(RENAME_STATEMENT);
execute immediate RENAME_STATEMENT;
exception
when NO_DATA_FOUND then
null;
end;
end;
function processNestedTable(currentLevel in out number, currentNode in out XMLType, query SYS_REFCURSOR)
return XMLType
is
thisLevel number;
thisNode xmlType;
result xmlType;
begin
thisLevel := currentLevel;
thisNode := currentNode;
fetch query into currentLevel, currentNode;
if (query%NOTFOUND) then
currentLevel := -1;
end if;
while (currentLevel >= thisLevel) loop
-- Next Node is a decendant of sibling of this Node.
if (currentLevel > thisLevel) then
-- Next Node is a decendant of this Node.
result := processNestedTable(currentLevel, currentNode, query);
select xmlElement
"Collection",
extract(thisNode,'/Collection/*'),
xmlElement
"NestedCollections",
result
into thisNode
from dual;
else
-- Next node is a sibling of this Node.
result := processNestedTable(currentLevel, currentNode, query);
select xmlconcat(thisNode,result) into thisNode from dual;
end if;
end loop;
-- Next Node is a sibling of some ancestor of this node.
return thisNode;
end;
function printNestedTables(XML_TABLE varchar2)
return XMLType
is
query SYS_REFCURSOR;
result XMLType;
rootLevel number := 0;
rootNode xmlType;
begin
open query for
select level, xmlElement
"Collection",
xmlElement
"CollectionId",
PARENT_TABLE_COLUMN
) as XML
from USER_NESTED_TABLES
connect by PRIOR TABLE_NAME = PARENT_TABLE_NAME
start with PARENT_TABLE_NAME = XML_TABLE;
fetch query into rootLevel, rootNode;
result := processNestedTable(rootLevel, rootNode, query);
select xmlElement
"NestedTableStructure",
result
into result
from dual;
return result;
end;
function generateSchemaFromTable(P_TABLE_NAME varchar2, P_OWNER varchar2 default USER)
return XMLTYPE
as
xmlSchema XMLTYPE;
begin
select xmlElement
"xsd:schema",
xmlAttributes
'http://www.w3.org/2001/XMLSchema' as "xmlns:xsd",
'http://xmlns.oracle.com/xdb' as "xmlns:xdb"
xmlElement
"xsd:element",
xmlAttributes
'ROWSET' as "name",
'rowset' as "type"
xmlElement
"xsd:complexType",
xmlAttributes
'rowset' as "name"
xmlElement
"xsd:sequence",
xmlElement
"xsd:element",
xmlAttributes
'ROW' as "name",
table_name || '_T' as "type",
'unbounded' as "maxOccurs"
xmlElement
"xsd:complexType",
xmlAttributes
table_name || '_T' as "name"
xmlElement
"xsd:sequence",
xmlAgg(ELEMENT order by INTERNAL_COLUMN_ID)
into xmlSchema
from (select TABLE_NAME, INTERNAL_COLUMN_ID,
case
when DATA_TYPE = 'VARCHAR2' then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLTYPE"
xmlElement
"xsd:simpleType",
xmlElement
"xsd:restriction",
xmlAttributes
'xsd:string' as "base"
xmlElement
"xsd:maxLength",
xmlAttributes
DATA_LENGTH as "value"
when DATA_TYPE = 'DATE' then
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
'xsd:dateTime' as "type",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLTYPE"
else
xmlElement
"xsd:element",
xmlattributes
column_name as "name",
'xsd:anySimpleType' as "type",
column_name as "xdb:SQLName",
DATA_TYPE as "xdb:SQLTYPE"
end ELEMENT
from all_tab_cols c
where c.TABLE_NAME = P_TABLE_NAME
and c.OWNER = P_OWNER
group by TABLE_NAME;
return xmlSchema;
end;
end XDB_ANALYZE_XMLSCHEMA_11100;
show errors
--You can use this as follows...
SQL> set long 100000
SQL> select xdb_analyze_xmlschema.analyzeStorageModel('ComponentA') from dual;
<ComponentA type="COMPONENTA_T" owner="XDBTEST" columns="50">
<RootType type="COMPONENTA_T" typeOwner="XDBTEST" columns="50">
<SQLAttributes columns="14">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<COMPONENTA_UNIQUENAME type="COMPONENTA_UNIQUENAME_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTA_UNIQUENAME_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTA_UNIQUENAME>
<COMPONENTA_DESCRIPTION type="COMPONENTA_DESCRIPTION_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTA_DESCRIPTION_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTA_DESCRIPTION>
</SQLAttributes>
<ExtendedType type="COMPONENTB_T" typeOwner="XDBTEST" columns="30">
<SQLAttributes columns="12">
<COMPONENTB_CONTROLNUMBER type="COMPONENTB_CONTROLNUMBER_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTB_CONTROLNUMBER_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTB_CONTROLNUMBER>
<COMPONENTB_COREFOLDER type="COMPONENTB_COREFOLDER_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTB_COREFOLDER_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTB_COREFOLDER>
</SQLAttributes>
<ExtendedType type="COMPONENTD_T" typeOwner="XDBTEST" columns="18">
<SQLAttributes columns="18">
<COMPONENTD_FINDINGTYPE type="COMPONENTD_FINDINGTYPE_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTD_FINDINGTYPE_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTD_FINDINGTYPE>
<COMPONENTD_PRIORITY type="COMPONENTD_PRIORITY_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTD_PRIORITY_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTD_PRIORITY>
<COMPONENTD_SUMMARY type="COMPONENTD_SUMMARY_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTD_SUMMARY_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTD_SUMMARY>
</SQLAttributes>
</ExtendedType>
</ExtendedType>
<ExtendedType type="COMPONENTC_T" typeOwner="XDBTEST" columns="6">
<SQLAttributes columns="6">
<COMPONENTC_CONTROLNUMBER type="COMPONENTC_CONTROLNUMBER_T" owner="XDBTEST" columns="6">
<RootType type="COMPONENTC_CONTROLNUMBER_T" typeOwner="XDBTEST" columns="4">
<SQLAttributes columns="4">
<SYS_XDBPD collectionType="RAW" collectionOwner="" columns="2"/>
<SYS_XDBBODY type="VARCHAR2" columns="1"/>
<DISPLAYNAME type="VARCHAR2" columns="1"/>
</SQLAttributes>
</RootType>
</COMPONENTC_CONTROLNUMBER>
</SQLAttributes>
</ExtendedType>
</RootType>
</ComponentA>THis will tell you that a table based xml element of the complexType 'componentA' will have approx 50 columns..
Maybe you are looking for
-
Unable to execute Web Service from SSRS Dataset
Hi, I am unable to access a Web Service to execute Dataset from MS SSRS. I have created a Dataset that refers to a WebService as a Query. The dataset and Query runs well in DEV environment. However, the following error message is displayed when exec
-
Where can I download the instant client ODBC driver for windows 7
I upgrade to windows 7 and my instant client connecting to oracle from ms Access stop working. Is there any documentation on how it works on windows 7. I use instant client and odbc cleint for xp. Thanks
-
Why is the Library 1 file?
I recently converted to Mac and imported my photo library into iPhoto. What I don't understand is why it seemed to turn the entire Library into one massive file over 26 gigs large. It seems to totally defeat the ability to do a Cover Flow or preview
-
Im trying to find ilife but apparently I have to pay for it?? I thought it was already installed.
-
Code for replacing 'get' and 'set' method
Hi, I was a struts programmer but now i am a jsf programmer :-) I was able to do the following with struts but no with jsf... The following code in struts allowed me to have no 'get' and 'set' method in the javabean for a property (for example, the p