我有一个简单的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:
  声明被忽略

最佳答案

正如我在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);

09-10 00:45
查看更多