Получение возврата из функции Oracle

Я столкнулся с той же проблемой, что описана в этом сообщении:
Выполнение функции Oracle и получение возвращаемого значения

Я могу сделать это в своем клиенте Toad успешно:

declare result varchar2(30);
BEGIN 
  result:=WEBUSER.F_UpdateParticipant(json input_goes here);
  dbms_output.put_line(result); 
END;

и получите возвращаемое значение, показанное в dbms_output. Эта функция возвращает:

{"Success":true} 

or

{"Success":false} 

Но я не могу вернуть результат в Petapoco. Я также пытался использовать выходные параметры следующим образом:

var result = new Oracle.ManagedDataAccess.Client.OracleParameter("result",Oracle.ManagedDataAccess.Client.OracleDbType.Varchar2, System.Data.ParameterDirection.Output);
var sql = "DECLARE result VARCHAR2(30);" + 
          "BEGIN "+
          "    @0:=WEBUSER.F_UpdateParticipant(@1);" +
          "END;";
_db.db.Execute(sql, result, json);
res = result.ToString();

И

var result = new Oracle.ManagedDataAccess.Client.OracleParameter("result",Oracle.ManagedDataAccess.Client.OracleDbType.Varchar2, System.Data.ParameterDirection.Output);
var sql = "DECLARE result VARCHAR2(30);" + 
          "BEGIN "+
          "    @result:=WEBUSER.F_UpdateParticipant(@1);" +
          "END;";
_db.db.Execute(sql, result, json);
res = result.ToString();

Да, использовал Execute и ExecuteScalar с одинаковыми результатами. Эта функция выполняет как вставку, так и обновление, поэтому я НЕ МОГУ выполнять SELECT WEBUSER.F_UpdateParticipant(json input_goes here) from DUAL; здесь, потому что получу исключение cannot perform a DML operation inside a query. Я действительно не хочу возвращаться к способу ADO для выполнения таких типов запросов.


person MB34    schedule 25.08.2016    source источник


Ответы (1)


Я пробовал это раньше, глядя на мой предыдущий пост. Однако, когда я писал SQL, я включил обернутую версию, и именно это вызвало исключение, обернутый sql. Если SQL написан так, как показано ниже, он работает отлично.

public string UpdateParticipant(ParticipantUpdate Participant)
{
    string ret = "";
    IsoDateTimeConverter dt = new IsoDateTimeConverter();
    dt.DateTimeFormat = "MM-dd-yyyy"; // we must have this format for our dates
    string json = JsonConvert.SerializeObject(Participant, dt);
    // Creating this output parameter is the key to getting the info back.
    var result = new OracleParameter
    {
        ParameterName = "RESULT",
        Direction = System.Data.ParameterDirection.InputOutput,
        Size = 100,
        OracleDbType = OracleDbType.Varchar2
    };
    // Now, setting the SQL like this using the result as the output parameter is what does the job.
    string sql = $@"DECLARE result varchar2(1000); BEGIN  @0 := WEBUSER.F_UpdateParticipant(@1); END;";
    var res = _db.db.Execute(sql, result, json);

    // Now return the value of the Output parameter!!

    ret = result.Value.ToString();
    return ret;
}
person MB34    schedule 08.09.2016