2015-04-05 37 views
0

我在執行c#中的一個oracle包中的函數時出現問題。下面是我的用於打開所述連接,並執行功能的代碼:無法從c#執行oracle函數#

Decimal firstID = Decimal.Parse("2453699");// This values are just for testing 
string secondID = "12345"; 
Decimal sec = Decimal.Parse("1"); 
string estatus = "TEXT"; 

OracleConnection con = new OracleConnection(); 
con.ConnectionString = "User Id=user;Password=the_pass;Data Source=Data_Source"; 

con.Open(); 
string sql = "Package.F_FUNCTION_1"; 
OracleCommand com = new OracleCommand(sql, con); 
com.CommandType = System.Data.CommandType.StoredProcedure; 

com.Parameters.Add("returnVal", OracleDbType.Varchar2, 32767); 
com.Parameters["returnVal"].Direction = System.Data.ParameterDirection.ReturnValue; 

com.Parameters.Add("v_firstID",OracleDbType.Decimal,10); 
com.Parameters.Add("v_secondID", OracleDbType.Varchar2,200); 
com.Parameters.Add("p_sec", OracleDbType.Decimal, 3); 
com.Parameters.Add("p_estatus", OracleDbType.Varchar2,50); 

com.Parameters["v_firstID"].Value = firstID; 
com.Parameters["v_secondID"].Value = secondID; 
com.Parameters["p_sec"].Value = sec; 
com.Parameters["p_estatus"].Value = estatus; 

com.ExecuteNonQuery(); 
string val = com.Parameters["returnVal"].Value.ToString(); 
con.Close(); 

而下面是在我的包,它需要調用第二函數在同一封裝的功能:

FUNCTION F_FUNCTION_1(v_firstID IN NUMBER, 
         v_secondID IN VARCHAR2 
         ,p_sec IN NUMBER DEFAULT NULL 
         ,p_estatus IN VARCHAR2 DEFAULT NULL) 
RETURN VARCHAR2 AS 
v_Return VARCHAR2(200) := ''; 
secuencia VARCHAR2(1000) := null; 
secc  VARCHAR2(1000) := NULL; 
BEGIN 

-- Some validations 

v_Return := Package.F_FUNCTION_2(
v_secondID => v_secondID, 
P_SEC => p_sec, 
P_ESTATUS => p_estatus 
); 

return v_Return; 
END F_FUNCTION_1; 

FUNCTION F_FUNCTION_2(v_secondID IN VARCHAR2 
          ,p_sec IN NUMBER DEFAULT NULL 
          ,p_estatus IN VARCHAR2 DEFAULT NULL) 
RETURN VARCHAR2 AS 
--some variables 
v_URL   VARCHAR2(500) := NULL; 
BEGIN 

    --A lot of code here that works 

    RETURN v_URL; 
END F_FUNCTION_2; 

問題是:當我運行這段代碼,我得到的錯誤:

ORA-01460:未實現或不合理的轉換要求

我想這爲r興奮的參數類型。我嘗試過改變類型,使用ExecuteScalar而不是ExecuteNonQuery,改變了命令的參數添加語法...但它們不起作用。

我知道這很容易,但我現在有一個大腦鎖定。

希望有人能幫忙。

回答

0

爲此,您需要將一個參數作爲OUT參數添加到您的oracle函數中,然後像使用ExecuteNonQuery之後那樣提取參數。我將添加OUT參數作爲F_FUNCTION_1函數中的第一個參數。