2016-01-31 68 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; 
}