Foxnic-SQL(九)——DAO特性:执行存储过程和函数概述Foxnic-SQL简化了函数和存储过程的调用,使调用过程尽可能简洁。尽管在新建的应用程序中越来越不鼓励使用数据库存储过程和函数,但它们仍然被广泛使用。任何技术的使用,首先要看场景,更要看用户。不应放弃存储过程和函数。本文中的示例代码可以在https://gitee.com/LeeFJ/foxnic-samples项目中找到。定义存储过程首先,在数据库中创建存储过程和函数。存储过程的特点是有多个参数和多个返回值。函数的特点是有多个参数和一个返回值。当然,从数据库的角度来看,它们之间还有其他的区别,我们不展开,这里只关心调用的形式。示例代码如下:CREATEDEFINER=`foxnic`@`%`PROCEDURE`demo_proc`(INadecimal(8,2),INbdecimal(8,2),OUTcdecimal(8,2),OUTddecimal(8,2))BEGINsetc=a+b;setd=a*b;ENDCREATEDEFINER=`foxnic`@`%`FUNCTION`demo_func`(adecimal(8,2),bdecimal(8,2))RETURNSdecimal(8,2)DETERMINISTICBEGINRETURNa+b;END调用函数函数的调用比较简单,就是传入参数,返回结果。示例代码如下:/***数据库函数调用test**/@Testpublicvoidtest_func(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//从dao函数中获取存储的函数对象StoredFunction=dao.getStoredFunction("demo_func",BigDecimal.class);//传入参数BigDecimalresult=function.execute(1.1,2.2);//检查结果assertTrue(result.doubleValue()==3.30);}对于StoredFunction类,因为它只有一个返回值,所以Foxnic-SQL使用泛型来简化参数定义。通过DAO获取StoredFunction对象,通过execute方法依次传入参数,执行。调用存储过程由于存储过程可以有多个输入参数和多个输出参数,因此其调用过程相对复杂。需要有参数类型定义,map参数传入执行,返回多个结果值。示例代码如下:/***数据库存储过程调用test**/@Testpublicvoidtest_proc(){//通过DBInstance获取DAO对象DAOdao=DBInstance.DEFAULT.dao();//从daoStoredProcedure中获取存储过程对象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类型参数Mapresult=procedure.execute(MapUtil.asMap("a",1.1,"b",2.2));//获取多个返回值BigDecimalc=(BigDecimal)result.get("c");BigDecimald=(BigDecimal)result.get("d");//检查结果assertTrue(c.doubleValue()==3.30);assertTrue(d.doubleValue()==2.42);}总结本节主要介绍如何在Foxni-SQL中调用数据库的存储过程和函数。存储过程和函数在参数传递的形式和接收返回值的形式上有明显的区别。相关项目https://gitee.com/LeeFJ/foxnichttps://gitee.com/LeeFJ/foxnic-webhttps://gitee.com/lank/eamhttps://gitee.com/LeeFJ/foxnic-samples官方文档http://foxnicweb.com/docs/doc.html