본문 바로가기
프로그래밍/Oracle

(C#.NET)ora-01704 clob 에러(데이터 길이 에러)

by Daily Investing 2012. 12. 4.
반응형

1. oracle 직접 쿼리시 아래와 같이 pl/sql 사용하면 된다.

DECLARE

cdata CLOB;

BEGIN

cdata := '양많은 데이터를 넣으세요';

insert into SENDMAIL values( cdata );

commit;

END;

2. 문제는 C#에서 insert 시에 어떻게 하느냐인데 c#에서 직접 insert 하면 안된다. bind 변수를 하면 문제 없이 insert가 된다.

[출처] CLOB 인서트 시 ORA-01704: 문자열이 너무 깁니다 에러 발생|작성자 알라딘

정보를 입력하는 일종의 KMS를 구축하는데 데이터를 HTML 형식으로 저장한다.

그러다보니 저장데이터량이 실제 정보보다 많아지므로

넉넉한 양의 CLOB 타입의 컬럼을 생성했다.

첨에 테스트 할땐 몰랐는데.. 어느정도 데이터 양이 많이지고나니

자주 ORA-01704 에러가 발생한다.

테스트 해보니.. 약 4k를 넘어서니 발생하는듯.. ㅠㅠ

자~~ 그리하야 여기저기 검색해보니.. 아무래도 .net에서 사용하는 dll 문제인듯..

해결 방법은 오라클에서 제공하는 dll을 사용하거나..

(요게 가장 좋은 방법이지만.. 음 제품을 납품하는 입장에선 좀 어려운 방법일지두..)

bind 변수를 사용하는 방법이 있다..

내가 선택한 방법은 bind 변수를 사용하는 방법이다.

cmd.CommandText = "INSERT INTO A VALUES (:a, :b)";

cmd.Parameters.Add(new OracleParameter("a", "a values");

cmd.Parameters.Add(new OracleParameter("b", "b values");

cmd.ExecuteNonQuery();

이렇게 사용하면 아무런 무리 없이 사용이 가능해진다. ^^*

-------------------------------------------------------------------------------------------------------

내가 작성한 코드

sb.AppendLine("INSERT INTO ISENDMAIL_TEST                                     ");
sb.AppendLine("     (SEQ, SYSTEM_NAME, FROM_EMAIL, TO_EMAIL, SUBJECT, MESSAGE, SEND_FLAG    ");
sb.AppendLine("     )                                                                           ");
sb.AppendLine("     VALUES (SEQ_ISENDMAIL.NEXTVAL                        ");
sb.AppendLine("             , '" + dr["SYSTEM_NAME"].ToString() + "'         ");
sb.AppendLine("             , '" + dr["FROM_EMAIL"].ToString() + "'            ");
sb.AppendLine("             , '" + dr["TO_EMAIL"].ToString() + "'                 ");
sb.AppendLine("             , '" + dr["SUBJECT"].ToString() + "'                  ");
//sb.AppendLine("             , '" + dr["MESSAGE"].ToString() + "'              ");
sb.AppendLine("             , :message_data                                              ");

string strQuery = sb.ToString();

dbTransactionHelper.AddParameter(":message_data", dr["MESSAGE"]);

int appliedCnt = dbTransactionHelper.ExecuteNonQuery(strQuery);
if (appliedCnt == 0) throw new Exception("No row applied");

 

반응형

'프로그래밍 > Oracle' 카테고리의 다른 글

[PL/SQL] 기본문법  (0) 2013.07.05
TABLE CREATE[sample]  (0) 2013.06.17
[TABLE]1.2 FILESTORAGE  (0) 2012.10.24
[TABLE]1.1 SENDMAIL  (0) 2012.10.24
sys_connect_by_path(9i), wm_concat(10g) 예제  (0) 2012.10.17