He hecho algunas tablas de prueba.
Este es el aspecto que tienen en el sde.table_registry
tabla del sistema:
+-----------------+------------------------+----------+---------------+--------------+---------------+--------------------+-----------------+-------------+----------------------------+
| REGISTRATION_ID | TABLE_NAME | OWNER | ROWID_COLUMN | DESCRIPTION | OBJECT_FLAGS | REGISTRATION_DATE | CONFIG_KEYWORD | MINIMUM_ID | IMV_VIEW_NAME |
+-----------------+------------------------+----------+---------------+--------------+---------------+--------------------+-----------------+-------------+----------------------------+
| 107101 | A_TEST_FC_NOREG | ENG | OBJECTID | | 16391 | 1520010751 | DEFAULTS | 1 | |
| 107099 | A_TEST_FC_REGBASE | ENG | OBJECTID | | 114703 | 1520010643 | DEFAULTS | 1 | A_TEST_FC_REGBASE_EVW |
| 107100 | A_TEST_FC_REGNOBASE | ENG | OBJECTID | | 16399 | 1520010715 | DEFAULTS | 1 | A_TEST_FC_REGNOBASE_EVW |
| 107092 | A_TEST_TABLE_NOREG | ENG | OBJECTID | | 3 | 1520010203 | DEFAULTS | 1 | |
| 107056 | A_TEST_TABLE_REGBASE | ENG | OBJECTID | | 98315 | 1520007082 | DEFAULTS | 1 | A_TEST_TABLE_REGBASE_EVW |
| 107057 | A_TEST_TABLE_REGNOBASE | ENG | OBJECTID | | 11 | 1520007121 | DEFAULTS | 1 | A_TEST_TABLE_REGNOBASE_EVW |
+-----------------+------------------------+----------+---------------+--------------+---------------+--------------------+-----------------+-------------+----------------------------+
Puedo consultar el gdb_items
y sde.table_registry
tablas para obtener la información que necesito:
select
cast(rownum as number(38,0)) as rownum_,
iu.name,
iu.versioned,
cast(tr.object_flags as number(38,0)) as object_flags,
case tr.object_flags
when 114703 then 'REGISTERED WITH BASE'
when 98315 then 'REGISTERED WITH BASE'
when 11 then 'NOT REGISTERED WITH BASE'
when 16399 then 'NOT REGISTERED WITH BASE'
end as versioning_type
from
(
select --non spatial tables
i.name as name,
extractvalue(definition_xml.column_value, 'Versioned') as versioned
from
sde.gdb_items_vw i
cross join
table(xmlsequence(xmltype(i.definition).extract('/DETableInfo/Versioned'))) definition_xml
union all
select --feature classes
i.name as name,
extractvalue(definition_xml.column_value, 'Versioned') as versioned
from
sde.gdb_items_vw i
cross join
table(xmlsequence(xmltype(i.definition).extract('/DEFeatureClassInfo/Versioned'))) definition_xml
) iu
left join
sde.table_registry tr
on iu.name = tr.owner || '.' || tr.table_name
where
iu.name like 'ENG.%'
La respuesta:
+---------------------------------+-----------+---------------+--------------------------+
| TABLE_NAME | VERSIONED | OBJECT_FLAGS | VERSIONING_TYPE |
+---------------------------------+-----------+---------------+--------------------------+
| INFRASTR.A_TEST_FC_NOREG | false | 16391 | |
| INFRASTR.A_TEST_FC_REGBASE | true | 114703 | REGISTERED WITH BASE |
| INFRASTR.A_TEST_FC_REGNOBASE | true | 16399 | NOT REGISTERED WITH BASE |
| INFRASTR.A_TEST_TABLE_NOREG | false | 3 | |
| INFRASTR.A_TEST_TABLE_REGBASE | true | 98315 | REGISTERED WITH BASE |
| INFRASTR.A_TEST_TABLE_REGNOBASE | true | 11 | NOT REGISTERED WITH BASE |
+---------------------------------+-----------+---------------+--------------------------+
Como puede ver, el conjunto de resultados tiene un versioning_type
que contiene la información que necesito:
null
(no versionado)
- REGISTRADO EN LA BASE
- NO ESTÁ REGISTRADO EN LA BASE
La columna object_flags:
No pude entender cómo el tipo de versión (con o sin base) se almacena en la base de datos. Mi mejor conjetura/resolución fue interpretar los valores en el object_flags
columna:
when 114703 then 'REGISTERED WITH BASE'
when 98315 then 'REGISTERED WITH BASE'
when 11 then 'NOT REGISTERED WITH BASE'
when 16399 then 'NOT REGISTERED WITH BASE'
Sin embargo, estas interpretaciones son sólo conjeturas. No tengo ni idea de lo que el object_flags
(no he podido encontrar nada en los documentos).
- Es posible que haya interpretado mal el significado de los valores.
- También es posible que haya más valores posibles que pertenezcan a diferentes tipos de objetos que no he tenido en cuenta.
- Más información aquí:
Error:
La consulta se ejecuta sin problemas en SQL Developer. Sin embargo, da error cuando se ejecuta en ArcMap. Mi mejor suposición es que la causa es algún tipo de error en los datos XML de las tablas de mi sistema de geodatabase (que ArcMap no puede manejar, pero SQL Developer sí).
Error reading OID from table. Reading rows has been stopped. Check that the datasource is valid.
Underlying DBMS error[ORA-31011: XML parsing failed
ORA-1923:error occurred in XML processing at lines 1
LPX-00245: extra data after end of document
ORA-06512: at "SYS.XMLTYPE", line 272
ORA-06512: at line 1]
The operation is not supported by this implementation.
Me gustaría saber si alguien más tiene este problema, o si es sólo mi base de datos geográfica la que causa el error.
Rutas XML:
El acceso a las rutas XML puede ser complicado. Tengo una respuesta aquí que podría ser útil para otros: Lista de todos los campos y sus dominios, para cada tabla usando SQL