C #으로 Dapper를 사용하여 refcursor를 out 매개 변수로 사용하여 Oracle 저장 프로 시저를 호출하는 문제가 있지만 반환 값으로 refcursor가 작동합니다.

.net dapper oracle ref-cursor sys-refcursor

문제

이 oracle proc 패키지를 저장하면 다음과 같습니다.

CREATE OR REPLACE 
PACKAGE TESTPKG AS 
  FUNCTION TestReturnRefCursor RETURN SYS_REFCURSOR;
  PROCEDURE TestingRefCursorsAsOutParam (outp OUT SYS_REFCURSOR);
END TESTPKG

그리고이 패키지 몸체 :

CREATE OR REPLACE
PACKAGE BODY TESTPKG AS

  FUNCTION TestReturnRefCursor RETURN SYS_REFCURSOR AS
    outp SYS_REFCURSOR;
  BEGIN
    OPEN outp FOR SELECT * FROM TABLENAME;
    RETURN outp; 
  END TestReturnRefCursor;

  PROCEDURE TestingRefCursorsAsOutParam (outp OUT SYS_REFCURSOR) AS 
  BEGIN
    OPEN outp FOR SELECT * FROM TABLENAME;
  END TestingRefCursorsAsOutParam;

END TESTPKG;

Dapper를 사용하여 두 함수 중 하나를 호출하려고합니다. StackOverflow 검색 후이 게시물에서 찾은 Dapper.SqlMapper.IDynamicParameters를 구현하는 OracleDynamicParameters 클래스를 만들었습니다. https://gist.github.com/vijaysg/3096151

TestReturnRefCursor 저장 함수를 호출하면이 코드가 제대로 작동합니다.

        var conn = new OracleConnection(ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString);
        conn.Open();
        var p = new OracleDynamicParameters();
        p.Add("retSet", dbType: OracleDbType.RefCursor, direction: ParameterDirection.ReturnValue);
        conn.Execute("TESTPKG.TestReturnRefCursor ", param: p, commandType: CommandType.StoredProcedure);
        var refcur = p.Get<OracleRefCursor>("retSet");
        // do something with refcur
        conn.Close();

그러나이 코드를 사용하여 TestingRefCursorsAsOutParam 저장 프로 시저를 호출하려고하면 다음과 같이됩니다.

var conn = new OracleConnection(ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString);
conn.Open();
var p = new OracleDynamicParameters();
p.Add("retSet", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);
conn.Execute("TESTPKG.TestingRefCursorsAsOutParam ", param: p, commandType: CommandType.StoredProcedure);
var refcur = p.Get<OracleRefCursor>("retSet");
// do something with refcur
conn.Close();

세부 사항이있는 Oracle.ManagedDataAccess.dll에서 OracleException이 발생합니다.

"ORA-06550: line 1, column 7:\nPLS-00306: wrong number or types of arguments in call to 'TESTINGREFCURSORSASOUTPARAM'\nORA-06550: line 1, column 7:\nPL/SQL: Statement ignored"

다른 값을 DBNull.Value되도록 구체적으로 설정하지 않는 한 때때로 null 매개 변수가 바인딩되지 않은 다른 stackoverflow 게시물을 검색 한 후 찾을 수 있으므로 추가 매개 변수 줄을 변경 시도 :

p.Add("retSet", value: DBNull.Value, dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);

그러나 이것은 도움이되지 못했습니다.

나는이 저장 프로 시저를 일반 C # Oracle 코드를 사용하여 잘 호출 할 수있다.

var cmd = conn.CreateCommand();
cmd.CommandText = "TESTPKG.TestingRefCursorsAsOutParam";
cmd.CommandType = CommandType.StoredProcedure;

var outparam = new OracleParameter();
outparam.ParameterName = "retSet";
outparam.Direction = ParameterDirection.Output;
outparam.OracleDbType = OracleDbType.RefCursor;

cmd.Parameters.Add(outparam);

OracleDataAdapter da = new OracleDataAdapter(cmd);
cmd.ExecuteNonQuery();

var refcur = (OracleRefCursor)cmd.Parameters[0].Value;

여기에 누락 된 것이 있거나 Dapper가 올바르게 작동하지 않습니까?

수락 된 답변

Query<YourStrongType> (예 : Query<YourStrongType> )를 사용하여 결과에 강력한 유형을 사용하지 않으려면 Query<dynamic> 사용할 수 있습니다. 아래 코드는 작동합니다.

 IEnumerable<dynamic> results = null;
 using (var conn = new OracleConnection(ConfigurationManager.ConnectionStrings["DataConnection"].ConnectionString))
{
    var p = new OracleDynamicParameters();
    p.Add("outp ", dbType: OracleDbType.RefCursor, direction: ParameterDirection.Output);
    results = conn.Query<dynamic>("TESTPKG.TestingRefCursorsAsOutParam", p, commandType: CommandType.StoredProcedure);

    foreach (var row in results)
    {
         var fields = row as IDictionary<string, object>;
    }
}


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow