Oracle 오류 : PLS-00306 : 잘못된 숫자 또는 인수 유형

.net dapper odp.net oracle stored-procedures

문제

Dapper와 ODP.Net을 사용하여 저장 프로 시저를 호출합니다. 나는 내 매개 변수가 무엇이 잘못되었는지를 발견하지 못하고 바보 같지만 여기에 간다.

다음은 저장 프로 시저 서명입니다.

PROCEDURE SP_NETWORK_GETALL(UserLogon IN VARCHAR2, NetworkVersionList OUT refCursor)

그리고 여기에 내 .Net 전화입니다 :

using (var conn = new OracleConnection(connString))
{
    var parameters = new List<OracleParameter>
    {
        new OracleParameter()
        {
            Direction = ParameterDirection.Input,
            ParameterName = "UserLogon",
            OracleDbType = OracleDbType.Varchar2,
            Size = 4000,
            Value = "TEST"
        },
        new OracleParameter()
        {
            Direction = ParameterDirection.Output,
            OracleDbType = OracleDbType.RefCursor,
            ParameterName = "NetworkVersionList",
            Value = DBNull.Value
        },
    };

    var results = conn.Query("SDTM.PKG_SP_GET.SP_NETWORK_GETALL", parameters, commandType: CommandType.StoredProcedure);
}

이 저장 프로 시저를 시도했지만 작동합니다. Dapper를 다른 저장 프로 시저에 사용 했으므로 잘 작동합니다. 내가 VarChar2 매개 변수의 크기를 설정하거나 참조 커서에 대한 DBNull.Value, 매개 변수 (먼저 참조 커서)의 순서를 변경 시도했다.

stackoverflow 또는 인터넷에서이 같은 백만 질문을 본 적이 있지만 여기에 매개 변수 불일치를 볼 수 없습니다 ...

수락 된 답변

문제는 OracleParameter 객체 목록을 dapper의 "parameters"변수에 전송한다는 것입니다. Dapper는 공급자에 무관심한 사용자를 대상으로하며 공급자 유형을 전송합니다.

dapper 코드에서 GetCacheInfo 메소드를 살펴보면 dapper가 매개 변수를 처리하는 방법에 세 가지 경우가 표시됩니다.

  1. IDynamicParameters의 객체
  2. IEnumerable <KeyValuePair <string, object >>의 개체
  3. Default / Else - 명령에서 토큰과 일치하는 개체의 속성을 찾으려고 시도합니다.

당신은 아마도 기본 경우에 빠지 겠지만, 당신은 proc을 가지고 있기 때문에, 명령에 토큰이없고 어떤 매개 변수도 추가되지 않습니다. 비록 그것들 일지라도, 아마도 List <> 타입의 프로퍼티를 통해 검색 할 것이고 그것은 매치를 찾지 않을 것입니다.

IDynamicParameters를 추가하면 매개 변수를 제어 할 수 있으므로 그것이 작동합니다. 이것은 odp.net과는 아무런 관련이 없습니다.

나는 이것이 모든 ORMs와 마찬가지로 더 끔찍한 나의 irks 중 하나라고 생각합니다. 시도하려고하는 것만 큼 어렵습니다. 항상 추상화 될 수없는 공급자 특정 물건이 될 것입니다. 그렇기 때문에 단순히 공급자 특정 명령을 설정 한 다음 매핑 만 수행하는 유틸리티 클래스를 사용하는 것이 더 좋습니다 (연결 / 설정 / 실행과 관련하여 자체 관련 없음).



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.