存儲過程返回多數據集 Delphi 中處理方法

1.在C# 中我們可以通過DataSet 來接收多個數據集,但在Delphi 中沒有這樣的集合對象,因此處理起來稍微麻煩點,不過還是能處理的。這裏舉個例子:

Oracle Code

--包頭
create or replace package mypackage is
type 
  cur_type is ref cursor;
  procedure pr_getEmployee(emp_cur out nocopy cur_type);
  procedure pr_getEmpAndDept(nodata_cur out cur_type,emp_cur out  cur_type,dept_cur out  cur_type,cur_nation out cur_type);
end;

--包體

create or replace package body mypackage is
procedure pr_getEmployee(emp_cur out nocopy cur_type) as
begin
  open emp_cur for select a.employeeno 員工編號,a.employeename 員工姓名,b.departmentname 所在部門,a.sex 性別,
  a.employeedate 出生日期,a.workdate 工作日期 from employee a
  left join department b on a.departmentno=b.departmentno;
end;

procedure pr_getEmpAndDept(nodata_cur out cur_type,emp_cur out  cur_type,dept_cur out  cur_type,cur_nation out cur_type) as
begin
  open nodata_cur for select 1 from dual;
  open emp_cur for select * from employee;
  open dept_cur for select * from department;
  open cur_nation for select * from dcnation; 
end;

end;

--說明:在存儲過程pr_getEmpAndDept 中刻意增加了一個無用的nodata_cur 遊標,這個遊標用於返回空數據。因爲在多次測試中發現第一個參數返回結果集在Delphi 中接收爲空,即只有元數據,具體原因待有時間再查。

Delphi Code

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, Ora, DB, MemDS, DBAccess,
  MemTableDataEh, MemTableEh, DBGridEhGrouping, ToolCtrlsEh,
  DBGridEhToolCtrls, GridsEh, DBAxisGridsEh, DBGridEh;

type
  TForm1 = class(TForm)
    OraSession1: TOraSession;
    OraStoredProc1: TOraStoredProc;
    OraQuery1: TOraQuery;
    OraQuery2: TOraQuery;
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    Button1: TButton;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    OraQuery3: TOraQuery;
    DBGrid3: TDBGrid;
    DataSource3: TDataSource;
    MemTableEh1: TMemTableEh;
    DBGridEh1: TDBGridEh;
    DataSource4: TDataSource;
    OraQuery4: TOraQuery;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  OraSession1.Connected:=True;
  OraStoredProc1.Connection:=OraSession1;
  OraStoredProc1.Params.Clear;
  OraStoredProc1.Params.CreateParam(ftCursor,'nodata_cur',ptOutput);
  OraStoredProc1.Params.CreateParam(ftCursor,'EMP_CUR',ptOutput);
  OraStoredProc1.Params.CreateParam(ftCursor,'DEPT_CUR',ptOutput);
  OraStoredProc1.Params.CreateParam(ftCursor,'cur_nation',ptOutput);
  try
    OraStoredProc1.ExecProc;
  except on e:Exception do
  begin
    ShowMessage(e.Message);
  end;
  end;
  OraQuery4.Cursor:=OraStoredProc1.parambyname('nodata_cur').AsCursor;  
  OraQuery1.Cursor:=OraStoredProc1.parambyname('EMP_CUR').AsCursor;
  OraQuery2.Cursor:=OraStoredProc1.parambyname('DEPT_CUR').AsCursor;
  OraQuery3.Cursor:=OraStoredProc1.Parambyname('cur_nation').AsCursor; 
   //OraTable1.Cursor:= OraStoredProc1.Parambyname('cur_nation').AsCursor;
  OraQuery1.Open;
  OraQuery2.Open;
  OraQuery3.Open;
  OraQuery4.Open;

end;

end.

--說明: 存儲過程類TOraStoredProcedure 中定義的參數類型可以轉換爲Cursor 遊標類型,而TOraQuery和TOraTable 數據集組件中正好也定義了一個Cursor 屬性用於獲取遊標,這就提供了便利!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章