2011-11-07 12 views
1

私は、.NETアプリケーションからOracle関数を呼び出していると私はいつも次の例外を取得への呼び出しの引数のタイプ: PLS-00306を:間違った番号または呼び出しの引数の型に "ここでTF_GETNODES」PLS-00306:間違った番号または

は、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; 
} 
+0

はあなたを助けるでしょう、このようになります。 https://forums.oracle.com/forums/thread.jspa?threadID=1090421 – rie819

答えて

3

アランのように私は、ODPの専門家ではありません。しかし、私は、Oracleが関数の戻り値をPARAMETER 0としてデータ・ディクショナリに格納することを知っています。入力パラメータを使用すると、前に、戻り値を宣言し、割り当てる場合は、入力を割り当て、そう12など

あり、それがうまくいくかもしれないパラメータ。

+0

それは理由です!これは、戻り値のパラメータを最初のものとして追加するときに機能します。 – llasarov

1

私は物事の.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呼び出しの戻り値を取得する方法を調査することができます。

関連する問題