急急急急急急急急急急急急急急急急!!!!!!!
本人包中的两个存储过程声明如下,想每个过程都用***ClientDataSet**和**ADOQuery***来调用,也就是说需要四个调用!!!如何实现!!!第一个过程的功能:传入一个或多个一般类型的参数,**返回多个**一般类型的值
第二个过程的功能:传入一个或多个一般类型的参数,**返回所得的查询数据集**,也就是游标sql server 中利用存储过程的一个特性,即存储过程中的最后一条select 作为返回集,轻松实现上述两个过程。想问oracle中大家如何实现上述两个功能。
如果用别的方法不用下面这样的函数请指点!!!!!!create or replace package PKG_JCCTEST1
AS
  TYPE RCTYPE1 IS REF CURSOR;
  PROCEDURE GetSumAndSub(p number ,p2 number , result1 out number ,result2 out number);procedure GetDataSetById(p_id varchar2 ,  rc1 rctype1);end ;
我已经搜索相关版关以前的贴子,不能解决本人问题,谢绝copy网上以前的代码作为回复!!!!

解决方案 »

  1.   

    不能用select * from procedurename吗?
    参数通过parms传递
      

  2.   

    delphi5+win98+ora805 in redhat linux7.2 test ok!!!
    //in sqlplus 
    create or replace procedure test(a1 in varchar,a2 in integer,b1 out varchar,b2 out integer)
     as
     begin
        b1:=a1;
        b2:=a2;
     end;
    /
    object Form1: TForm1
      Left = 192
      Top = 107
      Width = 544
      Height = 375
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object BitBtn1: TBitBtn
        Left = 120
        Top = 144
        Width = 75
        Height = 25
        Caption = 'BitBtn1'
        TabOrder = 0
        OnClick = BitBtn1Click
      end
      object Edit1: TEdit
        Left = 192
        Top = 48
        Width = 121
        Height = 21
        TabOrder = 1
        Text = 'Edit1'
      end
      object Edit2: TEdit
        Left = 360
        Top = 48
        Width = 121
        Height = 21
        TabOrder = 2
        Text = 'Edit2'
      end
      object ddd: TADOStoredProc
        ConnectionString = 
          'Provider=MSDAORA.1;Password=smims2000;User ID=smims2000;Data Sou' +
          'rce=ora9;Persist Security Info=True'
        ProcedureName = 'TEST'
        Parameters = <
          item
            Name = 'A1'
            DataType = ftString
            Size = 2000
          end
          item
            Name = 'A2'
            DataType = ftBCD
            Precision = 15
          end
          item
            Name = 'B1'
            DataType = ftString
            Direction = pdOutput
            Size = 2000
          end
          item
            Name = 'B2'
            DataType = ftBCD
            Direction = pdOutput
            Precision = 15
          end>
        Left = 120
        Top = 48
      end
    end
    //
       with ddd do
       begin
          Parameters.ParamValues['a1']:='12345678';
          Parameters.ParamValues['a2']:=200;
           execproc;
          edit1.text:=Parameters.ParamValues['b1'];      edit2.text:=Parameters.ParamValues['b2'];
       end;
      

  3.   

    这是我以前做的程序 ,最好是自己定义,不要用自带的过程控件,常出错
    注释里的是oracle里的调用
    非注释里的是sql server里的调用
    //  调用存储过程
       //  procEmployeeNo.StoredProcName := 'PROEMPLOYEENO';
       //  procEmployeeNo.Params.Clear ;
       //  procEmployeeNo.Params.CreateParam(ftString, 'SYEAR', ptInput)  ;
       //  procEmployeeNo.Params.CreateParam(ftString, 'RETURNEMPLOYEENO', ptOutput)  ;   //  创建并调用函数
       adofunDispatchId:= TADOStoredProc.Create(nil);
       adofunDispatchId.ProcedureName :='funGetSendDocId';
       adofunDispatchId.ConnectionString:='Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=PubDoc;Data Source=localhost';   adofunDispatchId.Parameters.CreateParameter('@RETURN_VALUE',ftString,pdReturnValue,50,0);
       adofunDispatchId.Parameters.CreateParameter('@ParaId',ftString,pdInput,50,0);
       adofunDispatchId.Parameters.CreateParameter('@ParaDate',ftString,pdInput,10,0);   if  adofunDispatchId.Active then adofunDispatchId.Close;
       adofunDispatchId.Parameters[1].Value:=sPlace;
       adofunDispatchId.Parameters[2].Value:=sYear;
       try
       adofunDispatchId.ExecProc;
       edtDispatchId.Text:= adofunDispatchId.Parameters.ParamByName('@RETURN_VALUE').Value;
       //edtDispatchId.Text:=adofundispatchId.Parameters[0].Value;
       //showmessage(adofundispatchId.Parameters[0].Value);
       edtNum.Text:=copy(edtDispatchId.Text,(length(sPlace)+length(sYear)+2+1),(length(edtDispatchId.Text)-length('号')));
       edtNum.Text:=copy(edtNum.Text,1,length(edtNum.text)-2);
       except
       Application.MessageBox(pchar('产生函数有错,请重试'), '提示', MB_OK);
       exit;
       end;试试吧
      

  4.   

    感谢楼上两位!!!
    还请问有没有clientdataset 和adoquery的完整例子?!!!!!
      

  5.   

    哈哈哈哈哈,三层的我也搞定了,中间层再加一个adodataset,客户端还是clientdataset,
    把原来adodataset的代码放到clientdataset中即可。
    爽呀,过两天整理出来大家看看,唉,搞完之后觉得太小儿科了:)花了我三天时间,在csdn上苦苦等待三天,还是大富翁上找到答案,感谢沉香屑!!!!!好久没有这种感觉了,一个字,爽!!!!!
      

  6.   

    沉香屑 (大富翁)(2002-5-24 12:19:00)  
    例如查询scott下面的emp
    1.建包,定义游标类型和过程
    create or replace Package pkg_demo
    AS
      TYPE EmpCurTyp IS REF CURSOR RETURN emp%ROWTYPE;
      procedure open_emp_cv(emp_cv OUT EmpCurTyp);
    END pkg_demo;
    2。定义包体
    create or replace package body pkg_demo 
    AS
    procedure open_emp_cv (emp_cv OUT EmpCurTyp) 
    IS
    BEGIN
      OPEN emp_cv FOR SELECT * FROM emp;
    END open_emp_cv;
    end pkg_demo;
    3。建立ado连接,注意用oracle的provider,连接字符串里包含“PLSQLRSet=1”
    ADOConnection1.ConnectionString:='PLSQLRSet=1;Provider=OraOLEDB.Oracle;Password=tiger;Persist Security Info=True;User ID=scott;Data Source=fjddmis;Extended Properties=""';
    ADOConnection1.Open;
    4。用TADODataset调用存储过程,注意调用格式
    ADODataSet1.Connection:=ADOConnection1;
    ADODataSet1.CommandText:='{call pkg_demo.open_emp_cv}';
    ADODataSet1.CommandType:=cmdText;
    ADODataSet1.Open; 
    ------------------------ 这是 沉香屑 大侠在lid=1107306中的回答。很经典。  
    来自:jrq, 时间:2002-9-13 11:33:00, ID:1322683
    http://otn.oracle.com/docs/tech/windows/ole_db/doc/html/using.htm#1000470 如是说: