Oracle에서 Clob 유형 처리 분석

2245 단어
요약
최근 NHibernate 매핑 유형인 Clob 필드를 이용하여 데이터를 삽입할 때 문자의 바이트 수 (한 개의 반각 문자는 한 바이트, 한 개의 전각 문자는 두 바이트) 가 2000-4000 사이의 타임즈 오류 (ORA-01461: LONG 열의 LONG 값만 삽입할 수 있음) 를 발견하였다.끊임없이 자료를 찾고 자신의 실험을 통해 이 문제가 마침내 해결되었으니, 다음에 나는 자신의 소감을 모두에게 공유할 것이다. 
 
차리다
시스템 환경 xp+.net2.0+oracle9i 표 구조(테스트이기 때문에 표 구조가 아무렇게나 만들어졌음)XX
 
필드 이름
타입
 ID
 VARCHAR2(70)
 TEST
 CLOB
 
테스트
방법 1: SQL 문에서 CLOB 값을 직접 철자합니다.
코드:
string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "','" + data + "')";// data     ,          
cmd.ExecuteNonQuery();

상황 분석:
데이터의 길이가 4000타임스 오류(ORA-01704: 문자열이 너무 길거나 4000보다 작거나 같을 때 정상적으로 삽입됩니다.
원인 분석:
길이가 4000보다 큰 타임즈 오류가 발생하는 이유는 Oracle의 SQL 문에서 두 개의 작은 따옴표 사이의 문자 수가 4000보다 크면 안 되기 때문입니다."'+ 데이터 +' 데이터는 sql 문장 사이에서 데이터의 값이 4000바이트 이상일 때 오류를 보고합니다.
해결 방법:
이런 방식은 비교적 까다롭지만, 더 좋은 방법이 있으니, 다음에 이야기할 것이다.
 
방식2: 매개 변수 형식을 채택한다.코드:
string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "',:p1)";
OracleParameter p1 = new OracleParameter("p1", OracleType.Clob);
p1.Value = data; // data     ,          
cmd.Parameters.Add(p1);
cmd.ExecuteNonQuery();

상황 분석:
이런 방식을 채택하면 정상적으로 삽입할 수 있다.그래서 이런 식으로 추천합니다.
원인 분석:
해결 방법 없음: 방법 없음 3: 매개변수를 사용하지만 매개변수 유형은 OracleType.NVarChar 코드:
string id = Guid.NewGuid().ToString();
OracleCommand cmd = Conn.CreateCommand();
cmd.CommandText = "insert into xx(id,test) values('" + id + "',:p1)";
OracleParameter p1 = new OracleParameter("p1", OracleType. NVarChar);
p1.Value = data; // data     ,           
cmd.Parameters.Add(p1);
cmd.ExecuteNonQuery();
상황 분석: 왜 이런 방식을 써야 합니까? 이런 방식은 NHibernate를 사용하는 방식과 비슷하기 때문에 이런 방식에서 어떤 상황이 발생할지 먼저 봅시다.데이터의 바이트 수가 0-2000 사이일 때 정상적으로 삽입되고 4000 이상일 때도 정상적으로 삽입되지만 2000-4000일 때 실패하고 오류 보고(ORA-01461: LONG 열의 LONG 값만 삽입할 수 있음) 원인 분석: 대응하는 Oracle 유형을 사용하지 않았다.해결 방법: OracleType.Clob
 

좋은 웹페이지 즐겨찾기