【发布时间】:2014-07-16 04:10:06
【问题描述】:
我在 C# 中使用 Oracle.DataAccess 库执行 Oracle 存储过程时遇到问题。
在 oracle 中我有这个结构;
CREATE OR REPLACE TYPE O_MOV_LST_STA_STATUS AS TABLE OF O_MOV_STATION_STATUS;o_mov_lst_sta_status
并且类型描述如下:
CREATE OR REPLACE TYPE O_MOV_STATION_STATUS AS OBJECT
(
StationT NUMBER(10),
StationN NUMBER(10),
Stat NUMBER(3),
Loaded NUMBER(1),
Capacity NUMBER(10),
CurrentCount NUMBER(10),
Box NUMBER(10)
);
以及程序定义:
PROCEDURE UPDATE_STATIONS(pn_warehouse_id_in IN wms_warehouse.warehouse_id%TYPE,
prl_sta_status_in IN o_mov_lst_sta_status,
pn_error_code_out OUT NUMBER,
pv_error_text_out OUT NOCOPY VARCHAR2);
在 C# 中的代码是这样的:
public struct O_Mov_Station_Status
{
public decimal StationT;// NUMBER(10),
public decimal StationN;// NUMBER(10),
public decimal Stat;// NUMBER(3),
public decimal Loaded;// NUMBER(1),
public decimal Capacity;// NUMBER(10),
public decimal CurrentCount;// NUMBER(10),
public decimal Box;// NUMBER(10)
}
public struct Lst_O_Mov_Station_Status
{
public IList<O_Mov_Station_Status> Lst_Station_Status;
}
... Initializing vars and objects ...
OracleCommand cmd = new OracleCommand("MyPackage.UPDATE_STATIONS", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
//Oracle Parameter
OracleParameter objParam = new OracleParameter();
objParam = new OracleParameter("PN_WAREHOUSE_ID_IN", OracleDbType.Decimal);
objParam.Direction = System.Data.ParameterDirection.Input;
objParam.Value = 20000;
cmd.Parameters.Add(objParam);
objParam.Dispose();
objParam = new OracleParameter("prl_sta_status_in", OracleDbType.Object);
objParam.OracleDbType = OracleDbType.Object;
objParam.CollectionType = OracleCollectionType.PLSQLAssociativeArray;
objParam.Direction = System.Data.ParameterDirection.Input;
objParam.UdtTypeName = "O_MOV_STATION_STATUS";
objParam.Value = lSS;
objParam.DbType = System.Data.DbType.Object;
cmd.Parameters.Add(objParam);
objParam.Dispose();
objParam = new OracleParameter("PN_ERROR_CODE_OUT", OracleDbType.Decimal);
objParam.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(objParam);
objParam.Dispose();
objParam = new OracleParameter("PV_ERROR_TEXT_OUT", OracleDbType.Varchar2);
objParam.Direction = System.Data.ParameterDirection.Output;
cmd.Parameters.Add(objParam);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
执行 ExecuteNonQuery() 后,我收到此错误:OracleParameter.Value is not valid.
每个人都知道如何将这个列表作为存储过程的参数发送?
请注意,我需要的列表是 Oracle 中的自定义类型表
非常感谢。
问候。
【问题讨论】:
标签: c# oracle stored-procedures