<<Oracle 작업 시 참조>>
1. 컬러명 등 객체의 이름은 30바이트 초과 불가.
1) 오류 코드 : ora-00972: identifier is too long
2) 예시
- 오류 발생 : SELECT Col1,Col2, 'A1234455' CUSTOMS_EXPORT_RECEIVE_IDENTIFY FROM TABLE_NM;
- 오류 발생 안함 : SELECT Col1,Col2, 'A1234455' DD FROM TABLE_NM;
- .Net 보세운송 버전에서 컬럼명이 CUSTOMS_EXPORT_RECEIVE_IDENTIFY 요렇게 생긴넘이 있었음.
+ Oracle에서 테이블 생성 시 컬럼명이 딱 30바이트가 되도록 요렇게 만들어짐 CUSTOMS_EXPORT_RECEIVE_IDENTIF 만들어짐.
3) 조치 방안
- 컬럼명을 30바이트 넘지 않게 생성할 것.
2. SQL문이 한문장은 한라인에 2499 바이트를 초과 할 수 없다.
1) 오류 코드 및 메시지
- SP2-0027: INPUT IS TOO LONG (>2499 CHARACTERS) - LINE IGNORED
2) 예시
- 오류 발생 : SELECT A1,A2,A3,A4,...,A2000 FROM TBL_NM;
+ 실제로 한 테이블의 컬럼이 2000개 되는 경우는 거의 없겠죠.
+ 그러나 복잡한 SQL문을 작성하는 경우에는 SQL문이 길어지는 경우가 발생함.
+ SurPlus .Net 버전
- ntx 정의된 Select 문은 열맞추기 위해 공백을 두고 있음.
- QP.AddService(sQuery.ToString()); ==> SQL문이 1라인으로 만들어짐.
- 오류 발생 안함 : SELECT A1
,A2
,A3
,A4
,...
,A2000
FROM TBL_NM;
3) 조치 방안
- Select 문 작성 시 중간 중간에 캐리지 리턴을 넣어주어야 함.
-
3. 멀티 DML(Insert, Update, Delete) 처리
1) 오류 코드 : 나중에 올릴께욧.
2) 예시
- 오류 발생 : Insert into tbl(AAA)Values('1');
Insert into tbl(AAA)Values('2');
Insert into tbl(AAA)Values('3');
- 오류 발생 안함 : BEGIN Insert into tbl(AAA)Values('1');Insert into tbl(AAA)Values('2');Insert into tbl(AAA)Values('3'); END;
3) 조치방안
- BEGIN (DML SQL1,DML SQL2,...,DML SQLn) END;
- DML 문장들의 시작 부분에는 BEGIN을 끝부분에는 END;로 묶어 주면 된다.
- DML SQL문 사이에 캐리지 리턴이 들어가야 하는지는 확인을 해야 할 듯 합니다.
4. 데이터 타입이 Long인 녀석을 Varchar2로 데이터 변환을 해야 하는 상황이 발생.
Oracle에는 Long이라는 데이터 타입이 있습니다.
이 Long 타입이라는 녀석은 TO_CHAR() 함수가 먹질 않습니다.
TO_CHAR함수를 사용하게 되면 ORA-00932: inconsistent dattyps : expected CHAR get LON 이라는 오류가 발생하게 됩니다.
문제 해결을 위해서 구글링을 해서 처리를 하였습니다. 검색을 해보면 찾을 수 있겠지만 그래도 해당 내용 올립니다.
1. Table 정보
- Table Name : IMPMOV_S
- Long Type Column : MOV_REMARK
2. Function 생성
CREATE
OR
REPLACE
FUNCTION
FNC_LONG2CHAR (
ori_rowid ROWID,
ori_column VARCHAR2,
-- ori_table의 LONG TYPE 컬럼명.
ori_table VARCHAR2
)
RETURN
VARCHAR
AS
longCont VARCHAR2 (32767);
sqlQuery VARCHAR2 (2000);
BEGIN
sqlQuery :=
'select '
|| ori_column ||
' from '
|| ori_table ||
' where rowid = '
|| CHR (39)|| ori_rowid|| CHR (39);
EXECUTE
IMMEDIATE sqlQuery
INTO
longCont;
longCont := SUBSTR (longCont, 1, 4000);
RETURN
longCont;
END
;
3. 실제 사용 SQL
- SELECT fnc_long2char(S.ROWID,'MOV_REMARK','IMPMOV_S') FROM IMPMOV_S;
- Long 타입의 데이터를 Substr 해야 할 경우에도 위 Funtion을 사용하시면 됩니다.
+ ex) SELECT SUBSTR(fnc_long2char(S.ROWID,'MOV_REMARK','IMPMOV_S'),1,200) FROM IMPMOV_S;
원문 출처 : http://www.cspark.net/174
'IT > Database' 카테고리의 다른 글
[MSSQL] SQL 버전 확인 쿼리 (0) | 2018.07.11 |
---|---|
[MSSQL]권한 및 테이블 복사, 업데이트(Update) Query (0) | 2018.07.09 |
[MSSQL] sqlcmd 활용하기. (0) | 2018.07.06 |
관계형 데이터 모델 (0) | 2018.05.18 |
[MSSQL] MS-SQL 달력만들기 SQL 문 (0) | 2018.04.27 |
[NoSQL] MongoDB 아키텍쳐 (0) | 2018.04.26 |
[NoSQL] MongoDB (문서, 콜렉션 ,데이터베이스) (0) | 2018.04.26 |
[NoSQL] Mongo DB 설치 법입니다 (0) | 2018.04.26 |