2015-04-05 68 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函数中的第一个参数。