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 屬性用於獲取遊標,這就提供了便利!