2016-10-05 31 views
1

バルク挿入を処理するために配列をOracleストアドプロシージャにパラメータとして送信しようとしています。配列にパラメータを渡してOracleからストアドプロシージャをc#からバルク挿入に

type Licensingentity_id is table of odilic_admin.licensingentity.licensingentity_id%type index by pls_integer; 
type Nationalprovidernumber is table of odilic_admin.licensingentity.nationalprovidernumber%type index by pls_integer; 
type Home_state_province_id is table of odilic_admin.licensingentity.home_state_province_id%type index by pls_integer; 

procedure HomeStateLookup_bulk_insert(i_entityId in Licensingentity_id, 
             i_npn   in Nationalprovidernumber, 
             i_homeStateId in Home_state_province_id)  is 
    v_caller varchar2(60) := 'System_Scheduler'; 
begin 
    FORALL i IN 1 .. i_entityId.count 
    insert into home_state_lookup_stg 
     (licensingentity_id, 
     npn, 
     home_state_province_id, 
     isprocessed, 
     inserted_by, 
     inserted_date, 
     updated_by, 
     updated_date) 
    values 
     (i_entityId(i), 
     i_npn(i), 
     i_homeStateId(i), 
     0, 
     v_caller, 
     sysdate, 
     v_caller, 
     sysdate); 

end HomeStateLookup_bulk_insert; 

、ここでのC#コードは

NiprConnectionString = ConfigurationManager.ConnectionStrings["ODI.NIPR.DB.Reader"].ConnectionString; 
     OracleConnection cnn = new OracleConnection(NiprConnectionString); 
     cnn.Open(); 
     OracleCommand cmd = cnn.CreateCommand(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = NaicStateLookupRepositoryProcedures.HOME_STATE_BULK_INSERT; 
     cmd.BindByName = true; 
     cmd.ArrayBindCount = entities.Count; 

     var i_entityId = new OracleParameter(); 
     var i_npn = new OracleParameter(); 
     var i_homeStateId = new OracleParameter(); 

     i_entityId.OracleDbType = OracleDbType.Int32; 
     i_npn.OracleDbType = OracleDbType.Varchar2; 
     i_homeStateId.OracleDbType = OracleDbType.Int32; 

     i_entityId.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     i_npn.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 
     i_homeStateId.CollectionType = OracleCollectionType.PLSQLAssociativeArray; 

     i_entityId.Value = entities.Select(c => c.Key).ToArray(); 
     i_npn.Value = entities.Select(c => c.Value.Item1).ToArray(); 
     i_homeStateId.Value = entities.Select(c => c.Value.Item2).ToArray(); 

     i_entityId.Size = entities.Count; 
     i_npn.Size = entities.Count; 
     i_homeStateId.Size = entities.Count; 

     cmd.Parameters.Add(i_entityId); 
     //cmd.Parameters[0].Value = i_entityId; 

     cmd.Parameters.Add(i_npn); 
     //cmd.Parameters[1].Value = i_npn; 

     cmd.Parameters.Add(i_homeStateId); 
     //cmd.Parameters[2].Value = i_homeStateId; 
     int result = cmd.ExecuteNonQuery(); 

しかし例外なって -

ORA-06550:行1、列52:PLS-00103:シンボルが発生しました「を> " 次のいずれかが必要な場合

() - + case mod新しいnot null

何か助けていただければ幸いです。

答えて

0

私はこれが答えです約束することはできない、と私はあなたが自分のためにこれをテストするために参照するテーブルを持っていないが、一見私はあなたが設定気づい:

cmd.BindByName = true; 

をそのように、I

var i_entityId = new OracleParameter("i_entityId"); 
var i_npn = new OracleParameter("i_npn"); 
var i_homeStateId = new OracleParameter("i_homeStateId"); 

は私がプロシージャにパラメータとして配列を渡されたことがありませんが、あなたは、通常の挿入でこれを行うとしたら、それはこのようになります:あなたはパラメータ名を宣言する必要があると思う

string sql = "insert into foo values (:boo, :bar, :baz)"; 

OracleCommand cmd = new OracleCommand(sql, conn); 
cmd.Parameters.Add(new OracleParameter("boo", OracleDbType.Varchar2)); 
cmd.Parameters.Add(new OracleParameter("bar", OracleDbType.Date)); 
cmd.Parameters.Add(new OracleParameter("baz", OracleDbType.Varchar2)); 

cmd.Parameters[0].Value = booArray; 
cmd.Parameters[1].Value = barArray; 
cmd.Parameters[2].Value = bazArray; 

cmd.ArrayBindCount = booArray.Length; 

cmd.ExecuteNonQuery(); 

しかし、パラメータ名でパラメータを定義することから始めます。

関連する問題