2009-05-05 3 views
2

우선 배경 비트. 우리 회사는 Informix 데이터베이스를 Oracle 10g로 마이그레이션할지 여부를 평가하고 있습니다. 우리에게는 여러 ESQL/C 프로그램이 있습니다. 필자는 Oracle Migration Workbench를 통해 약간의 테스트를 거쳤습니다. 이제 몇 가지를 깨닫게되었습니다.Informix에서 Oracle : Null 값을 가져 오는 작업 다루기

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

둘째, 우리는 등 다양한 테이블에서 날짜를 당겨 몇 가지 질문이 및 Informix에 날짜가 긴 타입, 12 월 31 일 이후 일의 #, 프로에서 1899

* C, 어떤 형식으로 처리됩니다 날짜가? 난 내 긴 변수에 날짜 필드를 선택하고 오라클 오류가 "예상 NUMBER하지만 날짜가있어"얻으려고했기 때문에 그것은 숫자가 아니라는 것을 압니다. 따라서 우리는 날짜 필드를 선택하는 방법을 수정해야한다고 가정합니다. 변환 된 방식으로 날짜 필드를 선택하여 (예 : 1899 년 12 월 31 일 이후의 일수) 호스트를 변경하거나 오라클이 반환하는 것과 일치하는 변수 (문자열은 무엇입니까?).

+0

+1 나는 당신의 고통을 느낍니다. –

+0

마이 그 레이션을 고려해야 할 때 불운이 있습니다.Informix 코드에서 동적 SQL이 nulls 문제를 처리하지 못하거나 OCI (Pro * C)가 호스트 변수와 함께 표시기 변수를 처리하지 않는다는 것을 의미합니까? –

+0

필자는 Pro * C 컴파일러가 nvl() 또는 표시기 변수를 사용하여 Null 값을 명시 적으로 처리하지 않을 때 테이블의 Null 값에 대해 불평한다는 것을 의미했습니다. Informix는 null 값을 선택하면 덜 신경 쓸 수 없습니다. (그리고 나는 그런 식으로 좋아합니다!) ... – KNewton

답변

2

오라클 내부 형식으로 저장되는 오라클 날짜를 긴 정수로 변환하려면 쿼리를 변경해야합니다. 날짜에 대해 다음 공식을 사용

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

오라클 시스템 'J'형식으로 12 월 31 일 4712BC 이후 일수의 계산은 (율리우스 날짜가). 나중에 날짜를 계산하려면 나중에 날짜의 율리우스 일 수를 뺍니다.

한 가지 제안 : 프로그램에서 모든 쿼리를 변경하는 대신 (문제를 일으키고 버그를 도입 할 수 있음) 다른 스키마에서 뷰 집합을 만듭니다. 이러한 뷰는 모든 테이블과 동일한 열로 이름이 지정되지만 NVL() 및 date() 수식 (위와 같음)이 포함됩니다. 그런 다음 기본 테이블 스키마가 아닌 뷰 스키마에서 응용 프로그램을 지정하십시오. 테스트 횟수가 적고 무언가를 놓칠 수있는 곳이 적습니다.

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

그래서 예를 들어,보기를 만들 APPS_VIEWS에서 사용자 "APPS_BASE"그런 다음 "APPS_VIEWS"라는 다른 스키마/사용자를 생성에 의해 정의 된 "APPS_BASE"(라는 스키마에 모든 테이블을 넣어
+0

토마스는 피드백에 감사드립니다. 내가보기를 만드는 것에 대한 당신의 생각을 정말 좋아하고 그것을 탐험 할 것입니다, 훌륭합니다! 카렌 – KNewton

+0

다음 식을 1899년 12월 31일 TRUNC (date_column) 이후 정수 일을 반환합니다 - TO_DATE ('1899년 12월 31일', 'YYYY-MM-DD') .... ... 참고 : TRUNC 함수는 date_column에 시간 부분이 자정이 아닌 다른 값으로 설정된 경우에만 필요하며 반환 된 값이 정수인지 확인하려고합니다. – spencer7593

3

예. 설명 된대로 쿼리를 수정해야합니다.

오래 걸리고 있습니다. long은 Oracle에서 다른 의미를가집니다. 특정 DATE 유형이 있습니다. 일반적으로 TO_DATE 함수를 사용하여 형식을 선택하면 원하는 형식으로 결과가 VARCHAR2가됩니다.

3

아마 당신을 때리지는 않았지만 오라클의 빈 VARCHAR2 필드는 NULL입니다. 나는이 사실 뒤에 어떤 논리도 보이지 않는다는 것을 안다. 아마도 Informix에서 왔기 때문일 것이다. 나는 그것이 어리 석다라고 생각한다 - IMHO 빈 문자열은 의미 있고 NULL과 다르다.

모든 VARCHAR2 필드를 NOT NULL DEFAULT '-' 또는 다른 임의의 값으로 수정하거나 VARCHAR2 필드를 반환하는 모든 쿼리에서 표시를 사용하거나 항상 NVL()을 사용하십시오.

관련 문제