在oracle数据库中定义包以及包体,在包中定义类型与存储过程 type rec_item is record(
      r_name varchar2(200),
      r_value varchar2(20000),
      r_type varchar2(20),
      r_format varchar2(50),
      r_default varchar2(20000)
 );
 type rec_items is table of rec_item index by binary_integer;
 
 procedure pro_po_action(p_items rec_items, vcreback out varchar2);在包体中实现存储过程 procedure pro_po_action(p_items rec_items, vcreback out varchar2) is
  v_item rec_item ;
  v_seq  number default 1;
  begin
    vcreback := '';
    
    if p_items.count = 0 then
     vcreback := '传入信息项为空!';
     return;
    end if;
  
    for v_seq in 1..p_items.count loop
     v_item := p_items(v_seq);
     insert into t_po_item (ilineid, vcname, vcvalue, vctype, vcformat, vcdefaultvalue, dtdate)
      values (seq_po_ilineid.nextval, v_item.r_name, v_item.r_value, v_item.r_type, v_item.r_format, v_item.r_default, sysdate);
    end loop;
    vcreback := '成功执行数据记录添加!';
  end pro_po_action;我想问的是, 如何在c#中如何提交定义中的数据类型,有这方面经验的朋友帮忙哈, 谢谢!!!

解决方案 »

  1.   


    //参考:
    //在程序中定义一个数组类型的rec_items
    //并为其赋初值,数组元素的个数与数据库中你定义的记录类型相同
    //再调用过程的地方传递参数时,
    //pro_po_action(p_items rec_items, vcreback out varchar2)
    //对应rec_items记录类型的地方传递我们定义的数组.
      

  2.   

    首先怀疑你这种做法的合理性,你写这个存储过程就是想将一个集合中的记录插入表中,这种情况在编程中经常遇到,不过一般都是在程序里循环集合中的记录,很少通过存储过程,毕竟程序控制起来比较简单。如果是为了减少数据库资源的占用个人认为有两种方式:
    1、把sql语句拼在一起,一次发送到数据库
    2、保持数据库连接是打开的(即connection是open状态),这样可以避免每插入一条记录就要创建数据库连接。
    欢迎大家提出好的方法
      

  3.   

    cuihaiyang
    谢谢您的提醒,这仅仅是我的一个测试程序,并不是真正应用程序中的代码。在实际应用程序中在存储过程中的处理就不止这么简单。
      

  4.   

    首先谢谢大家抽出时间来解答我的问题。
    经过这几天的思考,代码测试,现在这个问题得到了解决。
    c#中对oralce只支持一维数组参数的传递,对于其二维数组的传递目前是没有找到对应的方法,采用一维数组字符串形式将数据传入存储过程,一维数据中的数据是以分隔符连接的字符串,然后在存储过程中分割字符串生成自定义对象实例,然后再做其他的操作。
    这是我目前采用的方式。在java中可以实现二维数组参数传递,甚至可以采用多维数组传递。