PLS-00306:错号码或在调用的参数类型号码、参数、类型、PLS

2023-09-04 22:33:45 作者:一个人的青春战役

我从.NET应用程序调用一个Oracle的功能,我总是得到以下情况例外:   PLS-00306:错号码或类型的调用TF_GETNODES

参数

下面是Oracle函数的定义:

 功能IMPACTNET。TF_GETNODES
(
    DIMENSIONKEY在NVARCHAR2,
    PARENTNODE在NVARCHAR2,
    PARASTRING在NVARCHAR2
)RETURN IMPACTNET.TREE_NODE_TABLE IS

    树节点IMPACTNET.TREE_NODE_TABLE;

开始

    树节点:= IMPACTNET.TREE_NODE_TABLE();
    因为我在1..2
    循环
    treeNodes.extend;
    树节点(ⅰ):= IMPACTNET.TREE_NODE(DIMENSIONKEY || I,PARENTNODE || I,0,0,PARASTRING || I,0);
    结束循环;

    返回树节点;

结束;
 

这里是我的。NET code:

  VAR树节点=新TreeNodesTable();

使用(VAR连接=创建连接())
使用(VAR命令=新的OracleCommand {连接=连接的CommandType = CommandType.StoredProcedure,的CommandText =IMPACTNET.TF_GETNODES})
{
    command.Parameters.Add(DIMENSIONKEY,OracleDbType.NVarchar2,ParameterDirection.Input).value的=维度键;
    command.Parameters.Add(PARENTNODE,OracleDbType.NVarchar2,ParameterDirection.Input).value的=父节点;
    command.Parameters.Add(PARASTRING,OracleDbType.NVarchar2,ParameterDirection.Input).value的=对字符串;

    VAR P1 =新的OracleParameter
    {
        参数名称=树节点,
        OracleDbType = OracleDbType.Object,
        UdtTypeName =IMPACTNET.TREE_NODE_TABLE
        方向= ParameterDirection.ReturnValue,
        值=树节点
    };
    command.Parameters.Add(p1)为;

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

    树节点=(TreeNodesTable)p1.Value;
}
 
excel COUNT函数使用方法或COUNT函数怎么用

解决方案

像阿伦,我不是一个ODP专家。但是,我知道,甲骨文存储函数参数 0 在数据字典中的返回值。输入参数是 1 2 等。

所以,如果你声明并指定返回值的 的分配前的输入参数它可能工作。

I'm invoking an Oracle function from a .NET application and I always get following exception: PLS-00306: wrong number or types of arguments in call to 'TF_GETNODES'

Here is the definition of the Oracle function:

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;

And here is my .NET code:

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;
}

解决方案

Like Allan I'm not an ODP expert. However, I do know that Oracle stores the return value of a function as PARAMETER 0 in the Data Dictionary. The input parameters are 1, 2, etc.

So, if you declare and assign the return value before you assign the input parameters it might work.