我从.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;
}
解决方案
像阿伦,我不是一个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.