日期:2014-05-17  浏览次数:20622 次

求助,Oracle数据库中数据参数传递问题
背景:数据库采用ORACLE
在数据访问层
Oracle.DataAccess.Client.OracleParameter pram1 = new Oracle.DataAccess.Client.OracleParameter("p_cursor",Oracle.DataAccess.Client.OracleDbType.RefCursor);
pram1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(pram1);

这里的时候取出的参数是输出是没有问题的



问题是:如何输入时能够把一个集合当输入参数传递给ORACLE的存储过程?以下代码出错提示是参数传递错误。
有经验的朋友们们给点建议,如何我能把一个DataTable集合做为一个传递参数给这个存储过程
代码简单的略写为以下:

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
OracleTransaction txn = conn.BeginTransaction(IsolationLevel.ReadCommitted);
cmd.Transaction = txn;
cmd.CommandText = @"p_insert_dataset_l1";
cmd.CommandType = CommandType.StoredProcedure;
OracleParameter pTable = new OracleParameter("ds_insert", OracleDbType.RefCursor);
pTable.Value = dt;  //----这里,组合了一个有行和列的DataTable,并且有内容,传递进入
cmd.Parameters.Add(pTable);
cmd.ExecuteNonQuery();
txn.Commit();
txn.Dispose();
cmd.Dispose();

------解决方案--------------------
你可以把DataTable集合序列化为XML,以XML字符串的方式传递给存储过程

然后再数据库中可以解析XML
------解决方案--------------------
引用:
你可以把DataTable集合序列化为XML,以XML字符串的方式传递给存储过程

然后再数据库中可以解析XML

同意。传xml字符串
oracle 解析xml字符串
参考http://blog.sina.com.cn/s/blog_a539013401015tdb.html
------解决方案--------------------
引用:
楼上的意思我也考虑过,但不管是在数据库中做字符串拼接或者解析或者在程序中做拼接解析,其实都是需要花不少的时间去解析的。这样的效率和一条条往数据库里去插入或者增加事务一千条一千条提交的速度是一样的。没有达到入库速度提高的目的
我的问题是否有可能,输入参数就是一个集合(DataTable或者DataSet)
存储过程的代码是这样的:

create or replace procedure p_insert_dataset_l1(ds_insert sys_refcursor) is
  TYPE rc_channel_value IS RECORD(n_cha_id t_channel_value_l0.cdv_cha_id%TYPE,
                                  n_time t_channel_value_l0.cdv_timestamp%TYPE,
                                  n_val t_channel_value_l0.cdv_val%TYPE);