PLS-00306:调用oracle函数时参数的数量或类型错误

时间:2018-12-18 04:33:09

标签: c# oracle function

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

2 个答案:

答案 0 :(得分:2)

来自文档

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/odpnt/featOraCommand.html#GUID-4D32E59C-1BC0-4567-994E-B0EF3D61D3C4

按位置(默认)绑定到函数时,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);