2013-09-26 3 views
0

내 테이블 구조입니다.던지기 잘못된 번호 오류가 실행하는 동안 또는

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

쿼리를 실행할 때 잘못된 번호 예외가 발생합니다. 약간 쿼리를 수정 한 경우 Like :

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

잘 실행됩니다.

+0

이 [link] (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; 
/

FOLLOW UP은 :

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의 모든 잘못된 값을 출력합니다;

관련 문제