我遇到了与此帖中所述相同的问题:
Executing Oracle function and getting back a return value
我可以在我的Toad客户端成功完成此操作:
declare result varchar2(30);
BEGIN
result:=WEBUSER.F_UpdateParticipant(json input_goes here);
dbms_output.put_line(result);
END;
并获取dbms_output中显示的返回值。 该函数返回:
{"Success":true}
或
{"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();
AND
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的方式来做这些类型的查询。
答案 0 :(得分:0)
我之前看过上一篇文章时曾尝试过。但是,当我编写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;
}