2011-08-02 8 views
0

こんにちはODP.NET(C#)を使用してOracleパッケージ内のプロシージャにオブジェクトを渡しています。私は連想配列のためにODP.NETを使用しています。私はoracledbtype.objectをODP.NETで見つけられず、object oracledbtypeパラメータを作成できません。どのdbtype私はODP.NETを使用して.NET側のパラメータに使用する必要があります。ODP.NET(C#)を使用してOracleパッケージ内のプロシージャにオブジェクトを渡すときに使用する必要のあるDBタイプはどれですか?

  public Oracle.DataAccess.Client.OracleCommand oc = new Oracle.DataAccess.Client.OracleCommand(); 



     oc.Parameters.Add("Param1", OracleDbType.Varchar2).Value = txt_RequestId.Text; 

     //assign the array to the parm 
     Oracle.DataAccess.Client.OracleParameter additionalBusiness_AssocParm = new Oracle.DataAccess.Client.OracleParameter(); 

     // When I tried to assign parameter OracleDbType to Varchar2 it is generating an error [PLS-00306: wrong number or types of arguments in call to 'INSERT_REQUEST']. 
     // When I tried to change that value to Object. It is giving compliation error that object dbtype doesn't exist in Oracle.Data.Client.OracleDbType 
     additionalBusiness_AssocParm.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2; 
     additionalBusiness_AssocParm.CollectionType = Oracle.DataAccess.Client.OracleCollectionType.PLSQLAssociativeArray; 
     additionalBusiness_AssocParm.Direction = ParameterDirection.Input; 
     additionalBusiness_AssocParm.Value = unitId; // unitId is an array of User defined type 
     oc.Parameters.Add(additionalBusiness_AssocParm); 

     try 
     { 
      DoQueryWithODP("TEST_PKG.INSERT_UNIT", true); 
     } 
+0

これをもっと明白にするためにいくつかのコードを投稿できますか?エラーが表示されますか?もしそうなら、それは何ですか? [オブジェクト型](http://download.oracle.com/docs/html/E15167_01/featOraCommand.htm#i1007297)ですが、推測の前にあなたの側で何が起こっているのかを見たいと思います。 – Harrison

+0

あなたはtest_pkg.insert_unitの仕様とhte連想配列の定義を投稿できますか? – Harrison

答えて

0

これには必要なすべての情報が必要です。私はあなたが試みていることを実行する前に、この記事を使ってきました。

http://www.oracle.com/technetwork/issue-archive/2009/09-sep/o59odpnet-085168.html

+0

odacがインストールされたコンピュータではないので、私はサンプルを与えることができません。 – mservidio

+0

OPは** Associative **配列バインディングで、ArrayBindメソッドではありません(似ていますが同じではありません!) – Harrison

1

大丈夫、私はあなたのPL/SQLを指定せずに、この1タックルしようとするでしょうが、我々はこれがどのように機能するかがわかります。

私はサンプル話し点としてAssocArray \ AssocArray.sln \ 2.xの\%ORA_HOME%\ odp.net \サンプル@ ODPのインストールで提供されるサンプルを使用します。 しかし、このサイトにも便利です Using PL/SQL Associative Arrays


CREATE TABLE TestAssociativeArray(COL1 varchar2(20), COL2 varchar2(20)) ; 
/
create or replace PACKAGE MyTestAssociativeArray AS 
    TYPE AssocArrayVarchar2_t is table of VARCHAR(20) index by BINARY_INTEGER; 
    PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type , 
          Param2 IN AssocArrayVarchar2_t); 
END MyTestAssociativeArray ; 
/
create or replace package body MyTestAssociativeArray as 
    PROCEDURE TestVarchar2(Param1 IN TestAssociativeArray.COL1%type , 
          Param2 IN AssocArrayVarchar2_t) 
    AS 
    i INTEGER ; 
    BEGIN 
     FOR i in Param2.first..Param2.last LOOP 
      insert into TestAssociativeArray(col1, col2) 
         values (Param1 , Param2(i)) ; 
     END LOOP ; 
    END TestVarchar2 ; 
END MyTestAssociativeArray ; 
/

(その記事を約 ArrayBindない 連想配列たwherasこれは、mservidioが提供する記事内のリンクのオフに実際にあります)

.netコード:

static void Main(string[] args) 
{ 
    // Connect 
    string connectStr = getConnection(); 

    // Setup the Tables for sample 

    OracleConnection connection = new OracleConnection(connectStr); 
    OracleCommand cmd = new OracleCommand("MyTestAssociativeArray.TestVarchar2", connection); 
    cmd.CommandType = CommandType.StoredProcedure ; 

    OracleParameter param1 = cmd.Parameters.Add("param1", OracleDbType.Varchar2); 
    OracleParameter param2 = cmd.Parameters.Add("param2", OracleDbType.Varchar2); 

    // Setup the direction 
    param1.Direction = ParameterDirection.Input; 
    param2.Direction = ParameterDirection.Input; 

    // Specify that we are binding PL/SQL Associative Array 
    param2.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

    param1.Value = "ConstantValue" ; 
    param2.Value = new string[3]{"Val1", 
           "Val2", 
           "Val3"}; 


    try 
    { 
    connection.Open(); 
    cmd.ExecuteNonQuery(); 
    } 
    catch (Exception e) 
    { 
    Console.WriteLine(e.Message); 
    } 

} 

、あなたのスペックを投稿していないので、(クリーンアップ付き)の結果は

select * from TestAssociativeArray 
/
COL1     COL2     
-------------------- -------------------- 
ConstantValue  Val1     
ConstantValue  Val2     
ConstantValue  Val3 
/** --clean up 
drop package MyTestAssociativeArray; 
drop table TestAssociativeArray ; 
**/ 

しかし、それはのような単純なものになることがあります。 が必要:

cmd.BindByName = true; 

since ODP by default binds by position AND not by name(この

関連する問題