2013-09-26 63 views
0

我的表结构..投掷无效的号码错误或

A_TEXT(ID number,name varchar2) 
POLICY_INFO (PI_ID number,relation_id varchar2) 

我有这样的查询。

SELECT * FROM A_TEXT A WHERE a.name = 'test' OR a.ID IN 
      (SELECT TO_NUMBER(RELATION_ID) 
      FROM POLICY_INFO 
      ) 

当我尝试执行查询时,我得到了无效数字异常。如果你修改了查询一点点像:

SELECT * FROM A_TEXT A WHERE a.name = 'test' OR TO_CHAR(a.ID) IN 
      (SELECT RELATION_ID 
      FROM POLICY_INFO 
      ) 

它执行得很好。

+0

请访问此链接(http://stackoverflow.com/questions/17740055/oracle-applying-the-to-number-function-to-a-varchar-column) –

+0

可能是** RELATION_ID的值**是一个字符。 – Ajeesh

+2

切勿将数字存储在varchar列中。如果'policy_info.relation_id'确实引用'a_text.id',则使'relation_id'成为一个数字并创建一个外键约束。 –

回答

1

可能的原因是该列RELATION_ID包含非数字字符(Anything apart from 0-9, NULL)

记住,所有NUMBER的可被转化成VARCHAR,而不是反之亦然。

要检查列RELATION_ID,请使用以下函数并验证您的非数字字符串。

CREATE OR REPLACE FUNCTION isnumeric(p_string in varchar2) 
RETURN BOOLEAN 
AS 
    l_number number; 
BEGIN 
    l_number := p_string; 
    RETURN TRUE; 
EXCEPTION 
    WHEN OTHERS THEN 
     RETURN FALSE; 
END; 
/

跟进:

WITH POLICY_INFO 
    AS (SELECT 
      1 AS PI_ID, 
      '1' AS RELATION_ID 
     FROM 
      DUAL), 
    A_TEXT 
    AS (SELECT 
      1 AS ID, 
      'testA' AS NAME 
     FROM 
      DUAL 
     UNION ALL 
     SELECT 
      2 AS ID, 
      'test' AS NAME 
     FROM 
      DUAL) 
SELECT 
     * 
FROM 
     A_TEXT A 
WHERE 
     A.NAME = 'test' 
     OR A.ID IN (SELECT TO_NUMBER (RELATION_ID) FROM POLICY_INFO); 

这工作得很好。请检查这个。如果您仍然遇到问题,请告诉我们完整的数据集

+2

我想说这不是一个可能的原因,但它绝对是错误的原因。 –

+0

没有列RELATION_ID没有任何非数字字符。只有数字存储在该列中 –

+0

请将您的数据集作为INSERT语句 – SriniV

0

您的数据库列中有非数字,或者您有数字格式问题。要调试这种情况下,你可以这样做(@realspirituals答案略有变化):

declare 
    l_dummy number; 
begin 
    for cur in (select relation_id from policy_info) 
    loop 
    begin 
     l_dummy := to_number(cur.relation_id); 
    exception 
     when others then dbms_output.put_line(cur.relation_id); 
    end; 
    end loop; 
end; 

这将打印从policy_info.relation_id所有违规值;