Maximum number of multicast groups on a given port?
Using linux (Ubuntu 8.4 with jdk 1.6.10 and 1.5.12) if I try to join more than 20 groups to a MulticastSocket open on a given port I get the following exception:
FINE 14:45:45.883:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.0.1.118
FINE 14:45:45.883:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.12.1.113
FINE 14:45:45.884:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.20.0.43
FINE 14:45:45.884:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.0.0.42
FINE 14:45:45.884:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.115.246.43
FINE 14:45:45.885:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.125.246.43
FINE 14:45:45.885:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.125.246.75
FINE 14:45:45.885:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.12.1.120
FINE 14:45:45.885:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.215.246.45
FINE 14:45:45.886:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.12.0.43
FINE 14:45:45.886:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.125.246.20
FINE 14:45:45.886:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.1.1.120
FINE 14:45:45.887:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.12.1.118
FINE 14:45:45.887:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.115.246.42
FINE 14:45:45.887:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.115.246.20
FINE 14:45:45.888:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /233.215.246.47
FINE 14:45:45.888:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.12.1.112
FINE 14:45:45.888:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.1.0.43
FINE 14:45:45.888:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.1.1.118
FINE 14:45:45.889:net.c4i.socketcomms.MulticastSocketListener.bind 10: Adding Mcast Group: /226.1.0.75
WARNING 14:45:45.889:net.c4i.socketcomms.MulticastSocketListener.bind 10: Could not join multicast group /233.15.246.43
java.net.SocketException: No buffer space available
java.net.PlainDatagramSocketImpl.join(Native Method)
java.net.PlainDatagramSocketImpl.join(PlainDatagramSocketImpl.java:172)
java.net.MulticastSocket.joinGroup(MulticastSocket.java:276)
net.c4i.socketcomms.MulticastSocketListener.bind(MulticastSocketListener.java:143)
net.c4i.socketcomms.MulticastProtocolManager.createListener(MulticastProtocolManager.java:154)
net.c4i.socketcomms.MulticastProtocolManager.<init>(MulticastProtocolManager.java:100)
net.c4i.socketcomms.MulticastProtocolManager.getInstance(MulticastProtocolManager.java:67)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:585)
net.c4i.socketcomms.SocketManager.createProtocol(SocketManager.java:245)
net.c4i.socketcomms.SocketManager.<init>(SocketManager.java:157)
net.c4i.socketcomms.SocketManager.getInstance(SocketManager.java:116)
net.c4i.infrastructure.C4IAdapterManager.<init>(C4IAdapterManager.java:172)
net.c4i.infrastructure.C4IAdapterManager.getInstance(C4IAdapterManager.java:263)
net.c4i.infrastructure.C4IAdapterManager.launch(C4IAdapterManager.java:492)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:585)
Is there any known way to workaround this issue? I've searched but have not seen any similar issues. I also cannot reduce the number of multicast groups in use as I have no control of that.
Noah
Is there any known way to workaround this issue?It may be a tunable kernel parameter, and you may be able to tweak it somehow, but that would be a Linux question, not a Java question.
I also cannot reduce the number of multicast groups in use as I have no control of that.You may not have any choice. If the kernel will only give you 20, bad luck.
Similar Messages
-
Hello,
I am thinking about getting the business package with manager for group calls. I have only seen mention of 7+ people in a group. What is the maximum number of people allowed in a group? I need to arrange a group call of 20 people.
Thanks!Hi, nareng, and welcome to the Community,
Screen sharing is a video feed, so like video calls, you may share your screen with a total of nine (9) others at the same time, making the maximum number of people ten (10) including yourself.
Regards,
Elaine
Was your question answered? Please click on the Accept as a Solution link so everyone can quickly find what works! Like a post or want to say, "Thank You" - ?? Click on the Kudos button!
Trustworthy information: Brian Krebs: 3 Basic Rules for Online Safety and Consumer Reports: Guide to Internet Security Online Safety Tip: Change your passwords often! -
We are using 3560 and 3750 PoE switches in a network which
interconnects a lot of clients (WIN XP professional) using a proprietary VoIP software
solution.
This Software uses Multicast groups for communication and now we are
running into the limitation of 1000 multicast groups supported by these
switches.
Does anybody know if there is any possibility to extend the maximum
number of Multicast groups on the 3560 and 3750 Cisco switches? IOS
update? Memory extension?
Thanks in advanceHi,
Currently, we support only 1024 multicast routes+IGMP groups.
To extend the maximum number, we need code changes.
At the moment, no code changes planned.
Tom. -
SNMP query for multicast group count
I want to get the total number of multicast groups on a switch. Is there an oid that will give me the info (ie. the number that's given by "show ip igmp snooping groups count")? If there is no oid, is there a way query the groups (show ip igmp snooping groups)? I'm thinking with the 2nd option I might be able to count the number of entries returned by an snmpwalk or something and turn that into a number.
Right now i'm logging into the switch with a script and running the command but that might be a problem with all those logins (only every 5 minutes though) so I'd like to do this via SNMP if possible.
Any ideas?
ThanksWorks just fine!!!
Thanks!
LA$$E
Hi,
Well, at the very least, you can create a formula
column in your break group using a combination of the
same where clause as your original query and the
break values for the group so that you are getting
the correct records. If you have it in the break
group, then it will execute for each record in that
group.
Hope that helps,
Toby -
Maximum number of concurrent users
What is the maximum number of concurrent users any single given Airport can handle? I believe it is ten...
Thank you!If the AirPort is configured to create a wireless network, the AirPort Express can handle up to 10 users. The AirPort Extreme and Time Capsule will handle up to 50.
-
Can the maximum number of Logical Processors allowed in a Processor Group be increased by Bcdedit command or registry key to a number greater than the default (64) to allow non-group-aware applications to seamlessly scale via multithreading across more cores
MSDN documents methods to reduce the max number of LP's in a Processor Group to 1 or any power of 2 less than 64 in order to increase the number of Processor Groups. But there is no discussion of how to increase the maximum number of Logical Processors
allowed in a Processor Group to a number greater than the default (64), e.g. to 128 or 256.
Since a non-group-aware application/process can only run on 1 Processor Group, increasing this limit is needed to allow non-group-aware multithreaded applications to scale seamlessly for parallel computation across more than 64 cores simultaneously on systems
with more than 64 cores (for example, a quad-socket Intel Xeon system with 24 cores per socket, including true and hyper cores). If that limit can be set via registry key or command line, or if there is another way to force all the cores on
all 4 sockets (4 NUMA nodes in this case) to join in 1 Processor Group, then non-group-aware applications will not need to be rewritten using group-aware thread-affinity APIs.Hi John,
Are you trying to specify a static NUMA-node-to-group assignment, rather than letting Windows dynamically assign NUMA nodes to groups at boot time? If yes, You can refer the
following related KB:
How to manually configure K-Group assignment on multiprocessor machines
http://support.microsoft.com/kb/2506384
Systems with fewer than 64 logical processors always have a single group, Group 0. On systems with 64 or fewer processors, existing applications will operate correctly without
modification. Applications that do not call any functions that use processor affinity masks or processor numbers will operate correctly on all systems, regardless of the number of processors. To operate correctly on systems with more than 64 logical processors,
the following kinds of applications might require modification:
•Applications that manage, maintain, or display per-processor information for the entire system must be modified to support more than 64 logical processors. An example of
such an application is Windows Task Manager, which displays the workload of each processor in the system.
•Applications for which performance is critical and that can scale efficiently beyond 64 logical processors must be modified to run on such systems. For example, database
applications might benefit from modifications.
•If an application uses a DLL that has per-processor data structures, and the DLL has not been modified to support more than 64 logical processors, all threads in the application
that call functions exported by the DLL must be assigned to the same group.
By design, a non-NUMA computer is considered to have one NUMA node. Because NUMA nodes cannot span groups, the system creates a node for each group after you restart the computer.
The related KB:
Processor Groups
http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx
More information:
Uneven Windows Processor Groups
http://blogs.msdn.com/b/saponsqlserver/archive/2011/10/08/uneven-windows-processor-groups.aspx
Boot Parameters to Test Drivers for Multiple Processor Group Support
http://msdn.microsoft.com/en-us/library/windows/hardware/ff542298(v=vs.85).aspx
I’m glad to be of help to you!
We
are trying to better understand customer views on social support experience, so your participation in this
interview project would be greatly appreciated if you have time.
Thanks for helping make community forums a great place. -
Maximum number os users in a group
What is the maximum number of users that can be in a group on OS X server 10.4? IN 10.3 I think it was 10,000
I ask, because I am integrating with an AD server, where the group we are trying to manage preferences on is 28,000>As far as i know there is no problem for the os.
-
What is the maximum number of contacts in a group that will send in an iCloud email? I'm sending from MacBookPro.
Limits on Sending Messages
iCloud has several safeguards to ensure that only iCloud members can send messages using the iCloud outgoing mail server. Among these safeguards are reasonable limitations on:
The total number of messages you can send each day (200 messages)
The number of recipients to whom you can send each day (1000 recipients)
The maximum number of recipients per message (100 recipients)
The size of incoming and outgoing messages (20 MB)
You can send 10 emails to 100 people each in a day, for example, or 198 messages with, on average, 5 recipients (and five ninety-ninths). -
Xs:group refs and "ORA-30936: Maximum number (1) of XML nodes exceeded'
We registered a subset of the IBM DITA schemas in Oracle XDB. These schemas contain a lot of xs:group definitions where references to these groups contain "minOccurs" and "maxOccurs" atttributes, for instance:
<xs:group name="category">
<xs:sequence>
<xs:element ref="category"/>
</xs:sequence>
</xs:group>
<xs:complexType name="metadata.class">
<xs:sequence>
<xs:group ref="audience" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="category" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="keywords" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="prodinfo" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="othermeta" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="mapkeyref" type="xs:string"/>
<xs:attributeGroup ref="global-atts"/>
<xs:attribute ref="class" default="- topic/metadata "/>
</xs:complexType>
When we create an instance document that contains more than one "category" element under the element "metadata" element, like:
<metadata>
<audience type="purchaser" othertype="" job="using" otherjob="" experiencelevel="general"/>
<category/>
<category/>
</metadata>
we get the error: ORA-30936: Maximum number (1) of 'category' XML node elements exceeded
This error is not consistent with the schema and XML parsers like Xerces and the Oracle "XDK parser" think the instance is fine.
When we skip the reference to the group and reference the element definition "category" directly the problem is gone:
<xs:complexType name="metadata.class">
<xs:sequence>
<xs:group ref="audience" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="category" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="keywords" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="prodinfo" minOccurs="0" maxOccurs="unbounded"/>
<xs:group ref="othermeta" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="mapkeyref" type="xs:string"/>
<xs:attributeGroup ref="global-atts"/>
<xs:attribute ref="class" default="- topic/metadata "/>
</xs:complexType>
In this case the problems for the other group references like "audience" remain.
It looks like Oracle XDB doesn't honor the cardinality attributes "minOccurs" and "maxOccurs" on xs:group elements that are references. Does anyone experienced similar problems?
Thanks,
MaartenThis sounds like bug 5204107. You'll need to open a tar with Oracle Support if you need a fix for this..
It happens when a group is used once without a maxOccurs and then later with a maxOccurs.
The workaround is 'in-line' the group before registering the XML Schema. This can be done as follows (assuming the group definition and reference are in the same XML Schema)..
procedure expandGroup(xmlschema in out xmltype, groupName varchar2,xsdDirectory varchar2)
is
xsdSchemaPath varchar2(512);
groupModel xmltype;
sequenceModel xmlType := xmlType('<xsd:sequence ' || xdb_namespaces.XMLSCHEMA_PREFIX_XSD || '><xsd:sequence/></xsd:sequence>');
maxOccursValue binary_integer;
begin
-- FInd the Group Definition
if xmlSchema.existsNode('/xsd:schema//xsd:group[@ref="' || groupName || '"]',NAMESPACES) = 1 then
if xmlSchema.existsNode('/xsd:schema/xsd:group[@name="' || groupName || '"]',NAMESPACES) = 1 then
select extract
xmlSchema,
'/xsd:schema/xsd:group[@name="' || groupName || '"]',
NAMESPACES
into groupModel
from dual;
else
dbms_output.put_line('xsdDirectory = ' || xsdDirectory);
select PATH,
extract
CONTENTS,
'/xsd:schema/xsd:group[@name="' || groupName || '"]',
NAMESPACES
into xsdSchemaPath, groupModel
from (
select PATH, xdburitype(path).getXML() CONTENTS
from PATH_VIEW
where under_path(res,xsdDirectory) = 1
where existsNode
CONTENTS,
'/xsd:schema/xsd:group[@name="' || groupName || '"]',
NAMESPACES
) = 1;
dbms_output.put_line('Resolved ' || groupModel.extract('/xsd:group/@name',NAMESPACES).getStringVal() || ' in Schema ' || xsdSchemaPath);
end if;
if groupModel.existsNode('/xsd:group/xsd:annotation',NAMESPACES) = 1 then
select deleteXML
groupModel,
'/xsd:group/xsd:annotation',
NAMESPACES
into groupModel
from dual;
end if;
-- create a sequence that can be placed in-line in the XML Schema to replace the <group ref=""/>
groupModel := groupModel.extract('/xsd:group/*',NAMESPACES);
select updateXML
sequenceModel,
'/xsd:sequence/xsd:sequence',
groupModel,
NAMESPACES
into sequenceModel
from dual;
if xmlSchema.existsNode('/xsd:schema//xsd:group[@ref="' || groupName || '" and not(@maxOccurs)]',NAMESPACES) = 1 then
select updateXML
xmlSchema,
'/xsd:schema//xsd:group[@ref="' || groupName || '" and not(@maxOccurs)]',
sequenceModel,
NAMESPACES
into xmlSchema
from dual;
end if;
select insertChildXML
sequenceModel,
'/xsd:sequence',
'@maxOccurs',
'unbounded',
NAMESPACES
into sequenceModel
from dual;
if xmlSchema.existsNode('/xsd:schema//xsd:group[@ref="' || groupName || '" and @maxOccurs="unbounded"]',NAMESPACES) = 1 then
select updateXML
xmlSchema,
'/xsd:schema//xsd:group[@ref="' || groupName || '" and @maxOccurs="unbounded"]',
sequenceModel,
NAMESPACES
into xmlSchema
from dual;
end if;
while xmlschema.existsNode('/xsd:schema//xsd:group[@ref="' || groupName || '"]',NAMESPACES) = 1 loop
maxOccursValue := xmlSchema.extract('/xsd:schema//xsd:group[@ref="' || groupName || '"]/@maxOccurs').getNumberVal();
select updateXML
sequenceModel,
'/xsd:sequence/@maxOccurs',
maxOccursValue,
NAMESPACES
into sequenceModel
from dual;
select updateXML
xmlSchema,
'/xsd:schema//xsd:group[@ref="' || groupName || '" and @maxOccurs="' || maxOccursValue || '"]',
sequenceModel,
NAMESPACES
into xmlSchema
from dual;
end loop;
end if;
end;
-- -
Maximum Number of users in a "User Group" (SU01/Logon data/User Group)
All,
My security person recently approached me with a problem she has regarding user groups. She wants to assign user groups so that way division leaders/designees can handle password resets within their own area. To do this she has started using the "User Group" field in SU01/Logon data.
She's told me the maximum number of users she can add to a "User Group" is 30. Can anyone else confirm this? Is there a setting (profile or otherwise) to increase this limit? Any DSN or outside reading that anyone can refer me to on this matter?
Many thanks....> There is a little green clip board icon on the bottom right corner...
I only get that after hitting the Authorization data button in SU10 and the the Multiple selection button next to the user. Ow, and it's not green, the upload from textfile button is
By the way, hitting F4 on a user input field in SU10 will also provide you with the possibility to select more than 30 users in one go.
Edited by: Jurjen Heeck on Dec 29, 2009 12:08 PM -
What is the maximum number of addresses that can be sent in a group mailing
Can anyone tell me the maximum number of addresses that can be sent as a group mailing?
Thanks."Does Mail complain when you try to send a message to several recipients at once? You might be surprised to know that Mail actually has no limit on the number of recipients to whom you can send a message! So, what's going on here?
Chances are it's your Internet Service Provider (ISP) that's preventing your message from being sent. Your ISP might do this, for example, to deter folks who send unsolicited bulk commercial email (such as "spam" or "Junk mail") to a large number of addresses.
If this happens to you, contact your ISP and ask them if they enforce a limit on how many recipients each email message can have. If there is a limit, you can either send your message to fewer people, or divide your recipient list into multiple sets and send the same message in batches (each time to a different set of recipients). "
Brilliant! Thanks. -
Maximum number of people in a Group VideoConferenc...
Hi,
We would like to know what is the maximum number of people can skype support in a videoconference call trough Mac ?
Thanks,Hi, rjuiz, and welcome to the Community,
I am seeing the maximum number of particpants in a group video call is ten (10) ...
https://support.skype.com/en/faq/FA10614/how-do-i-make-a-group-video-call-in-skype-for-windows-deskt...
https://support.skype.com/en/faq/FA10801/making-a-group-video-call-mac
... please kindly post back providing the link to where you found 25 participants in a group video call is indicated? This FAQ explains that group audio calls can accommodate up to 25 participants:
https://support.skype.com/en/faq/FA34/can-i-have-more-than-one-pstn-mobile-or-landline-phone-number-...
https://support.skype.com/en/faq/FA10809/making-a-group-call-mac?
https://support.skype.com/en/faq/FA2831/how-do-i-make-a-group-call-in-skype-for-windows-desktop
Thanks!
Kind regards,
Elaine
Was your question answered? Please click on the Accept as a Solution link so everyone can quickly find what works! Like a post or want to say, "Thank You" - ?? Click on the Kudos button!
Trustworthy information: Brian Krebs: 3 Basic Rules for Online Safety and Consumer Reports: Guide to Internet Security Online Safety Tip: Change your passwords often! -
Hi All,
What is the maximum number of Call Types, Skill Groups and Campaigns created in ICM 8.0.1 and 8.0.3?
In which the above requested information will be available??Oh I see. So I guess what you are saying is that is
Director's way of compressing vector numbers. Also, as to what you
were saying about the number 3000 is sure not the limit for vector
units, I think I was just jumping the gun considering that I only
glanced at the script error, and then clicked on the debug button
to see where the error happened. Then once I looked at the varibles
in the varible window, I saw these weird numbers with the e3 at the
end of them, and I just thought that it could not add the vectors
together with the e3 at the end of each vector unit. However, to
make a long story short, I detached the script and reattached it
which did no create the error again, and I learned that Director
can add vector units together that have an e3 at the end of each
vector unit. So thanks for clarifying what the e3 means. -
Hi,
I have configure stream analytics to read messages from eventhub and I am getting this error message:Correlation ID:
e185534f-9e82-4efc-8050-5294796fb275
Error:
Exceeded the maximum number of allowed receivers per partition in a consumer group which is 5 TrackingId:4569eca8-cb70-4c50-96cd-5868bfbc3e37_B45,TimeStamp:1/7/2015 11:40:37 PM TrackingId:f408292e-0dab-40cc-8ae9-2730313c3241_B45, Reference:8fca3c6a-b0d1-41cf-a835-f7c74a2ea8c3,
Timestamp:1/7/2015 11:40:37 PM
Message:
Exceeded the maximum number of allowed receivers per partition in a consumer group which is 5
Message Time:
2015-01-07 23:40:38Z
Microsoft.Resources/EventNameV2:
sharedNode92F920DE-290E-4B4C-861A-F85A4EC01D82.naveenevents_0_c76f7247_25b7_4ca6_a3b6_c7bf192ba44a#0.output
Microsoft.Resources/Operation:
Receive Events
Microsoft.Resources/ResourceUri:
/subscriptions/f122f431-ddc7-4e21-ae3a-f6a9e1273bcb/resourceGroups/StreamAnalytics-Default-Central-US/providers/Microsoft.StreamAnalytics/streamingjobs/Naveenstreamanalytics
Type:
EventHubInputAdapterEventHubFailure
Any help on the same is appreciated.
Thanks
NaveenHi Naveen,
Thanks for reporting this issue. We are taking a look at this issue.
Questions:
Do you have multiple readers reading from this EventHub, or have you setup multiple Stream Analystics jobs reading from this event hub. You are hitting a limitation of how many readers are allowed per EH consumer group.
What is the serialization format of your input (JSON/CSV)? Could you please verify the serialization format setup in the streaming job and if it matches your data?
Thanks
Zafar Abbas -
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)
Maybe you are looking for
-
Remove HTML tags from a string
I have a string that contains a couple of HTML or XHTML tag, for example lv_my_string = '<p style="something">Hello <strong>World</strong>!</p>'. For a special use case, I want to remove all HTML from that string and process only the plain text lv_my
-
Purchase or wait ??
I have been patiently waiting for ilife 08 as I really want to start to get my bands website looking more professionally ( I only have ilife 05 and have been using the foc package NVU ) and then I discovered I also need OS 10.4 onwards ( I still have
-
Using onFocus method with embedded html
Hi, I have embedded html in a servlet. I am using a text field to call the onFocus method with the following code: out.println("<input type='text' name='name' value='0' onFocus='if(this.value=='0')this.value=';'>"); If I was using straight html with
-
Pandora starts playing randomly while I am on the net or while watching a movie. How do I fix this problem? Thanks.
-
How can i upgrade my powerpc g5 from OS X 10.4 to 10.5?
I have an iMac PowerPC G5 (3.0) with a processor of 1.9 GHz, 512 MB of memory, PowerMac 12,1, I´m currentrly using OS X 10.4.11. Does anyone knows if this kind of Mac can be upgrate it ? what should I do?