无法从 C# 执行 oracle 函数
Unable to execute oracle function from c#
我在使用 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: 请求的转换未实现或不合理
估计跟参数类型有关。我试过更改类型,使用 ExecuteScalar 而不是 ExecuteNonQuery,更改命令中参数的语法...但它们没有用。
我知道这很容易,但我现在脑筋急转弯了。
希望有人能提供帮助。
为此,您需要将参数作为 OUT 参数添加到 oracle 函数,然后像使用 ExecuteNonQuery 后所做的那样提取参数。我会将 OUT 参数添加为 F_FUNCTION_1 函数中的第一个参数。
我在使用 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: 请求的转换未实现或不合理
估计跟参数类型有关。我试过更改类型,使用 ExecuteScalar 而不是 ExecuteNonQuery,更改命令中参数的语法...但它们没有用。
我知道这很容易,但我现在脑筋急转弯了。
希望有人能提供帮助。
为此,您需要将参数作为 OUT 参数添加到 oracle 函数,然后像使用 ExecuteNonQuery 后所做的那样提取参数。我会将 OUT 参数添加为 F_FUNCTION_1 函数中的第一个参数。