c# .NET을 활용해 데스크탑 어플리케이션을 구축하고자 한다.
이때 Oracle 데이터베이스와 연동하고자 하며, 프로시저 호출을 수행하고자 한다.
프로시저와 함수의 차이?
: 함수란 프로시저의 각 프로세스(쿼리)를 수행하기 위해 필요한 기능을 정의한 것이다.
- 프로시저와 달리 함수는
i) 리턴 값을 반드시 가지며, 그 값은 유잃다ㅏ.
ii) 특정 기능(계산)을 수행한다. 반면 프로시저는 특정 작업(더 넓은 범위)을 수행
① 재사용성
② 모듈화
③ 유연성
① 연결 생성
public const string OracleConnectionString = "User Id=;'유저이름'Password='유저비번';Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST='host명')(PORT='port번호')))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME='스키마명')));";
using (OracleConnection connection = new OracleConnection(OracleConnectionString))
{
connection.Open();
using (OracleCommand command = new OracleCommand("HMX_KCTC.P_LOG_IN", connection))
}
※ 문자열 버퍼 오류
- 위 오류의 경우 Oracle Function 혹은 Procedure 내 선언된 변수의 크기보다 더 큰 값을 받아오는 경우 발생하는 오류이다. 이러한 경우 대개 4000byte(오라클 지원 최대 VARCHAR bytes) 로 설정해 줌으로써 해결할 수 있다.
② 매개변수 설정
아래 예제의 프로시저는 사용자 정보 삭제 프로시저로써 json형태의 입력 매개변수를 가진다.
using (OracleCommand command = new OracleCommand("HMX_KCTC.P_DELETE_USER_HJ", connection))
{
command.CommandType = CommandType.StoredProcedure;
// 입력 매개변수 (JSON)
string jsonInput = JsonConvert.SerializeObject(new { ID_T_USER, USER_ID });
command.Parameters.Add("PV_JSON_I", OracleDbType.Varchar2).Value = jsonInput;
// 출력 매개변수 설정
command.Parameters.Add("PV_JSON_O", OracleDbType.Varchar2, 4000, "", ParameterDirection.Output);
command.Parameters.Add("PV_RETCOD_O", OracleDbType.Int32, ParameterDirection.Output);
command.Parameters.Add("PV_RETMSG_O", OracleDbType.Varchar2, 4000, "", ParameterDirection.Output);
③ 프로시저 실행
command.ExecuteNonQuery();
int retCode = command.Parameters["PV_RETCOD_O"].Value != null ? ((OracleDecimal)command.Parameters["PV_RETCOD_O"].Value).ToInt32() : -1;
string retMessage = command.Parameters["PV_RETMSG_O"].Value != null ? command.Parameters["PV_RETMSG_O"].Value.ToString() : "No message";
④ 프로시저 리턴값 확인
if (retCode == 0)
{
MessageBox.Show($"{retMessage}", "알람");
Application.Current.Dispatcher.Invoke(() =>
{
UserList.Remove((UserData)selectedRow.Item);
});
}
else
MessageBox.Show($"사용자 정보 삭제 실패 : {retMessage} ; {retCode}", "경고");
}
※ Json Parameter
: json 형태로 파라미터를 추가하는 경우 Newtonsoft.Json 패키치를 사용하도록 한다.
프로시저를 사용해 코드의 가독성을 높이고, 안전성을 보장할 수 있다. MsSQL 또한 Oracle과 마찮가지로 c# wpf 및 winform 어플리케이션에서 데이터베이스에 접속하고 프로시저 호출을 구현할 수 있다.