PLS-00306: неверный номер или типы аргументов в вызове - PullRequest
1 голос
/ 07 ноября 2011

Я вызываю функцию Oracle из приложения .NET и всегда получаю следующее исключение: 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;
}

Ответы [ 2 ]

3 голосов
/ 08 ноября 2011

Как и Аллан, я не эксперт в ODP. Однако я знаю, что Oracle хранит возвращаемое значение функции как PARAMETER 0 в Словаре данных. Входные параметры: 1, 2 и т. Д.

Итак, если вы объявляете и присваиваете возвращаемое значение до , вы назначаете входные параметры, которые могут работать.

1 голос
/ 07 ноября 2011

Я не эксперт в области .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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...