错误的XML数据库列类型的OraDbType代码CHAR

错误的XML数据库列类型的OraDbType代码CHAR

问题描述:

我从Oracle数据库检索到的XML有一个奇怪的问题。我使用OraDB11g,我的问题描述如下:错误的XML数据库列类型的OraDbType代码CHAR

当我使用CHAR类型的列创建表并从查询中获取XML时,返回一个带有表行的游标,我得到了正确的OraDbType代码104 :

创建表:

create table AA_Table1 
(
ID number(2,0) not null, 
**ColumnA char(1) null, 
ColumnB char(1) default 'S' not null,** 
constraint PK_AA_Table1 
primary key (ID) 
) 
tablespace "X" 
storage 
(
... 
) 
compress for all operations 
; 

和返回的XML:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema id="o_ListaTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> 
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
<xs:complexType> 
<xs:choice minOccurs="0" maxOccurs="unbounded"> 
<xs:element name="o_List" msprop:REFCursorName="REFCursor"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="ID" msprop:OraDbType="111" type="xs:short" minOccurs="0" /> 
**<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" />** 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:choice> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

但是...当我插入在桌子上另一列,改变它,后那,我坐上返回的XML为新添加的列错误OraDBType代码...

添加新列: ALTER TABLE AA_Table1添加ColumnC CHAR(1)默认的“S”不为空;

返回的XML是:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema id="o_ListaTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> 
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
<xs:complexType> 
<xs:choice minOccurs="0" maxOccurs="unbounded"> 
<xs:element name="o_List" msprop:REFCursorName="REFCursor"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="ID" msprop:OraDbType="111" type="xs:short" minOccurs="0" /> 
<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
**<xs:element name="COLUMNC" msprop:OraDbType="126" type="xs:string" minOccurs="0" />** 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:choice> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

我的问题是:这是为什么OraDbType代码有什么不同?检查相同的列类型CHAR(1)NOT NULL DEFAULT'S'创建表创建和OraDbType是好的,所以我认为这可能是一个bug ...

因此,我不能做一个正确的XML解析器来转换其他类型的CHAR(1)列,我希望在这种情况下将其转换为.Net布尔类型。我的解析器现在忽略了OraDbType代码126,因为这也是用于nvarchar2的代码,并且我不会将nvarchar2转换为bool。

我该如何解决这个问题?

一些额外的测试,我做: 刚才还插入新列可为空/不可为空,并用默认值:

**alter table AA_Table1 add ColumnD char(1); 
alter table AA_Table1 add ColumnE char(1) not null; 
alter table AA_Table1 add ColumnF char(1) default 'S';** 

而返回的XML是:

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema id="o_ListTable" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:msprop="urn:schemas-microsoft-com:xml-msprop"> 
<xs:element name="o_ListTable" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
<xs:complexType> 
<xs:choice minOccurs="0" maxOccurs="unbounded"> 
<xs:element name="o_Lista" msprop:REFCursorName="REFCursor"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="COLUMNA" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNB" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNC" msprop:OraDbType="126" type="xs:string" minOccurs="0" /> 
**<xs:element name="COLUMND" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNE" msprop:OraDbType="104" type="xs:string" minOccurs="0" /> 
<xs:element name="COLUMNF" msprop:OraDbType="104" type="xs:string" minOccurs="0" />** 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:choice> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

所有OraDbTypes是正确的,除了一列不是空值和默认值。这个问题的任何解决方案?

如果我更改了错误代码(ColumnC)返回CHAR(1)空默认的“S”,然后再改变它原来的类型CHAR(1)NOT NULL默认列的类型'S',我得到了正确的ORaDbType代码104而不是126.这种行为很奇怪 - 这可能是Oracle的错误吗?

我使用以下Oracle DLL和各自的版本:

OCI.DLL(11.2.0.1版本)

Oracle.DataAccess.dll(4.112.3.0版本)

orannzsbb11 .dll(版本11.0.0。1)

oraocci11.dll(11.2.0.3版)

OraOps11w.dll(2.112.3.0版)

你可能有这个问题new feature

如果您指定NOT NULL列的DEFAULT子句,则 默认值作为元数据存储,但列本身不是填充数据的 。但是,指定新的 列的后续查询将被重写,以便在 结果集中返回默认值。此优化行为与早期版本 不同,此时作为ALTER TABLE操作的一部分,Oracle数据库使用默认值更新了新创建列中的每个 行,然后触发了 表中定义的任何更新触发器。在此版本中,没有触发器 被激发,因为默认值仅作为元数据存储。

虽然我不知道为什么。它似乎在数据库服务器上正常工作。使用DBMS_METADATA.GET_DDL,无论DDL还是DML,类型信息似乎都是正确的。

这意味着您的工具正在使用自己的元数据查询,可能是错误的。最大的问题是,你使用的是什么工具?什么是“OraDBType”,这个XML从哪里来?

您可能需要启用跟踪才能准确查看正在使用哪些SQL语句来创建XML。如果我不得不猜测,这个问题可能与deferred segment creation有关。如果启用了该功能,则首次创建表格时不会有任何细分。延迟段创建可以节省大量空间,但是对于假定始终存在段信息的查询,可能会导致问题。