国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

如何在Delphi中調用oracle的存儲過程返回數據集

2024-08-29 13:44:34
字體:
來源:轉載
供稿:網友

  
選自CSDN http://search.csdn.net/EXPert/topic/2280/2280860.xml?temp=2.169436E-02 論壇中JCC0128 網友的發言

【Delphi+Oracle報表解決方案(一)】delphi中調用oracle的存儲過程(分帶返回游標,不返回值兩種) 
要害字: delphi ,oracle存儲過程,游標,返回數據集,報表

注:delphi 6+ oracle 8.1.6

一.創建包與包體

1.附:建表aaclass為下面作測試用

create table aaclass(CID VARCHAR2(50), CNAME VARCHAR2(50), pnumber NUMBER(10,0) );

INSERT INTO aaclass values('c1', 'cn1', 10 ) ;
INSERT INTO aaclass values('c2', 'cn2', 40 ) ;
INSERT INTO aaclass values('c1', 'cn3', 30 ) ;
commit;

2.建包:

CREATE OR REPLACE  PACKAGE PKG_JCCTEST1                          
AS

  type rc_class is ref cursor;

                   
  --求p1,p2的和與差,返回的多個值通過游標返回
  PRocedure GetSubAndSum2(p1 number,p2  number ,
              ResultCursor out rc_class);
 
  --查詢滿足條件的數據集,返回數據集通過游標返回
  procedure GetClass2(a in number,ResultCursor out rc_class ) ;

  --往表中插一條記錄,不返回結果集時,本人用AdoQuery調用(adodataset好象要求必須返回結果集)
  procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,
                          p_pnumber number) ;
end PKG_JCCTEST1;

 

3.建包體

CREATE OR REPLACE  PACKAGE BODY PKG_JCCTEST1
AS

procedure GetSubAndSum2(p1 number,p2  number ,
              ResultCursor out rc_class)
IS
BEGIN
  open ResultCursor for
    select p1-p2 as "sum", p1+p2 as "sub" from dual;
END ;


procedure GetClass2(a in number,ResultCursor out rc_class )
is
begin

 open ResultCursor for
   select aaclass.* from aaclass where pnumber >a;

end ;

procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,
                          p_pnumber number)
is
begin
  insert into aaclass values(p_cid,p_cname,p_pnumber) ;
--  commit;
end ;

 

 

二.在delphi中利用AdoDataSet調用上述第一個存儲過程
1.利用AdoConnection1連接數據庫(驅動為 oracle Provider for OLE DB),
  **并在連接字符串中加入這一節:  PLSQLRSet=1; 如下所示:
Provider=OraOLEDB.Oracle.1;PassWord=KXD;Persist Security Info=True;User ID=KXD;Data Source=TEST3;PLSQLRSet=1

2.在窗體上加AdoDataSet1 指明連接為上述AdoConnection1,下面可以放一個按鈕,單擊按鈕就能調用第一步中創建的包過程,并返回數據集。
代碼如下所示:


procedure TForm1.Button1Click(Sender: TObject);
var
  AResult , BResult : integer;
begin
  ADODataSet1.Close ;
  ADODataSet1.CommandType :=  cmdText ;
  ADODataSet1.Parameters.Clear ;

  //***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
  //輸出游標的參數不需要指定!!!!!!,本來此函數帶三個參數,我們這里只需要傳兩個參數.
  ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetSubAndSum2(?,?)}' ;

  //***C 順序有關,createparam必須放在commandtext賦值語句之后.

  // 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,45為傳入的實參值
  ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,45);
  //創建第二個參數,根據createparameter的順序 自動與call中的第二個參數對應
  ADODataSet1.Parameters.CreateParameter('p2',ftinteger,pdinput,10,4);

  //下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
  ADODataSet1.Open ;

  //根據存儲過程,數據集只有一條記錄,所以不需要用while do 來遍歷數據集,直接取數據了

  //此處的字段名根據包過程中的返回游標 對應的字段名來取
  //定義的存儲過程返回游標如:  open ResultCursor for
  //                select p1-p2 as "sum", p1+p2 as "sub" from dual;
  //把對應的字段值取出來即可
  AResult := ADODataSet1.Fields.FieldByName('sub').Value ;
  BResult := ADODataSet1.Fields.FieldByName('sum').Value ;

  //顯示結果
  showmessage(inttostr(AResult)) ;
  showmessage(inttostr(BResult)) ;

end;

 


三.在delphi中利用AdoDataSet調用上述第二個存儲過程

 
還是利用上述的AdoDataSet1來調用第二個存儲過程,無需任何改動,加第二個按鈕,單擊時代碼如下:

procedure TForm1.Button2Click(Sender: TObject);
begin
  ADODataSet1.Close ;
  ADODataSet1.CommandType :=  cmdText ;
  ADODataSet1.Parameters.Clear ;

  //***利用call方法調用oracle過程時,參數必須由?來傳, 即使你要傳的參數為常理
  //輸出游標的參數不需要指定!!!!!!,本來此函數帶兩個參數,我們這里只需要傳一個參數.
  ADODataSet1.CommandText := '{call PKG_JCCTEST1.GetClass2(?)}' ;

  //***C 順序有關,createparam必須放在commandtext賦值語句之后.

  // 創建第一個參數,對應call中的第一個?,ftinteger為類型,10為長度,20為傳入的實參值
  ADODataSet1.Parameters.CreateParameter('p1',ftinteger,pdinput,10,20);


  //下面調用ADODataSet1 的open方法,返回數據集(對應包過程的游標)
  ADODataSet1.Open ;

  while not ADODataSet1.Eof do
  begin
    showmessage('CID : '+string(ADODataSet1.FieldByName('CID').Value) +
        '--CNAME :' + string(ADODataSet1.FieldByName('CNAME').Value) +
        '--PNUMBER :' + string(ADODataSet1.FieldByName('PNUMBER').Value)
        ) ;
    ADODataSet1.Next ;
  end ;
end;

 

 

四 利用adoquery調用第三個過程,不返回數據集的

procedure TForm1.Button3Click(Sender: TObject);
begin
  AdoQuery1.Close ;
  AdoQuery1.Parameters.Clear ;

  AdoQuery1.SQL.Clear ;

  AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
  AdoQuery1.Parameters.CreateParameter('P1',ftstring,pdinput, 50,'c11') ;
  AdoQuery1.Parameters.CreateParameter('P2',ftstring,pdinput, 50,'cn11') ;
  AdoQuery1.Parameters.CreateParameter('P3',ftinteger,pdinput, 50,25) ;

  AdoQuery1.ExecSQL ;
end;


五 利用adoquery調用第一個過程,返回數據集的.


procedure TForm1.Button4Click(Sender: TObject);
begin
  AdoQuery1.Close ;
  AdoQuery1.Parameters.Clear ;

  AdoQuery1.SQL.Clear ;

  AdoQuery1.SQL.Add('{call PKG_JCCTEST1.GetSubAndSum2(?,?)}') ;
  AdoQuery1.Parameters.CreateParameter('P1',ftinteger,pdinput, 50,25) ;
  AdoQuery1.Parameters.CreateParameter('P2',ftinteger,pdinput, 50,22) ;

  AdoQuery1.Open  ;

  Showmessage(string( AdoQuery1.FieldByName('sub').Value)+'-'+
                string( AdoQuery1.FieldByName('sum').Value));
end;

六.關于三層體系的此類問題

兩層的解決了,三層類似.
中間層用tadodataset 或tadoquery (+tdatasetprovider),中間層的adoconnection的連接字符串加上plsqlRset=1;
客戶端用clientdataset ,大同小異,舉例如下:

  begin
    //調用相應的過程
    ClientDataSet1.Close ;
    ClientDataSet1.Params.Clear ;

    ClientDataSet1.CommandText := '{call PackageName.ProcedureName(?,?)}' ;
    ClientDataSet1.Params.CreateParam(ftInteger , 'ParamName1', ptInput) ;
    ClientDataSet1.Open ;
 
  end ;


本人水平有限,如有不當與錯誤之處請指正!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江阴市| 南宁市| 江川县| 九江市| 榕江县| 时尚| 汉沽区| 四子王旗| 南城县| 额敏县| 柞水县| 增城市| 尼玛县| 军事| 新竹县| 拉孜县| 南安市| 信丰县| 中阳县| 观塘区| 德保县| 广宗县| 博罗县| 新疆| 宿迁市| 名山县| 台北市| 浮山县| 吉安市| 四子王旗| 浮梁县| 田林县| 读书| 渝北区| 临澧县| 桦甸市| 临沂市| 绥阳县| 千阳县| 晋城| 顺平县|