2010-02-01 5 views
2

varchar(10) 유형의 열을 선택하는 루프의 "in"절에 select가있는 루프를 작성하지만 그 값을 열에 삽입합니다. 그 (것)들을 varchar(9) 인 원하는가? 기본적으로 저는 어떤 정밀도에서 다른 정밀도로 "타입 변환"하려고합니다. 예 :varchar (10) to varchar (9)

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’) 
LOOP 
       INSERT INTO OTHER_TABLE 
       (THIS_IS_VARCHAR_NINE) 
       VALUES 
       (V_TEN); 
END LOOP; 

오류는 열 유형이 동일하지 않다는 것입니다. 나는 to_char()cast()을 보았지만 어느 것도 내가 원하는 것처럼 보이지 않았습니다. 나는 여기에 정확성의 손실이 있다는 것을 알고 있고 그걸로 괜찮습니다. 왜냐하면 실제로 varchar(10) 컬럼의 값이 항상 9 문자가된다는 것을 알고 있기 때문입니다.

+0

왜 캐스팅하지 않습니까? – lins314159

답변

1

가 사용 :

FOR V_TEN IN (SELECT SUBSTR(t.this_is_varchar_ten, 1, 9) 
       FROM TABLE t 
       WHERE t.something = 'VALUE') 
LOOP 

    INSERT INTO OTHER_TABLE 
    (THIS_IS_VARCHAR_NINE) 
    VALUES 
    (V_TEN); 

END LOOP; 

은 VARCHAR 하위 문자열하기 위해 SUBSTR 기능을 사용하여 (10) 데이터는은 (9)

10

당신은 SUBSTR 기능을 찾고 있습니다 VARCHAR로 반환되도록.

또한 PL/SQL을 사용하지 마십시오. 일반 SQL이 처리 속도가 빠릅니다.

INSERT INTO OTHER_TABLE 
    SELECT OTHER_COLUMN, SUBSTR(THIS_IS_VARCHAR_TEN,1,9) 
    FROM TABLE WHERE SOMETHING=’VALUE’; 

그리고 정말 더 값 이상 아홉 개 문자보다가있는 경우, 당신도 SUBSTR 함수를 호출 (자동 변환됩니다, 너무 긴 경우 오류가 발생) 할 필요가 없습니다.

+0

PL/SQL 루프 대신 SQL을 사용하는 경우 +1. – APC

4

내가 실제로 VARCHAR (10) 컬럼의 값 9 개 문자 될 것 항상 것을 알고 있기 때문이다.

그렇다면 다른 사람이 제안한 것처럼 SUBSTR을 사용할 필요조차 없습니다.

나는 오류가 발생하는 이유는 V_TEN의 값을 삽입하려한다는 것입니다. FOR x IN (SELECT ...) LOOP과 같은 구문을 사용하면 x이 암시 적으로 레코드 유형으로 선언됩니다. 귀하의 경우에는 하나의 필드 만있는 레코드이지만 여전히 스칼라 유형으로 직접 사용할 수는 없습니다.

레코드의 필드를 삽입 할 때 이름으로 참조하면됩니다.

FOR V_TEN IN (SELECT THIS_IS_VARCHAR_TEN FROM TABLE WHERE SOMETHING=’VALUE’) 
LOOP 
       INSERT INTO OTHER_TABLE 
       (THIS_IS_VARCHAR_NINE) 
       VALUES 
       (V_TEN.THIS_IS_VARCHAR_TEN); 
END LOOP; 

Thilo가 지적한 것처럼 어쨌든 명시 적 루프에서이 작업을 수행 할 이유는 없습니다. 단일 INSERT ... SELECT로 작성하십시오.