Foxnic-SQL (9) —— DAO 特性 : 执行存储过程与函数

LeeFJ
• 阅读 301

Foxnic-SQL (9) —— DAO 特性 : 执行存储过程与函数

概述

  Foxnic-SQL 对函数与存储过程的调用做了简化,使调用过程尽量简洁。虽然现在新构建的应用越来越不提倡使用数据库存储过程与函数,但是它们还是非常广泛地被使用着。任何技术的使用,一是看场景,而是看使用者,存储过程和函数不应被抛弃。
  本文中的示例代码均可在 https://gitee.com/LeeFJ/foxnic-samples 项目中找到。

定义存储过程

  首先,在数据库创建存储过程和函数,存储过程的特点是多个参数,多个返回值。函数的特点是多个参数,一个返回值。当然,从数据库角度它们还有其它的区别,我们不做展开,在此我们只关心调用的形式。示例代码如下:

CREATE DEFINER=`foxnic`@`%` PROCEDURE `demo_proc`
(
 IN a decimal(8,2),
 IN b decimal(8,2),
 OUT c decimal(8,2),
 OUT d decimal(8,2)
)
BEGIN
  set c=a+b;
  set d=a*b;
END
CREATE DEFINER=`foxnic`@`%` FUNCTION `demo_func`(
  a decimal(8,2),
  b decimal(8,2)
) RETURNS decimal(8,2) DETERMINISTIC
BEGIN
    RETURN a+b;
END

调用函数

  函数的调用相对比较简单,也就是传入参数返回结果,示例代码如下:

/**
* 数据库函数调用测试
* */
@Test
    public void test_func() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao= DBInstance.DEFAULT.dao();
    // 从 dao 拿到存储函数对象
    StoredFunction<BigDecimal> function =dao.getStoredFunction("demo_func",BigDecimal.class);
    // 按顺序传入参数
    BigDecimal result= function.execute(1.1,2.2);
    // 检查结果
    assertTrue(result.doubleValue()==3.30);
}

  针对 StoredFunction 类由于它只有一个返回值,Foxnic-SQL 使用了泛型的方式来简化参数定义。通过 DAO 拿到 StoredFunction 对象,通过 execute 方法按顺序传入参数,执行即可。

调用存储过程

  由于存储过程可以是多入参、多出参,所以它的调用过程相对复杂一点。它需要有参数类型定义,map 参数传入并执行,返回多个结果值等几个步骤,示例代码如下:

/**
* 数据库存储过程调用测试
* */
@Test
    public void test_proc() {
    // 通过 DBInstance 拿到 DAO 对象
    DAO dao= DBInstance.DEFAULT.dao();
    // 从 dao 拿到存储过程对象
    StoredProcedure procedure =dao.getStoredProcedure("demo_proc");
    // 定义参数
    procedure.declareParameter("a", DBDataType.STRING);
    procedure.declareParameter("b", DBDataType.DECIMAL);
    procedure.declareOutParameter("c",DBDataType.DECIMAL);
    procedure.declareOutParameter("d",DBDataType.DECIMAL);
    // 传入 Map 类型参数
    Map<String,Object> result= procedure.execute(MapUtil.asMap("a",1.1,"b",2.2));
    // 获得多个返回值
    BigDecimal c=(BigDecimal) result.get("c");
    BigDecimal d=(BigDecimal) result.get("d");
    // 检查结果
    assertTrue(c.doubleValue()==3.30);
    assertTrue(d.doubleValue()==2.42);
}

小结

  本节主要介绍了在 Foxni-SQL 中如何调用数据库的存储过程与函数。存储过程与函数在传参的形式以及接收返回值的形式上有着比较明显的差异。

相关项目

  https://gitee.com/LeeFJ/foxnic
  https://gitee.com/LeeFJ/foxnic-web
  https://gitee.com/lank/eam
  https://gitee.com/LeeFJ/foxnic-samples

官方文档
  http://foxnicweb.com/docs/doc.html
点赞
收藏
评论区
推荐文章
艾木酱 艾木酱
3年前
PostgreSQL的函数和存储过程--MemFireDB
简介PostgreSQL是最流行的对象关系型数据库系统。它是一个强大的、高性能的数据库系统。在这篇文章中,我们将讨论如何使用函数和存储过程来执行操作,如插入、删除、更新和查询。感兴趣的同学可以通过memfiredb.com提供的免费云数据库一边操作一边阅读。函数一般来说,函数是一组进行任何操作的SQL语句,如选择、插入、删除和更新。在PostgreSQ
Wesley13 Wesley13
3年前
MySQL数据库表设计规范
一、数据库设计1、一般都使用INNODB存储引擎,除非读写比率<1%,才考虑使用MYISAM存储引擎;其他存储引擎请在DBA的建议下使用。2、Storedprocedure(包括存储过程,函数,触发器)对于MYSQL来说还不是很成熟,没有完善的出错记录处理,不建议使用。3、UUID(),USER()这样的
Stella981 Stella981
3年前
IDA Pro 权威指南学习笔记(十)
栈帧(stackframe)是在程序的运行时栈中分配的内存块,用于特定的函数调用如果一个函数没有执行则不需要内存,当函数被调用时就需要用到内存1.传给函数的参数的值需要存储到函数能够找到它们的位置2.函数在执行过程中可能需要临时的存储空间,通过声明局部变量来分配这类临时空间,这些变量在函数内部使用,函数调用完后,就无法再访问它们
Wesley13 Wesley13
3年前
MySQL管理与优化(9):存储过程和函数
存储过程和函数存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合。存储过程或函数的相关操作创建,修改存储过程或函数相关语法CREATEDEFINER{user|CURRENT_USER}PROCE
Wesley13 Wesley13
3年前
mysql——定义——存储过程和函数——概念
存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当作一个整体存储在服务器中一、创建存储过程语法格式:createproceduresp_name(proc_parameter……)ch
Wesley13 Wesley13
3年前
mysql存储过程和自定义函数
存储过程简介SQL语句需要先编辑后执行,而存储过程是一组为了完成特定功能的SQL语句集,经编译后存储过程在数据库中,用户通过制定存储过程的名字并传给参数来调用它。存储过程是可编程的函数,在数据库中创建并保持,可以由SQL和控制结构组成。档想要在不同的应用平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的,数据库中的存储过程可以看错
Stella981 Stella981
3年前
SQL Server数据库基础知识——存储过程
SQLServer数据库基础知识存储过程概述什么是存储过程?存储过程的种类如何创建、修改、删除、调用存储过程?存储过程的优缺点存储过程和触发器的区别?存储过程和函数的区别?
Easter79 Easter79
3年前
SQL Server数据库基础知识——存储过程
SQLServer数据库基础知识存储过程概述什么是存储过程?存储过程的种类如何创建、修改、删除、调用存储过程?存储过程的优缺点存储过程和触发器的区别?存储过程和函数的区别?
Wesley13 Wesley13
3年前
Mysql存储过程
SQL语句需要先编译然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时
Wesley13 Wesley13
3年前
mysql存储过程和函数(一)
  存储过程和函数是事先经过编译并存储在数据库的一段sql语句集合,调用存储过程和函数可以简化应用程序开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对提高数据运行效率是有好处的。  存储过程和函数的区别在于函数必须有返回值,而存储过程却没有,存储过程的参数可以使用IN,OUT,INOUT类型,而函数的参数只能使用IN类型,  在对存储过