首页 > 其他分享 >存储过程返回多数据集 Delphi 中处理方法

存储过程返回多数据集 Delphi 中处理方法

时间:2023-11-05 13:22:05浏览次数:30  
标签:返回 存储 end cur Delphi Cursor OraStoredProc1 type out

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 属性用于获取游标,这就提供了便利!

标签:返回,存储,end,cur,Delphi,Cursor,OraStoredProc1,type,out
From: https://www.cnblogs.com/sundh1981/p/17810431.html

相关文章

  • delphi 监测抖音新增评论以及解决x-bogus签名验证(2023-11-5)
    一、工作原理及流程:  1、从aweme接口取得aweme评论总数量;  2、与之前的数量比较,如果有新增评论;  3、从comment评论接口统计评论以及评论回复数量,得出新增评论数量;  4、按时间排序评论,找出新增评论;  5、如果有新增评论,通过微信公众号发送消息到手机通知。......
  • 数据结构之树(二叉树的存储方式之链表)
    JavaJava中可以使用链表来实现二叉树的存储。1.链表实现二叉树的原理:   链表是由节点组成的数据结构,每个节点包含一个数据和指向下一个节点的指针。  在链表中,可以将二叉树的每个节点都看作一个链表节点,同时维护一个指向左子节点的指针和一个指向右子节点的指针。通过......
  • Veeam Backup & Replication v12-(4)如何设置存储库服务器
    RepositoryServer是备份的存储位置,因此要正确设置备份第一次将确保您有最佳的性能。创建存储库时,最好遵循VeeamBackup&Replication最佳实践:https://bp.veeam.com/vbr/3_Build_structures/B_Veeam_Components/B_backup_repositories/以下是设置存储库时需要考虑的一些事项:ReFS/XF......
  • 存储过程和存储函数
    这个作业属于哪个课程https://edu.cnblogs.com/campus/uzz/cs3这个作业要求在哪里https://edu.cnblogs.com/campus/uzz/cs3/homework/13061这个作业的目标<第7次作业-存储过程和存储函数>1.输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名的......
  • 引用不可作为局部变量的返回值
    1.概述由于引用实际上是指向被引用变量的一个隐式指针,而局部变量在返回后就会被销毁,我指向的内容被销毁了,这个隐式指针也就成了野指针,导致错误2.实例错误写法以下是我在运算符重载时使用引用作为局部变量返回值导致的问题:Person&operator+(Person&t);{Personp;p.mem_a......
  • 关于返回值的几种情况
    1.参考链接:关于返回值的几种情况2.思路在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。如果返回一个基本类型的变量,比如:inta;a=5;returna;那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但......
  • 二十六、QT发送http请求并解析返回的json数据
    1.使用的模块和类模块:network类:QNetworkAccessManager、QNetworkRequest、QNetworkReply、QJsonDocument、QJsonObject、QJsonArrayQSslSocket::sslLibraryBuildVersionString();:查看当前使用的ssl版本,访问HTTPS时需要使用、复制libcrypto-1_1-x64.dll和libssl-1_1......
  • Mysql为什么存储表数据为什么不能超过2000万行,深度解释 转发 https://www.toutiao.co
    下面是我朋友的面试记录:面试官:讲一下你实习做了什么。朋友:我在实习期间做了一个存储用户操作记录的功能,主要是从MQ获取上游服务发送过来的用户操作信息,然后把这些信息存到MySQL里面,提供给数仓的同事使用。朋友:由于数据量比较大,每天大概有四五千多万条,所以我还给它做了分表的操......
  • 存储云服务中OBS(对象存储服务)的一些总结
    一、OBS1.概念一个以及对象的海量存储服务,桶(类似于文件夹)里面装着对象(文件)。桶是OBS中存储对象的容器,对象是OBS中数据存储的基本单位一个对象实际上是文件数据与其相关属性信息的集合体(不只是一个data),可以类似于Java中的类。OBS用户可以上传下载OBS系统里的任意资源我自己......
  • 记一个 Android 14 适配引发的Android 存储权限问题
    一、bug背景项目中有下面这样一段代码,在AndroidT版本运行正常,现在适配到AndroidU上之后,运行时crash了。。。。...values.put(MediaStore.Images.Media.DATA,file.absolutePath)values.put(MediaStore.Images.Media.DISPLAY_NAME,file.name)...resolver.update(ur......