sql >> データベース >  >> RDS >> Oracle

C#2010、ODP.net、配列を渡すストアドプロシージャを呼び出す

    (簡単な方法)から始めることができます:

    List<int> idList = yourObjectList;
    List<int> nameList = yourObjectList;
    
    using (OracleConnection oraconn = new OracleConnection())
    {
        oraconn.ConnectionString = "Your_Connection_string";
    
        using (OracleCommand oracmd = new OracleCommand())
        {
            oracmd.Connection = oraconn;
    
            oracmd.CommandType = CommandType.StoredProcedure;
            oracmd.CommandText = "Your_Procedura_name";
            oraconn.Open();
    
            // To use ArrayBinding, you need to set ArrayBindCount   
            oracmd.BindByName = true;
            oracmd.ArrayBindCount = idList.Count;
    
            // Instead of single values, we pass arrays of values as parameters   
            oracmd.Parameters.Add("ids", OracleDbType.Int32, oyourObjectList.ToArray(), ParameterDirection.Input);
            oracmd.Parameters.Add("names", OracleDbType.Varchar2, oyourObjectList.ToArray(), ParameterDirection.Input);
    
            oracmd.ExecuteNonQuery();
            oraconn.Close();
        }
    }
    

    次に、dbにパッケージ/プロシージャを追加します:

    PROCEDURE Your_Procedure_name(
          name IN VARCHAR2,
          id IN NUMBER
          )    IS     
    BEGIN
    
        INSERT INTO your_table VALUES( id, name);
    END Your_Procedure_name;
    

    別のオプションは次のとおりです:

    using (OracleConnection oraconn = new OracleConnection())
    {
        oraconn.ConnectionString = "Your_Connection_string";
    
        using (OracleCommand cmd = new OracleCommand())
        {
    
            cmd.Connection = oraconn;
    
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "Your_Procedure_name";
            oraconn.Open();
    
    
            OracleParameter idParam = new OracleParameter("i_idList", OracleDbType.Int32, ParameterDirection.Input);
            idParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            idParam.Value = idList.ToArray();
            idParam.Size = idList.Count;
    
            OracleParameter nameParam = new OracleParameter("i_nameList", OracleDbType.Varchar2, ParameterDirection.Input);
            nameParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
            nameParam.Value = nameList.ToArray();
            nameParam.Size = nameList.Count;
    
            // You need this param for output
            cmd.Parameters.Add("ret", OracleDbType.RefCursor).Direction = ParameterDirection.Output;
            cmd.Parameters.Add(idParam);
            cmd.Parameters.Add(nameParam);
    
            conn.Open();
    
            //If you need to read results ...
            using (OracleDataReader dr = cmd.ExecuteReader())
            {
                while (dr.Read())
                {
                    ...
                }
            }
            conn.Close();
        }
    }
    

    ただし、

    のように、ストアドプロシージャに新しい型を定義する必要があるため、より複雑になります。
    TYPE integer_list IS TABLE OF Your_table.id_column%TYPE INDEX BY BINARY_INTEGER;
    // same for names
    

    のようなスキーマレベルのタイプを作成します
    create or replace TYPE T_ID_TABLE is table of number; 
    

    そして、

    のようにストアドプロシージャでそれらを使用します
    PROCEDURE Your_Procedure_name(
          v_ret IN OUT SYS_REFCURSOR,
          i_idList integer_list,
          i_nameList string_list)
      IS  
      begin
        -- Store passed object id list to array
     idList T_ID_TABLE := T_ID_TABLE(); 
      ...
      begin
    
        -- Store passed object id list to array
        idList.Extend(i_idList.Count);
        FOR i in i_idList.first..i_idList.last loop
         idList(i) := i_idList(i);
        END LOOP;    
    
        ...
    END Your_Procedure_name;
    



    1. 非正規化された列を個別のレコードに選択しますか?

    2. INDEXを使用する理由と場所-長所と短所

    3. MySQL-ORDERDESCが機能しないGROUPBY

    4. CASEを使用して複数の列を選択するMySQLクエリ