Oracle 随机获取无效数字错误

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

我将以下代码用于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_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