firedac的TFDStoredProc动态创建并调用存储过程
1)中间件执行存储过程
sp.Close;
sp.StoredProcName := procName;
sp.Prepare; // 生成存储过程的参数列表,无任何OUTPUT的存储过程,也会自动生成一个@ReturnValue的返回值参数
params := TFDParams.Create;
try
UnpackFDParams(inParams, params); // 还原客户端上传的参数
for i:=0 to params.Count -1 do
for h:=0 to d.procOpen.ParamCount-1 do
if sp.Params[h].Name = params[i].Name then
begin
sp.Params[h].Value := params[i].Value; // 给存储过程的参数赋值
Break;
end;
finally
params.Free;
end;
sp.open;
2)客户端调用远程方法执行存储过程
procedure TfrmMain.Button2Click(Sender: TObject);
begin
cds2.Params.Clear;
cds2.Params.CreateParam(ftString,'@workno',ptInput).Value :='1'; // 参数前面记得要加@
cds2.Data := ProcOpen('9999','3',PackageParams(cds2.Params));
end;
3)带OUTPUT的存储过程
function TServerMethods1.spOpenOut(const accountNo, spName: WideString; inParams: OleVariant): OleVariant;
var
d: TfrmDB;
params: TFDParams;
i: Integer;
param: TFDParam;
begin
Result := null;
if (accountNo = '') or (spName = '') then
Exit;
d := GetDBPool(accountNo).Lock;
if not Assigned(d) then
Exit;
try
try
d.procOpen.Close;
d.procOpen.StoredProcName := spName;
d.procOpen.Prepare;
params := TFDParams.Create;
try
UnpackFDParams(inParams, params);
for i := 0 to params.Count - 1 do
begin
param := d.procOpen.FindParam(params[i].Name);
if not Assigned(param) then
Continue;
param.value := params[i].value;
end;
finally
params.Free;
end;
Result := VarArrayCreate([0, 1], varVariant);
Result[0] := d.dspProcOpen.Data; // 查询数据集
Result[1] := PackageFDParams(d.procOpen.params); // OUTPUT参数
except
on e: Exception do
begin
Result := null;
Log.WriteLog('TServerMethods1.spOpenOut ' + e.Message);
Exit;
end;
end;
finally
d.procOpen.Close;
GetDBPool(accountNo).Unlock(d);
end;
end;
firedac的TFDStoredProc动态创建并调用存储过程的更多相关文章
- CXF 动态创建客户端调用稳定版本号为2.7.18
今天用动态创建客户端的方式调用webservice,报了这样一个错: 2017-01-05 20:51:46,029 DEBUG main org.apache.cxf.common.logging. ...
- SQL serve创建与调用存储过程
(1)创建 2编写存储过程(创建传参的存储过程)存储过程语法网络上很多不在累述 语法解析 Use Person 指定在那个数据库下建立存储过程 if (object_id('MyFunction', ...
- Oracle创建及调用存储过程
- 对xxl-job进行simpleTrigger并动态创建任务扩展
业务场景 需求上要求能实现quartz的simpleTrigger任务,同时还需要动态的创建任务而非在控制面板上创建,查阅xxl-job官方文档发现simpelTrigger其暂时还躺在to do l ...
- javascript动态创建script标签,加载完成后调用回调
代码如下: var head = document.getElementsByTagName('head')[0]; var script = document.createElement('scri ...
- PL/Sql 中创建、调试、调用存储过程
存储过程的详细建立方法 1.先建存储过程 左边的浏览窗口选择 procedures ,会列出所有的存储过程,右击文件夹procedures单击菜单"new",弹出 template ...
- Oracle 存储过程的创建,及触发器调用存储过程
一.创建存储过程 1.存储过程写法 create or replace procedure HVM_BYQ_TJ --变压器统计信息--->入库 (id in number) as begin ...
- iBatis调用存储过程以及MySQL创建存储过程
首先是MySQL中创建存储过程的SQL -- 列出全部的存储过程 SHOW PROCEDURE STATUS; -- 查看一个已存在的存储过程的创建语句,假设此存储过程不存在,会提示SQL错误(130 ...
- Oracle存储过程创建及调用(转)
在大型数据库系统中,有两个很重要作用的功能,那就是存储过程和触发器.在数据库系统中无论是存储过程还是触发器,都是通过SQL 语句和控制流程语句的集合来完成的.相对来说,数据库系统中的触发器也是一种存储 ...
随机推荐
- 异常强大的Markdown编辑插件-Markdown Preview Enhanced
最近使用Markdown写作,了解到以下这些Markdown写作工具 MaHua 在线markdown编辑器 百度搜索Markdown时,它排在非常靠前的位置 马克飞象- 专为印象笔记打造的Markd ...
- 枚举详解之EnumSet、EnumMap用法
枚举简单例子 /** * @author shuliangzhao * @Title: Color * @ProjectName design-parent * @Description: TODO ...
- Lambda表达式怎么写SQL中的in?
ambda表达式查询没有IN这个方法,可以变通一下,in查询的数组是否包含在映射对象里面的集合里 直接贴代码吧,一看就懂了 class Program { static void Main(strin ...
- ACM_栈的压入、弹出序列
栈的压入.弹出序列 Time Limit: 2000/1000ms (Java/Others) Problem Description: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列 ...
- [转]Linux命令之iconv
转自:http://lorna8023.blog.51cto.com/777608/420313 用途说明 iconv命令是用来转换文件的编码方式的(Convert encoding of given ...
- layer实现在前台删除前确认弹出框,并回调后台删除事件
最近遇到一些问题,用layer提示消息框,比如删除时,提示消息确定后 return false时,则不管用了,因为layer不支持阻塞,下面就解决一下这个问题:(本文使用Xcode,如要学习,请复下面 ...
- Laravel 5.4.36 session 发现
由于Laravel session机制完全脱离了PHP自带的session机制 因此对于php.ini 配置session对Laravel 是不会产生影响 代码路径: vendor/larav ...
- JS——对象创建
1.原始创建 <script> person = new Object();//不要var person.firstname = "Bill"; person.last ...
- HTML5易漏知识点锦集
本文通过对w3schoolHTML5基础教程,整理出比较常见的却又容易遗忘或者忽略的HTML5相关知识点.本文的标题顺序与w3school中的HTML5基础教程标题顺序保持一致.适合翻阅和复习. 1. ...
- Mapreduce代码疑点(1)
一.Hadoop MultipleInputs.addInputPath 读取多个路径 https://blog.csdn.net/t1dmzks/article/details/76473905 M ...