the following is my experence about using C# + Oracle10g for batch import records into databse:
===Code ================================================
c#-> test.aspx.cs
using ODP = Oracle.DataAccess.Client;
private void ExecuteQuery()
{
//create a parameter supporing multiple records update into database
ODP.OracleParameter parameter = new ODP.OracleParameter
{
ParameterName = parameterName,
Direction = direction
};
if (dbType == DbType.String && isClob == true)
{
parameter.OracleDbType = ODP.OracleDbType.NVarchar2;
}
else
{
parameter.DbType = dbType;
}
if (isCollectionType == true)
{
parameter.CollectionType = ODP.OracleCollectionType.PLSQLAssociativeArray;
parameter.Value = obj;
}
else
{
parameter.Value = obj ?? DBNull.Value;
}
ODP.OracleCommand cmd = new ODP.OracleCommand();
cmd.parameters.add(parameter);
//.set cmd execute style (storedprocedure/ sql), set storedprocedure name..
//:TODO
//...
///
cmd.ExecuteQuery();
}
===package======================================================
CREATE OR REPLACE PACKAGE PKG_AW_POINT IS
TYPE TP_RLT_TBL IS REF CURSOR;
--a templete sql to define a type of one column in the table
--TYPE {0:type name} IS TABLE OF {1:table name}.{2:column name}%TYPE INDEX BY PLS_INTEGER;
TYPE TP_PIDS IS TABLE OF T_AW_PLAN.ID%TYPE INDEX BY PLS_INTEGER;
TYPE TP_USERID IS TABLE OF T_AW_USER_POINT_UPLOAD.USERID%TYPE INDEX BY PLS_INTEGER;
PROCEDURE PROC_INS_POINT_AGN(V_USERID VARCHAR2,
V_ROLE NUMBER,
V_TYPE NUMBER,
V_POINT NUMBER,
V_REASONID TP_PIDS,
V_CREATED_USERID VARCHAR2,
V_CREATED_DATE DATE,
V_GROUPID NUMBER,
V_AGENTGROUPID NUMBER);
END;
===package body======================================================
CREATE OR REPLACE PACKAGE BODY PKG_AW_POINT IS
--INSERT TEMP POINT ASSIGN ITEMS
PROCEDURE PROC_INS_POINT_AGN(V_USERID VARCHAR2,
V_ROLE NUMBER,
V_TYPE NUMBER,
V_POINT NUMBER,
V_REASONID TP_PIDS,
V_CREATED_USERID VARCHAR2,
V_CREATED_DATE DATE,
V_GROUPID NUMBER,
V_AGENTGROUPID NUMBER) IS
BEGIN
--LOCK THE USERID ROW IN T_AW_ASSIGNABLE_POINT_SUMM
SELECT S.USERID
INTO P_TEMP_USERID
FROM T_AW_ASSIGNABLE_POINT_SUMM S
WHERE S.USERID = V_CREATED_USERID
FOR UPDATE;
--UPDATE USEDPOINT
UPDATE T_AW_ASSIGNABLE_POINT_SUMM T
SET T.USEDPOINT = T.USEDPOINT + V_POINT
WHERE T.USERID = V_CREATED_USERID
AND T.POINT >= T.USEDPOINT + V_POINT;
P_AFFECTEDROW := SQL%ROWCOUNT;
--COMMIT;
--batch insert data
FORALL i IN V_REASONID.FIRST .. V_REASONID.LAST
INSERT INTO T_AW_USER_POINT_REASON P
SELECT SEQ_AW_REASON_ID.NEXTVAL AS ID,
P_ASSIGNID,
PNT.ID AS CATEGORYID,
SUB.ID AS REASONID,
PNT.PLAN AS CATEGORY,
SUB.PLAN AS REASON
FROM T_AW_PLAN SUB, T_AW_PLAN PNT
WHERE SUB.PARENT = PNT.ID
AND SUB.ID = V_REASONID(i);
END;
END;
the function should be use the DataAccess dll owned by Oracle, can be successfully use in the environment of VS2010+Oracle10g.