查看: 6899|回复: 4

C#中把数组传入到存储过程参的问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2006-8-17 15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
写一个过程,需要将一组ID传递给一个过程,然后这个列表将会在过程的SQL的where子句中使用到,例如: select * from my_table where my_id IN (传递给过程的ID的列表)
     我编写的过程如下:

create or replace package test_modality_bdpart_pck is
  type t_cursor is ref cursor;
  TYPE exam_array is table of varchar2(100) index by BINARY_INTEGER;
  procedure test_modality_prc(i_exam_uid IN exam_array,
                              cur_modality OUT t_cursor);
end test_modality_bdpart_pck;

create or replace package body test_modality_bdpart_pck is   
  procedure test_modality_prc(i_exam_uid IN exam_array,
                              cur_modality OUT t_cursor)
  is
                     sql_mod VARCHAR2(4000) :='select exam_uid,modality from e_mod_tbl where exam_uid in (';                     
                     array_count number := 0;
  begin
      array_count := i_exam_uid.count;
      if( array_count>1 ) then
          for i in 1..array_count loop
              if( i=1 ) then
                  sql_mod := concat(sql_mod,'''');
                  sql_mod := concat(sql_mod,i_exam_uid(0));
                  sql_mod := concat(sql_mod,'''');
              else
                  sql_mod := concat(sql_mod,',');
                  sql_mod := concat(sql_mod,'''');
                  sql_mod := concat(sql_mod,i_exam_uid(i-1));
                  sql_mod := concat(sql_mod,'''');
              end if;
          end loop;
          sql_mod := concat(sql_mod,')');
           OPEN cur_modality FOR sql_mod;
      else
          dbms_output.put_line('i_exam_uid erroe !');
      end if;
  end test_modality_prc;
end test_modality_bdpart_pck;


但是不知道怎么写“i_exam_uid”这个参的类型,下面是我写的一个例子,请高手指点一下,该怎么修改。
string[] arrUID = { "20060811180452562000","20060811180453546000","20060811180454250000","20060811180455750000","20060811180456640000"};
OracleConnection conn = new OracleConnection(connstring);
OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "test_modality_bdpart_pck.test_modality_prc";
cmd.CommandType = CommandType.StoredProcedure;
/*********下面的两句对不对,不对怎么修改???****************/
cmd.Parameters.Add("i_exam_uid", OracleType.VarChar,100).Value = arrUID;
cmd.Parameters.Add("cur_modality", OracleType.Cursor).Direction =ParameterDirection.Output;
/*********上面的两句对不对,不对怎么修改???****************/
conn.Open();
OracleDataReader dr = cmd.ExecuteReader();
   ............................
conn.Close();
论坛徽章:
1
授权会员
日期:2007-09-10 15:05:35
2#
发表于 2006-8-25 16:18 | 只看该作者
/*********下面的两句对不对,不对怎么修改???****************/
cmd.Parameters.Add("i_exam_uid", OracleType.VarChar,100).Value = arrUID;
cmd.Parameters.Add("cur_modality", OracleType.Cursor).Direction =ParameterDirection.Output;
/*********上面的两句对不对,不对怎么修改???****************/
显然不对,.net2003存储过程参数的添加方式共有六种,没有哪种是你写的那样,请楼主查看帮助。

其次我觉得OracleDataReader dr = cmd.ExecuteReader(),也有问题。按照你的代码看,返回的应该是一个数据集,既然已在存储过程参数定义了ref cursor的OUT 参数,就可以这么用了:
myDataSet.Tables["myDataTable_name"].datasource = test_modality_bdpart_pck.parameters["cur_modality"] ;

最后一点,我不知道楼主的存储过程是否能得到正确的结果,我建议如果数组里值不多的话,不如拼成字符串参数传入,存储过程会简单很多,尽管会影响一些效率,凭你权衡了。

使用道具 举报

回复
论坛徽章:
1
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44
3#
发表于 2007-6-14 18:13 | 只看该作者

我顶

我也在寻求这个传递数组的方法,现在还没什么头绪,但是我顶!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!![/COLOR]
如果您看到此帖有什么好方法,也请你帖上示例代码,谢谢!![/COLOR]

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2014-1-14 23:37 | 只看该作者

使用道具 举报

回复
论坛徽章:
7
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44咸鸭蛋
日期:2011-06-10 09:50:32ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26双黄蛋
日期:2012-03-30 10:02:542013年新春福章
日期:2013-02-25 14:51:24沸羊羊
日期:2015-03-04 14:51:522015年新春福章
日期:2015-03-06 11:58:18
5#
发表于 2014-1-15 09:14 | 只看该作者
楼上贴出来的链接不错

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表