source

Oracle "ORA-01008: 일부 변수가 바인딩되지 않음" 오류(매개 변수 포함)

ittop 2023. 7. 1. 10:01
반응형

Oracle "ORA-01008: 일부 변수가 바인딩되지 않음" 오류(매개 변수 포함)

저는 오라클을 처음 다루는데 왜 이런 오류가 발생하는지 이해하기가 어렵습니다.

쿼리의 where 절에 다음 코드가 있는 Oracle의 ODT.NET w/C#를 사용하고 있습니다.

WHERE table.Variable1 = :VarA
  AND (:VarB IS NULL OR table.Variable2 LIKE '%' || :VarB || '%')
  AND (:VarC IS NULL OR table.Variable3 LIKE :VarC || '%')

다음과 같은 매개 변수 값을 추가합니다.

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");

이 쿼리를 실행하면 서버가 다음을 반환합니다.

ORA-01008: not all variables bound 

'AND(...)' 라인 중 하나를 주석 처리하면 쿼리가 성공적으로 완료됩니다.

세 개의 매개 변수가 아닌 두 개의 매개 변수만 쿼리하면 쿼리가 제대로 실행되는 이유는 무엇입니까?제가 받는 오류는 말도 안 됩니다.

오라클의 ODP.Net 공급자는 위치별 바인딩을 기본값으로 사용합니다.이름으로 바인딩할 동작을 변경합니다.BindByName 속성을 true로 설정합니다.매개 변수의 이중 정의를 해제할 수 있습니다.

using(OracleCommand cmd = con.CreateCommand()) {
    ...
    cmd.BindByName = true;
    ...
}

바보처럼 보이지만 동일한 바인드 변수를 두 번 사용할 때는 두 번 설정해야 합니다.

cmd.Parameters.Add("VarA", "24");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarB", "test");
cmd.Parameters.Add("VarC", "1234");
cmd.Parameters.Add("VarC", "1234");

PL/SQL의 Native Dynamic SQL에서도 마찬가지입니다.

SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name'
  3     using 'KING';
  4  end;
  5  /
begin
*
ERROR at line 1:
ORA-01008: not all variables bound


SQL> begin
  2     execute immediate 'select * from emp where ename=:name and ename=:name' 
  3     using 'KING', 'KING';
  4  end;
  5  /

PL/SQL procedure successfully completed.

또한 SQL을 다음으로 변경하여 SQL에서 중복된 매개 변수 이름이 필요하지 않도록 할 수도 있습니다.

table.Variable2 LIKE '%' || :VarB || '%'

그런 다음 클라이언트가 VarB 값에 대해 null 대신 '%'를 제공하도록 합니다.어떤 면에서 저는 이것이 더 자연스럽다고 생각합니다.

또한 Sql을 다음으로 변경할 수 있습니다.

table.Variable2 LIKE '%' || IfNull(:VarB, '%') || '%'

언급URL : https://stackoverflow.com/questions/1422032/oracle-ora-01008-not-all-variables-bound-error-w-parameters

반응형