Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net PLS-00306:调用中参数的数量或类型错误_.net_Oracle_Odp.net - Fatal编程技术网

.net PLS-00306:调用中参数的数量或类型错误

.net PLS-00306:调用中参数的数量或类型错误,.net,oracle,odp.net,.net,Oracle,Odp.net,我从.NET应用程序调用Oracle函数时,总是会遇到以下异常: PLS-00306:调用“TF_GETNODES”时参数的数量或类型错误 以下是Oracle函数的定义: FUNCTION "IMPACTNET"."TF_GETNODES" ( DIMENSIONKEY IN NVARCHAR2, PARENTNODE IN NVARCHAR2, PARASTRING IN NVARCHAR2 ) RETURN IMPACTNET.TREE_NODE_TAB

我从.NET应用程序调用Oracle函数时,总是会遇到以下异常: PLS-00306:调用“TF_GETNODES”时参数的数量或类型错误

以下是Oracle函数的定义:

FUNCTION "IMPACTNET"."TF_GETNODES"
(
    DIMENSIONKEY  IN NVARCHAR2,
    PARENTNODE    IN NVARCHAR2,
    PARASTRING    IN NVARCHAR2
) RETURN IMPACTNET.TREE_NODE_TABLE IS

    treeNodes IMPACTNET.TREE_NODE_TABLE;

BEGIN

    treeNodes:=IMPACTNET.TREE_NODE_TABLE();
    for i in 1..2
    loop
    treeNodes.extend;
    treeNodes(i) := IMPACTNET.TREE_NODE(DIMENSIONKEY || i, PARENTNODE || i, 0, 0, PARASTRING || i, 0);
    end loop;

    RETURN treeNodes;

END;
这是我的.NET代码:

var treeNodes = new TreeNodesTable();

using (var connection = CreateConnection())
using (var command = new OracleCommand { Connection = connection, CommandType = CommandType.StoredProcedure, CommandText = "IMPACTNET.TF_GETNODES" })
{
    command.Parameters.Add("DIMENSIONKEY", OracleDbType.NVarchar2, ParameterDirection.Input).Value = "dimension key";
    command.Parameters.Add("PARENTNODE",   OracleDbType.NVarchar2, ParameterDirection.Input).Value = "parent node";
    command.Parameters.Add("PARASTRING",   OracleDbType.NVarchar2, ParameterDirection.Input).Value = "para string";

    var p1 = new OracleParameter
    {
        ParameterName = "treeNodes",
        OracleDbType = OracleDbType.Object,
        UdtTypeName = "IMPACTNET.TREE_NODE_TABLE",
        Direction = ParameterDirection.ReturnValue,
        Value = treeNodes
    };
    command.Parameters.Add(p1);

    connection.Open();
    command.ExecuteNonQuery();

    treeNodes = (TreeNodesTable)p1.Value;
}

我不是.NET方面的专家,但在我看来,您将UDT设置为一个参数,而不是一个返回值。尝试删除函数并用以下过程替换它:

PROCEDURE "IMPACTNET"."TF_GETNODES"
(
    DIMENSIONKEY  IN  NVARCHAR2,
    PARENTNODE    IN  NVARCHAR2,
    PARASTRING    IN  NVARCHAR2,
    treeNodes     OUT IMPACTNET.TREE_NODE_TABLE
) IS
BEGIN
    treeNodes:=IMPACTNET.TREE_NODE_TABLE();
    for i in 1..2 loop
       treeNodes.extend;
       treeNodes(i) := IMPACTNET.TREE_NODE(DIMENSIONKEY || i, 
                                           PARENTNODE || i, 
                                           0, 
                                           0, 
                                           PARASTRING || i, 
                                           0);
    end loop;
END;
/

如果有效,您可以保持原样,或者研究如何在.NET调用中获取返回值。

我不是.NET方面的专家,但在我看来,您将UDT设置为一个参数,而不是一个返回值。尝试删除函数并用以下过程替换它:

PROCEDURE "IMPACTNET"."TF_GETNODES"
(
    DIMENSIONKEY  IN  NVARCHAR2,
    PARENTNODE    IN  NVARCHAR2,
    PARASTRING    IN  NVARCHAR2,
    treeNodes     OUT IMPACTNET.TREE_NODE_TABLE
) IS
BEGIN
    treeNodes:=IMPACTNET.TREE_NODE_TABLE();
    for i in 1..2 loop
       treeNodes.extend;
       treeNodes(i) := IMPACTNET.TREE_NODE(DIMENSIONKEY || i, 
                                           PARENTNODE || i, 
                                           0, 
                                           0, 
                                           PARASTRING || i, 
                                           0);
    end loop;
END;
/

如果这样做有效,您可以保持原样,或者研究如何在.NET调用中获取返回值。

就像Allan一样,我不是ODP专家。但是,我知道Oracle将函数的返回值作为参数
0
存储在数据字典中。输入参数为
1
2


因此,如果在分配输入参数之前声明并分配返回值,它可能会起作用。

像Allan一样,我不是ODP专家。但是,我知道Oracle将函数的返回值作为参数
0
存储在数据字典中。输入参数为
1
2


因此,如果在分配输入参数之前声明并分配返回值,它可能会起作用。

看起来这会对您有所帮助。看来这对你有帮助。这就是原因!当我将返回值参数作为第一个参数添加时,它就工作了。这就是原因!当我将返回值参数作为第一个参数添加时,它就起作用了。