
【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_JCCTEST1AS 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_JCCTEST1ASprocedure GetSubAndSum2(p1 number,p2 number ,ResultCursor out rc_class)ISBEGINopen ResultCursor forselect p1-p2 as "sum", p1+p2 as "sub" from dual;END ;procedure GetClass2(a in number,ResultCursor out rc_class )isbegin open ResultCursor forselect aaclass.* from aaclass where pnumber >a;end ;procedure InsertClass( p_cid varchar2 ,p_cname varchar2 ,p_pnumber number)isbegininsert 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=12.在窗體上加AdoDataSet1 指明連接為上述AdoConnection1,下面可以放一個按鈕,單擊按鈕就能調用第一步中創建的包過程,并返回數據集 。代碼如下所示:procedure TForm1.Button1Click(Sender: TObject);varAResult , BResult : integer;beginADODataSet1.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);beginADODataSet1.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 dobeginshowmessage('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);beginAdoQuery1.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);beginAdoQuery1.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 ;
猜你喜歡
- 流產有哪些癥狀
- 死神來了2下載鏈接。或者種子
- 懸賞啦 請問愛在哈佛國語版在線觀看或者下載地址
- 怎么使用Adobe Acrobat DC編輯pdf
- 我的是 東方之子v8學習機 能下載什么 觸摸屏游戲 或別的游戲啊 謝謝
- 農藥怎么看出酸性或堿性
- 屁的組詞 漢字屁的組詞
- 立秋的來歷 立秋的來歷是什么
- 想改模型,但是找不到“米米爾隆的徽記”坐騎的代碼,或幫我把奧杜亞10人龍的模型直接改成飛機頭模型
- 求笑傾三國txt或者eupb下載
