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

Posted

技术标签:

【中文标题】PLS-00306:调用 oracle 函数时参数的数量或类型错误【英文标题】:PLS-00306: wrong number or types of arguments when calling oracle function 【发布时间】:2018-12-18 04:33:09 【问题描述】:

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

【问题讨论】:

类似问题:***.com/questions/8040115/… - 尝试将返回值参数声明为参数顺序中的第一个参数。 【参考方案1】:

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

【讨论】:

【参考方案2】:

来自文档

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

当按位置(默认)绑定到函数时,ODP.NET 期望在任何其他参数之前首先绑定返回值。

所以将您的返回值参数移动到列表中的第一个。

【讨论】:

以上是关于PLS-00306:调用 oracle 函数时参数的数量或类型错误的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00306:调用“ADD_MONTHS”时参数的数量或类型错误

ORA-06550,PLS-00306;向 Oracle 过程插入数据时出错

PLS-00306:调用 'GET_LINE' 时参数的数量或类型错误。在 PL/SQL 中的函数中传递字符串参数时出现此错误

无法使用记录类型输入参数调用函数 (PLS-00306/00382)

Oracle 存储过程不工作 PLS-00306

PLS-00306:调用“ABCINPUT”时参数的数量或类型错误