执行 Oracle 函数并返回返回值
本文关键字:返回 返回值 函数 Oracle 执行 | 更新日期: 2023-09-27 18:32:47
我正在使用NPoco ORM并试图从Oracle函数中获取结果。我试过:
public string GetData(int param1, int param2)
{
var command = "PKG_SOMEPACKAGE.SET_DATA( @p_param1, @p_param2);";
var sql = Sql.Builder.Append(command, new { p_param1 = 10, p_param2 = 20 });
string result = this.Db.ExecuteScalar<string>(sql);
return result;
}
但它不起作用并返回ORA-00900: invalid SQL statement
Oracle 函数如下所示:
function SET_DATA
(
p_param1 IN NUMBER,
p_param2 IN NUMBER
) return varchar2 IS
BEGIN
IF some condition is true THEN
RETURN 'Y';
END IF;
-- some logic
RETURN 'N';
END;
我以前尝试过这样,但是,当我编写 SQL 时,我包含一个包装版本,这就是导致我的异常的原因,包装的 sql。如果 SQL 像下面这样编写,它可以完美地工作。在此调用中,我将 JSON 数据发送到函数并获取结果。
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;
}
通过在 oracle 客户端中运行函数执行来确保具有有效的 SQL 语句。而不是潜在地修改您的代码。如果即使这样也不起作用,那么只需运行一些 databaze 分析器(例如 mssql 有数据库分析器)以查看您的应用程序实际发送到您的 oracle 服务器的 sql 语句。