我有一个简单的oracle函数,如下所示
create or replace function get_area(
mem_id IN VARCHAR2,
P_date DATE DEFAULT SYSDATE)
RETURN NUMBER
IS
v_area_id NUMBER;
BEGIN
v_area_id := 0;
RETURN v_area_id ;
end;
(具有测试功能,因此只需分配0并返回变量即可)
我们在C#中的调用方式如下
ora_con.Open();
OracleCommand cmd = ora_con.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = ora_con;
cmd.CommandText = "schema.get_area";
OracleParameter mem_id = new OracleParameter();
mem_id.OracleDbType = OracleDbType.Varchar2;
mem_id.Direction = ParameterDirection.Input;
mem_id.Value = m_id1;
OracleParameter P_date = new OracleParameter();
P_date.OracleDbType = OracleDbType.Date;
P_date.Direction = ParameterDirection.Input;
P_date.Value = DateTime.Now;
OracleParameter v_area_id = new OracleParameter();
v_area_id.OracleDbType = OracleDbType.Int64;
v_area_id.Direction = ParameterDirection.ReturnValue;
v_area_id.Size = 1000;
cmd.Parameters.Add(mem_id);
cmd.Parameters.Add(P_date);
cmd.Parameters.Add(v_area_id);
cmd.ExecuteNonQuery();
area_id = Convert.ToInt64(cmd.Parameters["v_area_id"].Value);
在执行相同操作时出现以下错误
ORA-06550:第1行,第15列:PLS-00306:错误的编号或类型 调用'GET_AREA'ORA-06550的参数:第1行,第7列:PL / SQL: 声明被忽略
答案 0 :(得分:2)
来自文档
按位置(默认)绑定到函数时,ODP.NET希望返回值首先绑定,然后再绑定其他任何参数。
因此将您的返回值参数移到列表中的第一个参数。
答案 1 :(得分:2)
正如我在this similar issue中所读到的那样,可能是由于错误的顺序声明了参数,因为Oracle将返回值存储为参数列表内的索引0,而输入参数也紧随其后。
尝试调整参数顺序,以便首先分配返回值,因为mem_id
的类型为VARCHAR2
,并且与NUMBER
的类型不兼容:
cmd.Parameters.Add(v_area_id); // this should be added first
cmd.Parameters.Add(mem_id);
cmd.Parameters.Add(P_date);