반응형
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
반응형
'source' 카테고리의 다른 글
설정된 시간(초)마다 코드를 실행하는 VBA Macro On Timer 스타일(예: 120초) (0) | 2023.07.01 |
---|---|
data.frame 목록에서 개별 엑셀 워크시트 - R (0) | 2023.07.01 |
오류: 쓰기를 시도하는 동안 워크북을 압축하지 못했습니다.xlsx (0) | 2023.07.01 |
값의 합이 아닌 값을 표시하는 피벗 테이블 (0) | 2023.07.01 |
Vuex - 구성 요소 간에 어레이를 효율적으로 공유 (0) | 2023.07.01 |