call your_procedure(sys.diutil.int_to_bool(1), parm2, parm3);

解决方案 »

  1.   

    谢谢回复,在c#里面,需要定义OracleParameter in_Parameter1 = new OracleParameter();in_Parameter1.OracleType=?直接用构造函数传递true、false等进去都不对。如:bool a=true;
    OracleParameter in_Parameter1= new OracleParameter("in_Parameter1",a);都是报参数类型错误
      

  2.   


    定义成int类型,然后通过sys.diutil.int_to_bool函数将传入的int型转成boolean型。
      

  3.   

    如果之前在代码中是写成call your_procedure(parm1, parm2, parm3)这种形式,那么应当修改为
     call your_procedure(sys.diutil.int_to_bool(parm1), parm2, parm3);
      

  4.   

    前提就是oracle里面存储过程的代码是不可以修改的,如果我修改了,其他人已经写好的部分岂不是不兼容了?否则直接将存储过程的代码修改为int不就万事大吉了吗。比如用delphi的unidac组件调用就没任何问题,偏偏c#不行。
      

  5.   

    另外PL/SQL中似乎不支持这种将函数做为参数传入另一函数或者存储过程的方式,在不修改现有Procedure的情况下,写一个封装procedure会更好。类似这样:
     create or replace your_new_procedure(parm1_int, parm2, parm3) is
     parm1 boolean;
     begin
      if parm1_int = 1 then parm1 := true;
      else 
      parm1 := false;
      end if;
      your_procedure(parm1, parm2, parm3);
     end;
      

  6.   


    可以写一个新的procedure封装旧的procedure,这样不会破坏其他程序。
    我在#4提出的修改是针对你的c#代码,并不是pl/sql.
      

  7.   

    写一个封装,这个也许是解决问题的唯一途径了。谢谢。不过还是不甘心啊,就为了个参数类型,到底是哪一方有意或无意的造成这样的局面。.net还是oracle
      

  8.   

    Boolean is not an Oracle Datatype. But a Pl-sql Datatype
    只能改过程
      

  9.   


    大概是Oracle自身责任更大一点吧。
      

  10.   

    好像oracle有专门的.NET库?这样应该就没问题了吧