To further my understanding of how this xmldb 'stuff' is working i did a few more tests do get more familiar with things.
I did all this using the following simple xsd schema file (you should save this as a plain text file on your os)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb">
<xs:element name="RICH" type="RICHTYPE" />
<xs:complexType name="RICHTYPE" >
<xs:sequence>
<xs:element name="attr1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Now we create a test user and give it some privs
create user xdb_schem identified by xdb_schem default tablespace sysaux;
grant dba to xdb_schem;
conn xdb_schem/xdb_schem
Now we register the xsd.
declare
l_xml xmltype;
begin
l_xml := xmltype(bfilename('TMP','rich.xsd'), nls_charset_id('UTF8'));
dbms_xmlschema.registerschema(SCHEMAURL =>'http://test.com/rich.xsd',schemaDoc => l_xml,options => dbms_xmlschema.REGISTER_BINARYXML,genTypes=> false,GENTABLES=>true);
end;
/
Now we load an xml doc into this 'schema table' - again note the importance of the xsi:noNamespaceSchemaLocation string - this has to be exactly correct.
DECLARE
retb BOOLEAN;
BEGIN
retb := DBMS_XDB.createResource('/sys/schemas/XDB_SCHEM/test.com/test7.xml',
'<?xml version="1.0"?>
<RICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://test.com/rich.xsd">
<attr1>test data</attr1></RICH>');
END;
/
OK - now we loaded the document - lets see how we access it. Lets first extract attr1 from the xml
SQL> SELECT extractValue(XDBURIType('/sys/schemas/XDB_SCHEM/test.com/test7.xml'.getXML(),'/RICH/attr1/text()') test from dual;
TEST
--------------------------------------------------------------------------------
test data
now lets find out what table name the register command created:
select tname from tab;
Now lets query that table directly
SQL> SELECT value(x).getclobval() test FROM RICH662_TAB x;
TEST
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
Thats - truncated by sqlplus - lets set long to fix that
SQL> set long 4000
SQL> /
TEST
--------------------------------------------------------------------------------
<?xml version="1.0"?>
<RICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
" xsi:noNamespaceSchemaLocation="http://
test.com/rich.xsd">
<attr1>test data</attr1>
</RICH>
Lets find out more about some of the attributes of the xml i loaded (not my attr1 but the internal properties of it)
SQL> select res from resource_view where any_path='/sys/schemas/XDB_SCHEM/test.com/test7.xml'
2 /
RES
--------------------------------------------------------------------------------
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">
<CreationDate>2014-03-28T16:51:07.205151</CreationDate>
<ModificationDate>2014-03-28T16:51:07.205151</ModificationDate>
<DisplayName>test7.xml</DisplayName>
<Language>en-US</Language>
<CharacterSet>UTF-8</CharacterSet>
<ContentType>text/xml</ContentType>
<RefCount>1</RefCount>
</Resource>
Now we extract the same thing from PATH_VIEW
SQL> select res from path_view where path='/sys/schemas/XDB_SCHEM/test.com/test7.xml';
RES
--------------------------------------------------------------------------------
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">
<CreationDate>2014-03-28T16:51:07.205151</CreationDate>
<ModificationDate>2014-03-28T16:51:07.205151</ModificationDate>
<DisplayName>test7.xml</DisplayName>
<Language>en-US</Language>
<CharacterSet>UTF-8</CharacterSet>
<ContentType>text/xml</ContentType>
<RefCount>1</RefCount>
</Resource>
PATH_VIEW and RESOURCE_VIEW seem to be 2 ways t access the same resource - it seems there can be more than one path to the same documen. One of the views has multiple rows to the same object (if there are multiple ways) - the other just has one.
Lets extract via querying resource_view.
SQL> select p.res.extract('/Resource/Contents') from resource_view p where any_path='/sys/schemas/XDB_SCHEM/test.com/test7.xml'
2 /
P.RES.EXTRACT('/RESOURCE/CONTENTS')
--------------------------------------------------------------------------------
<Contents xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd"><RICH xmlns="" xml
ns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation
="http://test.com/rich.xsd"><attr1>test data</attr1></RICH></Contents>
/Resource/Contents seems to extract different information to just /Resource/Cntents/*
SQL> select p.res.extract('/Resource/Contents/*') from resource_view p where any_path='/sys/schemas/XDB_SCHEM/test.com/test7.xml'
2 /
P.RES.EXTRACT('/RESOURCE/CONTENTS/*')
--------------------------------------------------------------------------------
<RICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchem
aLocation="http://test.com/rich.xsd"><attr1>test data</attr1></RICH>
We can index atttibutes within the xml
SQL> create unique index test_idx on RICH662_TAB (extractvalue(OBJECT_VALUE,'/RICH/attr1'));
Index created.
The following code then throws a unique index constraint violation.
DECLARE
retb BOOLEAN;
BEGIN
retb := DBMS_XDB.createResource('/sys/schemas/XDB_SCHEM/test.com/test8.xml',
'<?xml version="1.0"?>
<RICH xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://test.com/rich.xsd">
<attr1>test data</attr1></RICH>');
END;
/
So xmldb is making more sense but its still an incredibly wide subject.....
seicauspecza Kim Chandler https://wakelet.com/wake/j483H9yS73tdVpvmK16Fm
ReplyDeletedielowloudons
congsobobsbo Jessica Wright The Bat!
ReplyDeleteFL Studio
Express VPN
workpulinthumb
geoobsuppta_Manchester Carol Collins click
ReplyDeleteLink
tadartestda