用oracle的provider
连接字符串里加上'plRSet=1'

解决方案 »

  1.   

    to  nebulaly(竹风论坛) :
    "用oracle的provider"
    是Delphi提供的还是Oracle提供的?
      

  2.   

    使用TStoredProc.Params[0].Value即可.
      

  3.   

    oracle提供的,到
    http://otn.oracle.com/software/tech/windows/ole_db/content.html
    下载,免费注册
    如果用了MTS,要安装oracle for mts服务
    在http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/win.817/a85259/toc.htm

    http://otn.oracle.com/docs/products/oracle8i/doc_library/817_doc/win.817/a73029/toc.htm
    有详细资料
    连接字符串这样写:
      ConnectStr:=Format('PLSQLRSet=1;Password=%s;Persist Security Info=True;User ID=%s;Data Source=%s;Extended Properties=""',[Password,UserName,DatabaseName]);
      OraADOConnection.Provider:='OraOLEDB.Oracle';
      OraADOConnection.ConnectionString:=ConnectStr;
      OraADOConnection.LoginPrompt:=False;
      OraADOConnection.Open;
    这样连接
    调用存储过程不能用plsql方式
    要这样写:
    '{CALL open_table}'
    open_table这个存储过程作用是打开表,有一个cursor参数返回数据集
    用ADODataSet执行这条语句,就可以返回一个数据集,不用设置param
    切勿用ADOStoredProc
    因为ADOStoredProc就是把CommandType设为cmdStoredProc的dataset
    但是执行这条语句一定要把CommandType设为cmdText
      

  4.   

    呵呵,我也是用的ADO + Oracle 呀,我的存储过程也是要传回值的呀,可是我的这个函数一直工作的很正常呀!! 函数如下://ProcName :存储过程名称
    //ParamName: 一个Input参数
    //ParamValue: 传入的Input参数的值
    //OutName: 一个Output参数
    //返回: Output参数的值
    function ExecStoredFunc(ProcName, ParamName,  ParamValue, OutName: string): string;
    var
      storedProc: TADOStoredProc;
    begin
      try
        storedProc:= TADOStoredProc.Create(self);
        With storedProc do
        begin
          Connection:= m_ADOConnection;
          ProcedureName:= ProcName;
          Parameters.CreateParameter(ParamName, ftString, pdInput, 20, ParamValue );
          Parameters.CreateParameter(OutName, ftString, pdOutput, 11, '' );
          Prepared:= True;
          ExecProc;
        end;
        result:= StoredProc.Parameters.ParamValues[OutName];
        storedProc.Free;
      except
        on E: Exception do
        begin
          //在此处理异常
        end;
      end;
    end;
      

  5.   

    传出一般类型这样是可以的
    但是传出cursor不行
      

  6.   

    返回一般类型这样可以
    cursor就不行了
      

  7.   

    为什么用ADO,BDE+ORACLE要比ADO+ORACLE好.
      

  8.   

    问题关键是:
    我的adoStoredProc放在中间层,我从client端传递参数给中间层的存储过程,
    我如何在客户端取得adostoredProc的输出参数呢?AdoStoredProc组件的parameters属性的dataType参数和value.type参数有何区别?我这样试了:
    在中间层做一个方法:比如有3个参数,其中两个供调用存储过程要的输入参数,一个用于接受存储过程的输出参数。然后在客户端调用这个方法,编译出错。谁能帮我解决了,加分酬谢!
      

  9.   

    parameters不能定义ftCursor类型,所以返回cursor有困难返回一般类型问题不大,贴代码先
      

  10.   

    //aspGetNameF为appServer中一adostoredproc,对应后台ORACLE的FUNCTION :Get_Name_F,
    //Get_Name_F有三个输入参数,通过函数名返回结果(天哪,我现在才搞清楚,后台原来是function,不是procedure,这在Delphi中还用存储过程吧?)。
    //dspGetName为appServer中一datasetProvider,对应aspGetName。[appServer端]
    ...
    procedure GetName(const fName, tType, tFlag: WideString;out aName:olevariant); safecall;
    ...
    procedure TSoRemoteDataModule.GetName(const fName, tType,
      tFlag: WideString);
    begin
      aspGetNameF.Parameters[1].Value :=fName;  
      aspGetNameF.Parameters[2].Value :=tType;
      aspGetNamef.Parameters[3].Value :=tflag;
      aspGetNamef.Prepared ;
      aspgetNamef.open;
      aName:=dspGetNameF.data;
    end;
    ...[client端]
    //SODataModule.DCOMConnection1为client端dataModule上的连接对象
    ...
    procedure TRegForm.FormCreate(Sender: TObject);
    begin
       
      lblVname.Caption:=SODataModule.DCOMConnection1.AppServer.
    GetName('v_name','s','c');end;
    ...[说明]
    1。后台Function只有3个输入参数,没有输出参数,DBA说通过函数名返回值,这我理解,可是我在appServer 中通过View|Type Library添加接口方法,为什么只有procedure,没有Function?(我想肯定行,只是我不会罢了)2。在client端调用appserver中接口方法,返回结果是自动放在某clientDataSet中,还是能直接赋给一相应变量?调用appServer中存储过程时,有输出
    参数client端怎么使用,无输出参数client端怎么使用?能举一例?3。在appServer 中通过View|Type Library添加接口方法,定义参数类型时为什么与标准数据类型不一一对应,比如找不到string型,而有BSTR即widestring型,我最糊涂的是返回参数的类型,比如明显返回string,它却要是HRESULT型,在前端要olevariant,哎,什么规律呀实在糊涂!书上一般都这么写,也没什么说明,大多数新手对这一块都是死穴,哪位高人能指点迷津,我愿高分酬谢!
      

  11.   

    //aspGetNameF为appServer中一adostoredproc,对应后台ORACLE的FUNCTION :Get_Name_F,
    //Get_Name_F有三个输入参数,通过函数名返回结果(天哪,我现在才搞清楚,后台原来是function,不是procedure,这在Delphi中还用存储过程吧?)。
    //dspGetName为appServer中一datasetProvider,对应aspGetName。[appServer端]
    ...
    procedure GetName(const fName, tType, tFlag: WideString;out aName:olevariant); safecall;
    ...
    procedure TSoRemoteDataModule.GetName(const fName, tType,
      tFlag: WideString);
    begin
      aspGetNameF.Parameters[1].Value :=fName;  
      aspGetNameF.Parameters[2].Value :=tType;
      aspGetNamef.Parameters[3].Value :=tflag;
      aspGetNamef.Prepared ;
      aspgetNamef.open;
      aName:=dspGetNameF.data;
    end;
    ...[client端]
    //SODataModule.DCOMConnection1为client端dataModule上的连接对象
    ...
    procedure TRegForm.FormCreate(Sender: TObject);
    begin
       
      lblVname.Caption:=SODataModule.DCOMConnection1.AppServer.
    GetName('v_name','s','c');end;
    ...[说明]
    1。后台Function只有3个输入参数,没有输出参数,DBA说通过函数名返回值,这我理解,可是我在appServer 中通过View|Type Library添加接口方法,为什么只有procedure,没有Function?(我想肯定行,只是我不会罢了)2。在client端调用appserver中接口方法,返回结果是自动放在某clientDataSet中,还是能直接赋给一相应变量?调用appServer中存储过程时,有输出
    参数client端怎么使用,无输出参数client端怎么使用?能举一例?3。在appServer 中通过View|Type Library添加接口方法,定义参数类型时为什么与标准数据类型不一一对应,比如找不到string型,而有BSTR即widestring型,我最糊涂的是返回参数的类型,比如明显返回string,它却要是HRESULT型,在前端要olevariant,哎,什么规律呀实在糊涂!书上一般都这么写,也没什么说明,大多数新手对这一块都是死穴,哪位高人能指点迷津,我愿高分酬谢!
      

  12.   

    不要用adostoredproc,用adodataset
    调用函数的sql这样写:'select GetName('v_name','s','c') from dual'
    这样dataset中就会有一个只包含一条纪录、一个字段的数据集,就是函数的返回值com是要跨语言的,所以用的正好是标准的数据类型,而不是delphi的数据类型
    通过接口只能返回指针,所以输出参数必须是olevariant
    如果用函数返回,这是值传递方式,就无法释放服务段已经分配的内存,所以只能用procedure传递指针参数
      

  13.   

    to nebulaly():如果我非要用adostoredproc呢?
    olevariant如何转换成string型或其他类型?比如下面代码如何改错://在client端调用GetName(),aName参数对应appserver中定义的接口的out型参数...
    var
      
      aName:olevariant;
    ...
     SODataModule.DCOMConnection1.AppServer.GetName('v_name','s','c', aName);
     label1.caption:=aName;
    ...等候大家讨论
      

  14.   

    可以打开adodb看一下
    adostoredproc和adodataset都是从TCustomADODataSet继承的
    无非是adostoredproc在构造函数中加了一句
    Command.CommandType := cmdStoredProc;
    这个Command是一个TADOCommand
    如果你非要用adostoredproc
    自己写一句Command.CommandType := cmdText;OLEVariant不需要显式转换
    如果aName是oleVariant
    label1.caption:=aName;没错
      

  15.   

    大哥大姐们,小弟最近也碰上类似问题,我要Oracel返回一个结果集,不是返回参数,怎么办?嵌套表,索引表,动态数组都试了,没用!!!!救命!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!