2016-01-31 37 views
0

我正在使用NPoco ORM并尝试从Oracle函数中获取结果。我曾尝试:执行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; 
+0

您尝试过'从双重'选择PKG_SOMEPACKAGE.SET_DATA(@ p_param1,@ p_param2)吗? – Stawros

+0

也不起作用 –

回答

0

请确保您已通过运行函数执行工作的SQL语句在oracle客户端。比有可能修改你的代码。如果即使这样做不仅仅是运行一些databaze分析器(例如mssql有数据库分析器)来查看应用程序实际发送到oracle服务器的sql语句。

1

我以前曾尝试过,但是,当我编写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 = [email protected]"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; 
}