首页 > 其他分享 >unidac存储过程

unidac存储过程

时间:2024-12-07 09:37:03浏览次数:7  
标签:存储 end sp DB begin param pname unidac 过程

unidac存储过程

 

unit DB.storedproc;
//cxg 2024-8-31
//存储过程
{$i def.inc}

interface

uses
  //mormot------
  mormot.core.variants,
  //my-------
  db.Unidac,
  sys.global, DB.unidacpool, dataset.Serialize,
  //unidac-------
  uni,
  //system-------
  Classes, SysUtils, DB;

type
  { Tsp }

  Tsp = record
    dbid: string;       //数据库帐套号
    ctxt: Tcontext;     //通讯上下文
    procName: string;   //存储过程名
    inParam: Pjson;//入参
    //执行存储过程
    procedure Open;
    //给input参数赋值
    procedure onInParam(sp: TUniStoredProc; param: Pjson);
    //序列output参数
    procedure onOutParam(sp: TUniStoredProc; var param: Tjson);
  end;

implementation

{ Tsp }

procedure Tsp.Open;
var
  db: tdb;
  pool: tdbpool;
  jo: Tjson;
  i: integer;
begin
  jo.InitObject([]);
  try
    try
      pool := GetDBPool(dbid);
      db := pool.Lock;
      DB.sp.Close;
      DB.sp.Params.Clear;
      DB.sp.StoredProcName := procName;
      DB.sp.active := True;         //自动生成存储过程的参数
      onInParam(DB.sp, inparam);    //处理入参
      DB.sp.Execute;                //执行存储过程
      onOutParam(DB.sp, jo);        //处理出参
      i := 0;
      repeat                        //返回多个数据集
        jo.AddValue('dataset' + i.ToString, _json(DB.sp.tojsonarraystring));
        Inc(i);
      until not DB.sp.OpenNext;
      send(ctxt, jo.toJSON);
    except
      on E: Exception do
      begin
        send(ctxt, error(E.Message));
        WriteLog('db.storedproc.open()' + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

procedure Tsp.onInParam(sp: TUniStoredProc; param: Pjson);
var
  i: integer;
  p: Tuniparam;
  pname: string;
begin
  try
    for i := 0 to sp.Params.Count - 1 do
    begin
      p := sp.Params[i];
      pname := p.Name;
      if sametext('return_value', pname) then continue;
      if p.ParamType in [ptUnknown, ptOutput, ptResult, ptInputOutput] then continue;
      case p.DataType of
        ftstring, ftwidestring: p.AsWideString := param.s[pname];
        ftLargeint: p.AsLargeInt := param.i[pname];
        ftInteger: p.AsInteger := param.i[pname];
        ftboolean: p.AsBoolean := param.b[pname];
        ftfloat, ftCurrency: p.AsFloat := param.d[pname];
        ftDateTime: p.AsDateTime := param.d[pname];
      end;
    end;
  except
    on E: Exception do
    begin
      send(ctxt, error(E.Message));
      WriteLog('db.storedproc.onInParam()' + E.Message);
    end;
  end;
end;

procedure Tsp.onOutParam(sp: TUniStoredProc; var param: Tjson);
var
  p: Tuniparam;
  i: integer;
  pname: string;
begin
  try
    for i := 0 to sp.Params.Count - 1 do
    begin
      p := sp.Params[i];
      pname := p.Name;
      if sametext(pname, 'return_value') then continue;
      if p.ParamType in [ptUnknown, ptInput, ptResult] then continue;
      case p.DataType of
        ftstring, ftwidestring: param.S[pname] := p.AsWideString;
        ftLargeint: param.I[pname] := p.AsLargeInt;
        ftInteger: param.I[pname] := p.AsInteger;
        ftBoolean: param.B[pname] := p.AsBoolean;
        ftFloat, ftCurrency, ftDateTime: param.D[pname] := p.AsFloat;
      end;
    end;
  except
    on E: Exception do
    begin
      send(ctxt, error(E.Message));
      WriteLog('db.storedproc.onOutParam()' + E.Message);
    end;
  end;
end;

end.

json入参

{
    "procname":"sp_9",
    "inparam":{"goodsid":"100036"}
}

 

标签:存储,end,sp,DB,begin,param,pname,unidac,过程
From: https://www.cnblogs.com/hnxxcxg/p/18591750

相关文章

  • firedac存储过程
    firedac存储过程 unitDB.storedproc;//cxg2024-12-7//存储过程{$idef.inc}interfaceuses//mormot------mormot.core.variants,//my-------DB.firedac,sys.global,DB.firedacpool,dataset.Serialize,//firedac-------firedac.comp.Clie......
  • Linux磁盘存储概念
    本文为UbuntuLinux操作系统-第六弹今天开始新的知识点,讲磁盘存储问题上期回顾:Linux文件、目录权限问题今天由帝皇侠陪伴大家学习!!!文章目录磁盘数据组织低级格式化磁盘分区高级格式化磁盘设备命名磁盘分区分区样式:MBR与GPT磁盘分区命名Linux文件系统概述ext4文......
  • 数据在内存中的存储
    数据类型的介绍char    //字符数据类型short   //短整型int    //整形long    //长整型longlong //更长的整形float   //单精度浮点数double   //双精度浮点数这些都是我们常见的基本的内置类型以及了解它们所占存......
  • 探索Redis:使用Redis存储和检索聊天消息历史
    #探索Redis:使用Redis存储和检索聊天消息历史Redis(RemoteDictionaryServer)是一款开源的内存存储系统,被广泛用于分布式内存键值数据库、缓存和消息代理,同时支持可选的持久性。由于其设计和内存存储特性,Redis提供了低延迟的读写操作,因而非常适合需要缓存的用例。Redis是最......
  • 一文了解MySQL写缓冲Change Buffer(定义 作用 执行过程 触发时机 业务场景)
    MySQL的数据存储包含内存与磁盘两个部分,内存缓冲区bufferpool以页为单位,缓存最热的数据页datapage与索引页indexpage,InnoDB以变种LRU算法管理缓冲池,并且解决了预读失效和缓冲池污染的问题。对于读请求,缓冲池可以减少磁盘IO,提升性能,那么写请求呢?思考2个场景:场景1:假设要......
  • 常规加载器技术(Conventional Loader Techniques)主要用于操作系统中,负责将程序加载到内
    在Web开发中,常规加载器和高阶技巧加载器(或优化器)是实现更高效资源加载和提升性能的关键技术。常规加载器通常是一些基础的加载机制,而高阶技巧加载器则是更高级的优化方法,能够精细化地控制资源的加载时机和顺序,提升页面的加载性能和用户体验。常规加载器(基础加载器)懒加载(Lazy......
  • 鸿蒙NEXT开发中如何确保使用 PersistentStorage 存储的数据安全?
    大家好,我是V哥,在鸿蒙NEXT开发中,我们会使用PersistentStorage来存储一些数据,那问题来了,如何确保使用PersistentStorage存储的数据安全呢,今天的内容来聊一聊这个话题。首先,确保PersistentStorage存储的数据安全,我们可以考虑以下这些方面:数据加密:静态数据加密:对存储......
  • PROFINET - IO 的启动过程
    DCPdcp是发现和基本配置协议的简称,实现在以太网链路层。通常处理profinet系统中网络地址和设备名称的管理。IdentifyAllIdentifySetSet>FlashSet>ResettoFactoryGetHelloIdentifyAll,识别全部(多播服务组);可以快速查找所有连接的PN设备的设备名,IP地址,子网掩......
  • Number()的存储空间是多大?假如接口返回一个超过最大字节的数字怎么办?
    在JavaScript中,Number()表示的是JavaScript的Number类型,它遵循IEEE754标准,使用双精度浮点数来存储数字。这意味着Number类型占用64位(8字节)的内存空间。由于Number使用浮点数表示,它并不能精确地表示所有数字,尤其是在处理非常大或非常小的数字时。当接口返回一个......
  • 单片机中的中断处理过程
    单片机(MicrocontrollerUnit,MCU)是一种集成了处理器、存储器以及输入输出接口的微型计算机,广泛应用于各种嵌入式系统中。在单片机的应用开发中,中断系统是不可或缺的一部分,它使得单片机能及时响应并处理外部或内部的中断请求,从而实现高效的任务调度与管理。中断的基本概念中......