补充一下,我的oracle客户端是11G,服务器端也是11G。

解决方案 »

  1.   

    我试过了,用oracle客户端9i ,服务器端用11G 也有同样错误。
      

  2.   

    我试过了,用oracle客户端9i ,服务器端用11G 也有同样错误。
      

  3.   

    另外
    para.Direction = ParameterDirection.Output;
    testCommand.Parameters.Add(para);ReturnValue 参数表示诸如存储过程、内置函数或用户定义函数之类的操作的返回值。 
    你这里不是返回值,而是输出线参数,必须搞清楚区别。
      

  4.   

    非常感谢qldsrx
    我的第二个参数定义如下:
    para.Direction = ParameterDirection.ReturnValue;储存过程如下(包我也定义好了):
    create or replace function f_get_charitem
    (rptname in varchar2
    ) return kctj_pack.report_char_item is
      Result  kctj_pack.report_char_item  ;
      
      report_char_item kctj_pack.report_char_item;
      
    beginOPEN report_char_item FOR
      select * from (
        select  'KC001' as ftp_reportname,'客车报1' as reportname,'字段1' as field , '车种字典' as para_dic,'车种' as para_field from dual union all 
        select  'KC001' as ftp_reportname,'客车报1' as reportname,'字段2' as field , '车型字典' as para_dic,'车型' as para_field from dual union all  
        select  'KC002' as ftp_reportname,'客车报2' as reportname,'字段1' as field , '区段字典' as para_dic,'区段' as para_field from dual union all    
        select  'KC002' as ftp_reportname,'客车报2' as reportname,'字段2' as field , '单位字典' as para_dic,'单位' as para_field from dual )  
          where ftp_reportname=rptname or reportname =rptname;
      
      result := report_char_item ;
      return(Result);
    end f_get_charitem;
      

  5.   

    非常奇怪的是,用回 using System.Data.OracleClient;  不用using Oracle.DataAccess.Client;
    OracleDbType.Varchar2 修改 为OracleType.VarChar 就没有错误。奇怪啊。
      

  6.   

    包如下:
    create or replace package kctj_pack is  -- Author  : WRF
      -- Created : 2009-11-5 14:48:33
      -- Purpose : sssssssssssssssssssssss
      
      -- Public type declarations
      TYPE report_char_item IS REF CURSOR;
      TYPE report_data_item IS REF CURSOR;  --TYPE user_batch_report IS REF CURSOR;
      -- Public constant declarations
      --<ConstantName> constant <Datatype> := <Value>;  -- Public variable declarations
      --<VariableName> <Datatype>;  -- Public function and procedure declarations
      --function <FunctionName>(<Parameter> <Datatype>) return <Datatype>;end kctj_pack;
      

  7.   

    拜托啊,你那个是函数不是存储过程,函数的直接调用我真没试过,你改为这样肯定可以,而且更方便:我从未用过带返回值的存储过程,你这种写法我是第一次看到,其实你根本没必要定义包,这样写你的存储过程更方便,而且调用不会出问题:
    [code=SQL]
    create or replace PROCEDURE p_get_charitem
    (rptname in varchar2,
     report_char_item OUT SYS_REFCURSOR
    )
    AS   
    begin
    OPEN report_char_item FOR
      select * from (
      select 'KC001' as ftp_reportname,'客车报1' as reportname,'字段1' as field , '车种字典' as para_dic,'车种' as para_field from dual union all  
      select 'KC001' as ftp_reportname,'客车报1' as reportname,'字段2' as field , '车型字典' as para_dic,'车型' as para_field from dual union all   
      select 'KC002' as ftp_reportname,'客车报2' as reportname,'字段1' as field , '区段字典' as para_dic,'区段' as para_field from dual union all   
      select 'KC002' as ftp_reportname,'客车报2' as reportname,'字段2' as field , '单位字典' as para_dic,'单位' as para_field from dual )   
      where ftp_reportname=rptname or reportname =rptname;
    end p_get_charitem;
      

  8.   

    谢谢qldsrx,JAVA中我一直用函数返回游标,在C#中我用using System.Data.OracleClient通过函数返回游标也可以,我知道用存储过程output参数返回游标可以替代,但是我感到非常难以理解的就是
    using System.Data.OracleClient; 不用using Oracle.DataAccess.Client;
    OracleDbType.Varchar2 修改 为OracleType.VarChar 就没有错误。
      

  9.   

    对于函数的返回值,使用参数的来获取的做法我没试过,也许是它的顺序有点差异,认为返回值是第一个参数。
    使用Oracle.DataAccess时,如果要用参数名绑定参数,必须指明属性OracleCommand.BindByName = true;
    这个属性默认为false,按照添加参数的顺序来绑定。
      

  10.   

    在参数add之前用
    OracleCommand.BindByName = true;
    解决,谢谢qldsrx的帮助。