Oracle 随机获取无效数字错误
我将以下代码用于Oracle ADO.Net提供程序(DevArt的)。有趣的是,它有时有效,但大多数时候抛出Oracle 随机获取无效数字错误,oracle,ado.net,devart,Oracle,Ado.net,Devart,我将以下代码用于Oracle ADO.Net提供程序(DevArt的)。有趣的是,它有时有效,但大多数时候抛出Devart.Data.Oracle.OracleException:ORA-01722:无效数字 string sql = "SELECT DISTINCT B.PRICE_TIER_KEY,b.label, a.INSERT_DATE AS PriceEffectiveDate,B.PROGRAM_KEY AS PRICE_PROGRAM_KEY FROM GHX_MEMB
Devart.Data.Oracle.OracleException:ORA-01722:无效数字
string sql = "SELECT DISTINCT B.PRICE_TIER_KEY,b.label, a.INSERT_DATE AS PriceEffectiveDate,B.PROGRAM_KEY AS PRICE_PROGRAM_KEY FROM GHX_MEMBER_TIER A INNER JOIN VHA_INT_PRICE_TIER B ON A.SRC_ID_VALUE = B.PRICE_TIER_KEY WHERE RowNum <=100";
DbProviderFactory dpf = DbProviderFactories.GetFactory(System.Configuration.ConfigurationManager.ConnectionStrings["Con_ORA_DevArt"].ProviderName);
DbConnection conn = dpf.CreateConnection();
conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["Con_ORA_DevArt"].ConnectionString;
DbCommand dbcmd = dpf.CreateCommand();
dbcmd.Connection = conn;
//dbcmd.Connection = uniConnection1;
dbcmd.CommandText = sql;
dbcmd.CommandType = CommandType.Text;
dbcmd.CommandTimeout = 0;
DataTable table = new DataTable();
try
{
System.Data.Common.DbDataAdapter da = dpf.CreateDataAdapter();
da.SelectCommand = dbcmd;
// Fill the DataTable.
da.Fill(table);
}
catch (Exception ex)
{
throw;
}
finally
{
if (conn != null && conn.State != ConnectionState.Closed)
{
conn.Close();
conn.Dispose();
}
if (dbcmd != null)
{
dbcmd.Dispose();
}
}
string sql=“选择不同的B.PRICE\u TIER\u KEY、B.label、a.INSERT\u DATE作为PriceEffectiveDate、B.PROGRAM\u KEY作为来自GHX\u成员的PRICE\u TIER a内部连接VHA\u INT\u PRICE\u TIER B在a.SRC\u ID\u VALUE=B.PRICE\u TIER\u KEY中的PRICE\u KEY,其中RowNum尝试将a.SRC\u ID\u VALUE=B.PRICE\u-TIER\u KEY上的更改为(B.PRICE\u TIER\u KEY)
From:“将字符值与数值进行比较时,Oracle会将字符数据转换为数值。”。这种隐式转换并不总是安全的,您需要强制Oracle将数字转换为字符串。尝试将a.SRC_ID_value=B.PRICE_TIER_KEY上的更改为a.SRC_ID_value=to_char上的(B.PRICE\u TIER\u KEY)
From:“将字符值与数值进行比较时,Oracle会将字符数据转换为数值。“。隐式转换并不总是安全的,您需要强制Oracle将数字转换为字符串。ORA-01722是一个数据转换错误。当字符串包含非数字值时,当我们尝试将字符串转换为数字时,会发生这种情况。这可以通过to_number()显式发生。”通过在联接或WHERE子句中使用不同数据类型的列来强制转换或隐式转换
因此,您现在可以看到您发布了所有错误的信息:重要的是相关表的数据结构和内容。最有可能出现问题的是联接中的两列:SRC_ID_VALUE和PRICE_TIER_KEY。这两列都是数字列还是两个字符串?如果一个是数字,另一个不是,string一只包含数字数据
这很重要,因为Oracle将在尝试比较之前将字符串列转换为数字
例如,如果表1中有此数据
1234
10789
'1234'
'45o7'
…表2有这些数据
1234
10789
'1234'
'45o7'
第一行将很好地连接,但第二行将抛出ORA-01722并使查询脱轨
解决方法是使用to_CHAR()将数字列转换为字符串。这将防止Oracle在该列上使用任何索引。这可能与您的情况无关,因为您很可能只是对两个表进行完整的表扫描,但可能与更精确的查询有关
“我认为这在甲骨文中是一个可怕的特性。”
将字符串强制转换为数字会更改排序顺序。此
‘1’、‘10’、‘2’、‘21’、‘3’
…变成这个
1,2,3,10,21
当然,它不能使用原始索引
有一个变通办法,但有些牵扯其中
构建一个函数来测试输入字符串,如果它是数字,则返回一个数字;如果不是,则返回null
使用该函数构建基于函数的索引:
在GHX_成员层上创建索引src_id_num_fbi(是一个编号(src_id_值))
在查询中使用该函数:
…ON是一个数字(a.SRC\U ID\U值)=B.PRICE\U TIER\U键
只有您可以决定这是否值得。ORA-01722是一个数据转换错误。当字符串包含非数值时,我们试图将字符串转换为数字时会发生这种情况。这可以通过to_number()强制转换显式实现,也可以通过在联接或WHERE子句中使用不同数据类型的列隐式实现
因此,您现在可以看到您发布了所有错误的信息:重要的是相关表的数据结构和内容。最有可能出现问题的是联接中的两列:SRC_ID_VALUE和PRICE_TIER_KEY。这两列都是数字列还是两个字符串?如果一个是数字,另一个不是,string一只包含数字数据
这很重要,因为Oracle将在尝试比较之前将字符串列转换为数字
例如,如果表1中有此数据
1234
10789
'1234'
'45o7'
…表2有这些数据
1234
10789
'1234'
'45o7'
第一行将很好地连接,但第二行将抛出ORA-01722并使查询脱轨
解决方法是使用to_CHAR()将数字列转换为字符串。这将防止Oracle在该列上使用任何索引。这可能与您的情况无关,因为您很可能只是对两个表进行完整的表扫描,但可能与更精确的查询有关
“我认为这在甲骨文中是一个可怕的特性。”
将字符串强制转换为数字会更改排序顺序。此
‘1’、‘10’、‘2’、‘21’、‘3’
…变成这个
1,2,3,10,21
当然,它不能使用原始索引
有一个变通办法,但有些牵扯其中
构建一个函数来测试输入字符串,如果它是数字,则返回一个数字;如果不是,则返回null
使用该函数构建基于函数的索引:
在GHX_成员层上创建索引src_id_num_fbi(是一个编号(src_id_值))
在查询中使用该函数:
…ON是一个数字(a.SRC\U ID\U值)=B.PRICE\U TIER\U键
只有您可以决定是否值得这样做。相关列的类型是什么?是否正在进行隐式转换?是的。B.Price\u Tier\u Key是Number,SOURCE\u ID\u VALUE是VARCHAR2(255字节)相关列的类型是什么?是否有任何隐式转换?是的。B.Price\u Tier\u Key是Number,SOURCE\u ID\u VALUE是VARCHAR2(255字节)。您是对的。它的SRC\u ID\u VALUE和Price\u Tier\u Key列,其中第一列是VARCHAR2(255)第二个是数字。谢谢,刚才注意到了一个有用的提示,如果我们使用字符,就会丢失索引。我认为这是Oracle的一个可怕的功能。我不喜欢Oracle。Sql Server 2008 R2在这方面比Oracle好得多。B