ORA-01745: 호스트/바인드 변수명이 부적합합니다 (ORA-01745: invalid host/bind variable name) 오류는 바인드 변수 식별자를 단독으로 사용하는 경우, 바인드 변수 사이에 콤마를 누락하는 경우, 식별자를 중복하여 작성하는 경우, 또는 바인드 변수명을 예약어/키워드로 설정하였을 때 발생할 수 있습니다.
오라클에서 바인드 변수 식별자는 콜론(:)과 앰퍼샌드(&)가 있으며 보통 콜론을 많이 사용하는 편입니다.
바인드 변수 식별자는 변수 앞에 반드시 한 번만 기입하여야 하는데, 아래는 잘못된 작성 양식을 예시로 보여드리겠습니다.
- INSERT INTO table_name (column_name) VALUES (:);
- INSERT INTO table_name (column_name) VALUES (&);
- INSERT INTO table_name (column_name) VALUES (::param);
- INSERT INTO table_name (column_name) VALUES (:&);
- INSERT INTO table_name (column_name) VALUES (&:);
- INSERT INTO table_name (column_name) VALUES (:table);
- INSERT INTO table_name (column_name) VALUES (:column);
ORA-01745: 호스트/바인드 변수명이 부적합합니다 해결하기
- 바인드 변수로 table, column과 같은 예약어 및 키워드를 사용하였나요?
- ::param과 같이 바인드 변수 식별자를 2번 이상(콜론 2번) 사용하였나요?
- : 또는 & 와 같이 바인드 변수 식별자를 사용하였나요?
아래의 코드는 예외가 언제 발생하는지 알 수 있는 자료입니다. 참고하면 도움이 될 것입니다. 커맨드 텍스트에 바인드 변수로 ":", "&", "::param" 등을 사용하여 "호스트/바인드 변수명이 부적합합니다" 예외가 발생하는 예시 자료입니다.
try
{
int i;
using (OracleConnection con = new OracleConnection("User Id=userName;Password=password;Data Source=dataSourceName"))
{
con.Open();
using (OracleCommand cmd = con.CreateCommand())
{
cmd.CommandText = "INSERT INTO table_name (column_name) VALUES (:)";
cmd.CommandText = "INSERT INTO table_name (column_name) VALUES (&)";
cmd.CommandText = "INSERT INTO table_name (column_name) VALUES (::param)";
i = cmd.ExecuteNonQuery();
}
}
txt.Text = "Executed!";
}
catch (Exception ex)
{
txt.Text = ex.ToString();
if (chkShowMsg.IsChecked == true)
MessageBox.Show(ex.ToString(), "예외", MessageBoxButton.OK, MessageBoxImage.Error);
}
위의 코드를 실행하면 아래와 같은 예외가 발생합니다.
System.Data.OracleClient.OracleException (0x80131938): ORA-01745: 호스트/바인드 변수명이 부적합합니다
위치: System.Data.OracleClient.OracleConnection.CheckError(OciErrorHandle errorHandle, Int32 rc)
위치: System.Data.OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle, CommandBehavior behavior, Boolean needRowid, OciRowidDescriptor& rowidDescriptor, ArrayList& resultParameterOrdinals)
위치: System.Data.OracleClient.OracleCommand.ExecuteNonQueryInternal(Boolean needRowid, OciRowidDescriptor& rowidDescriptor)
위치: System.Data.OracleClient.OracleCommand.ExecuteNonQuery()
이번 오라클 오류 주제, ORA-01745 호스트 변수명과 바인드 변수명이 부적합합니다 오류를 해결하는 방법에 대해 알아보았습니다. 다음은 어떠한 액션을 취해야 하는지 알려드리는 것과 실제 예약어를 사용했을 때 오류가 발생하는 예시를 간단히 준비해 보았습니다.
오라클에서는 이 오류에 대해 다음과 같은 행동을 취하라고 제시합니다. 참고로 호스트 변수는 여러분이 입력하는 값을 의미하고, 바인드 변수명은 :PARAM과 같이 문자 그대로 해당 변수에 바인딩된 변수명을 의미한답니다.
Cause: A colon in a bind variable or INTO specification was followed by an inappropriate name, perhaps a reserved word.
Action: Change the variable name and retry the operation.
직역하면 바인드 변수명에 콜론이 있는 경우 또는, 부적합한 이름, 아마도 예약어가 바인드 변수로 되어 있으니 해당 부분을 점검하라고 합니다.
상기 예제는 Reserved Word 를 호스트/바인드 하였을 때 ORA-01745 오류가 발생하는 것을 보여드리고 있습니다. LOCK과 같은 예약어 대신 다른 변수명으로 변경하여 처리할 수 있습니다.