我想调用自定义的包体中的函数myFun(a varchar2,b varchar2):return number;用了两种方法都不行;
  第一种,建一个adoQuery,sql.add('select mypakage.myfun(x,y) cs from dual');(为做实验,其中的x,y都用的常量),使其active:=true,不报错;建一个dbgrid,指定它的datasouce为该query对应的dataset,但没有数据;而在sqlplus下,可以得到数据200;
  第二种,建一个adostoreproc adosp_myfunc,建立3个参数,其中rt为returnValue型参数,integer类型
  with adosp_myfunc do
  begin
    parameters.paramByName('a').value:=x;
    parameters.paramByName('b').value:=y;
    parameters.paramByName('rt').value:=0;
    execProc;
    edit1.text:=parameters.paramByName('rt').asString;
  end;
  报错参数个数错,如果不加rt参数,edit句报错.
  csdn中,好象大家都用的output参数的存储过程,如果我不想把function 改为procedure(,,out)形式,该怎样做呢? 

解决方案 »

  1.   

    这是c#,我手头没有delphi,不delphi大同效益SqlParameter.Direction 属性请参见获取或设置一个值,该值指示参数是只可输入、只可输出、双向还是存储过程返回值参数。[Visual Basic]
    Public Property Direction As ParameterDirection  Implements _
       IDataParameter.Direction
    [C#]
    public ParameterDirection Direction {get; set;}
    [C++]
    public: __property ParameterDirection get_Direction();
    public: __property void set_Direction(ParameterDirection);
    [JScript]
    public function get Direction() : ParameterDirection;
    public function set Direction(ParameterDirection);
    属性值
    ParameterDirection 值之一。默认值为 Input。实现
    IDataParameter.Direction异常
    异常类型 条件 
    ArgumentException 该属性未设置为有效的 ParameterDirection 值之一。 备注
    如果 ParameterDirection 是输出,而执行的关联 SqlCommand 不返回值,则 SqlParameter 包含空值。当读取最后一个结果集的最后一行后,将更新 Output、InputOut 和 ReturnValue 参数。示例
    [Visual Basic, C#] 下面的示例创建一个 SqlParameter 并设置它的一些属性。[Visual Basic] 
    Public Sub CreateSqlParameter()
        Dim myParameter As New SqlParameter("@Description", SqlDbType.VarChar)
        myParameter.Direction = ParameterDirection.Output
    End Sub 'CreateSqlParameter
    [C#] 
    public void CreateSqlParameter() 
     {
        SqlParameter myParameter = new SqlParameter("@Description", SqlDbType.VarChar);
        myParameter.Direction = ParameterDirection.Output;
     }
      

  2.   

    将direction改为pdoutput,或pdinputOutput,也报参数错,没蜇
      

  3.   

    你的第一种方法是对的,但是作为常量的x,y值可能没有传进去.var x,y: Real;
    begin
      x := 2.5;
      y := 5.6;
      adoQuery,sql.add('select mypakage.myfun('+ FloatToStr(x) +','+ FloatToStr(y) + ') cs from dual');
      {...}
    end;
      

  4.   

    不怎么与sql里function打交道
    学习
    up
      

  5.   

    我用sqlserver试了没问题,希望对你又帮助
    sqlserver
    --创建函数
    Create  function t_funcMin( @x int, @y int) returns int
    as
    begin
      declare @r int
      if @x< @y  
        set @r = @x
      else 
        set @r = @y
      return (@r)
    end//delphi调用
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ADOquery1 do
      begin
        close;
        sql.clear;
        sql.add('select dbo.t_funcMin(5,4) as a');
        open;
        showmessage(inttostr(fields[0].asinteger));
      end;
    end;这里没问题
      

  6.   

    经过实验,我发现如果用dbedit来显示就没有问题,说明应该是数据已经取到客户端,但dbgrid的内部机制可能不支持.是Delphi的bug,(Delphi 7.0)   继续探寻问题的原因,因为想用grid形式显示多行数据
      

  7.   

    hehe, 俺也实验了一下、還真是有問題。
    但是,用「To_Char」函数把数字型轉換成字符型就可顕示了、試試看。with DataModule1.ADOQuery1 do begin
      SQL.Text := 'select To_Char(myFun(''5'',''6'')) from dual';
      Open;
    end;