ORA-01745: 호스트/바인드 변수명이 부적합합니다 해결하기 (ORA-01745: invalid host/bind variable name)

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번) 사용하였나요?
  • : 또는 & 와 같이 바인드 변수 식별자를 사용하였나요?

ORA-01745: 호스트/바인드 변수명이 부적합합니다

아래의 코드는 예외가 언제 발생하는지 알 수 있는 자료입니다. 참고하면 도움이 될 것입니다. 커맨드 텍스트에 바인드 변수로 ":", "&", "::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.

직역하면 바인드 변수명에 콜론이 있는 경우 또는, 부적합한 이름, 아마도 예약어가 바인드 변수로 되어 있으니 해당 부분을 점검하라고 합니다.

ORA-01745: invalid host/bind variable name

상기 예제는 Reserved Word 를 호스트/바인드 하였을 때 ORA-01745 오류가 발생하는 것을 보여드리고 있습니다. LOCK과 같은 예약어 대신 다른 변수명으로 변경하여 처리할 수 있습니다.

댓글