A loaded schema can be dropped if:

  • No other schema depends on it
  • No data using the schema is loaded

I think you may force unloading schemas even if there is data loaded but I haven't tried that.

The code to drop a schema is:

dbms_xmlschema.deleteSchema( schemaURL => 'schema_url');

You can use it if e.g. schema is updated or we don't need it anymore.

The full code in Python is:

DELETE_STR = """
begin
    dbms_xmlschema.deleteSchema( schemaURL => '%s');
end;
"""

SCHEMA_ORDER = [
    'xocs-ani512-xml.xsd',
    'xocs-ani512-ani-ce.xsd',
    'xocs-ani512-ce.xsd',
    'xocs-ani512-cto.xsd',
    'xocs-ani512-ait.xsd',
    'xocs-ani512.xsd',
]

# ...

# Try to delete the XSD from the DB if necessary
#
for xsd_file in reversed(SCHEMA_ORDER):
    xsd_path = os.path.join('/my/dir', xsd_file)

    try:
        print "Remove [%s] schema" % xsd_file
        cursor.execute(DELETE_STR % xsd_file)
    except Exception as e:
        print "Fail to remove [%s]" % xsd_path, e.message

Several notes:

  • The order of removal is, of course, the reversed order of insertion. This way, complex XSDs are removed firse leaving basic dependencies at the end.
  • I'm using PL/SQL because it's easier if all scripts are written in the same way. I could probably use simple SQL
  • I'm over-engineering the code a bit because I don't want it to fail hard if a dependency was not loaded (it's development code so e.g. the list of schemas can fail to load in the first place)

Note: Please refer to the previous article to see e.g. connection setup via cx_oracle

HTH,