Oracle에서 Clob 유형 처리 분석
최근 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 이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.