문제

약간의 배경 먼저. 우리 회사는 Informix 데이터베이스를 Oracle 10G로 마이그레이션할지 여부를 평가하고 있습니다. 몇 가지 ESQL/C 프로그램이 있습니다. 나는 Oracle Migration Workbench를 통해 일부를 실행하고 일부 테스트를 통해 혼잡했습니다. 이제 나는 몇 가지를 깨닫게되었습니다.

먼저, 널 값을 전혀 처리하지 않는 동적 SQL 문이 있습니다. 내가 읽은 내용에서 NVL () 함수를 활용하려면 쿼리를 수동으로 수정하거나 표시기 변수를 구현해야합니다. 수동 수정이 필요한지 확인할 수 있습니까? 전환 된 ESQL/C 프로그램에 대한 수동 변경이 가장 적을수록 좋습니다.

둘째, 우리는 다양한 테이블 등의 날짜를 끌어들이는 몇 가지 쿼리가 있으며, Informix 날짜는 1899 년 12 월 31 일 이후 며칠 동안 유형으로 취급됩니다.

Pro*C에서는 날짜가 어떤 형식으로 선택됩니까? 날짜 필드를 긴 변수로 선택하고 "예상 숫자이지만 날짜를 얻었습니다"라는 Oracle 오류를 얻었 기 때문에 숫자가 아님을 알고 있습니다. 그래서 우리는 날짜 필드를 선택하는 방법을 수정해야한다고 가정합니다. - 변환 된 방식으로 날짜 필드를 선택하여 길이가 길어 지거나 (예 : 12/31/1899 이후 #) 호스트를 변경합니다. Oracle이 반환하는 일에 맞는 변수 (String?).

도움이 되었습니까?

해결책

Oracle Dates (Oracle 내부 형식의 저장)를 긴 정수로 변환하려면 쿼리를 변경해야합니다. 날짜에 다음 공식을 사용하십시오.

to_number (to_char (date_column, 'J')) - to_number(to_char(to_date('12/31/1899', 'MM/DD/YYYY'), 'J'))

Oracle System 'j'(Julian Date) 형식은 4712BC 12 월 31 일 이후의 수입니다. 나중에 계산하려면 나중에 줄리안의 날 수를 빼야합니다.

한 가지 제안 : 프로그램의 모든 쿼리를 변경하는 대신 (문제를 일으키고 버그를 소개 할 수 있음) 다른 스키마에서 뷰 세트를 만듭니다. 이보기는 모든 테이블과 동일하며 모든 열이 동일하지만 NVL () 및 date () 공식 (위와 같이)을 포함합니다. 그런 다음 기본 테이블 스키마가 아닌보기 스키마에서 응용 프로그램을 가리 킵니다. 테스트가 훨씬 적고 무언가를 놓칠 수있는 장소가 적습니다.

예를 들어, 모든 테이블을 "apps_base"(사용자 "apps_base"에 의해 정의 된 그런 다음 "apps_views"라는 다른 스키마/사용자를 만듭니다. apps_views에서보기를 만듭니다.

CREATE OR REPLACE VIEW EMP AS
SELECT name, birth_date
FROM   APPS_BASE.EMP;

다른 팁

당신. 설명대로 쿼리를 수정해야합니다.

길고 당신을 넘어 가고 있습니다. Oracle에서는 Long이 다른 의미를 가지고 있습니다. 특정 날짜 유형이 있습니다. 일반적으로 하나를 선택할 때는 형식으로 to_date 함수를 사용하여 결과를 Varchar2로 가져와 정확히 원하는 형식으로 얻습니다.

아마도 아직 당신을 때리지 않았지만 Oracle에서 빈 Varchar2 필드는 널입니다. 나는 이것 뒤에 논리가 보이지 않습니다 (아마도 Informix Land에서 왔기 때문에) - 그냥 명심하십시오. 나는 그것이 바보라고 생각합니다 - IMHO 빈 끈은 의미 있고 null과 다릅니다.

모든 varchar2 필드를 수정하십시오 NOT NULL DEFAULT '-' 또는 varchar2 필드를 반환하거나 항상 사용하는 모든 쿼리에서 기타 임의의 값 또는 사용 지표 NVL().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top