MyBatis调用sqlserver存储过程(table type参数)
java如何调用表类型参数的存储过程踩坑指南
实践过程
java调用sqlserver存储过程的场景实在少之又少,Java多和mysql共同应用,sqlserver也是.net微软系,即使有调用也可通过接口和服务,直接去操作sqlserver存储过程也是被逼无奈 。客户的财务系统是SqlServer的,现在外围开发一个系统需要传递数据,财务系统没有提供对外接口和服务,只能硬着头皮自行实现。
原来有对接过的系统都是直接调用财务系统内的存储过程,里面逻辑还比较复杂,而且又要求性能,故而第一方案还是直接调用存储过程;如果实在走不通,考虑时间要求,那就暂选第二种方案将存储过程逻辑用java代码实现。
参数说明
当然存储过程是有特殊之处,不是普通参数的存储过程,因为需要提交集合数据至存储过程做业务处理,所以在存储过程的参数中用到table type,可以传入一个集合。如何使用java成功调用并返回需要注意细节。
表类型
在 SQL Server 2008 中,用户定义表类型是指用户所定义的表示表结构定义的类型。您可以使用用户定义表类型为存储过程或函数声明表值参数,或者声明您要在批处理中或在存储过程或函数的主体中使用的表变量。有关如何定义表结构的详细信息,请参阅 CREATE TABLE (Transact-SQL)。
若要创建用户定义表类型,请使用 CREATE TYPE 语句。为了确保用户定义表类型的数据满足特定要求,您可以对用户定义表类型创建唯一约束和主键。
存储过程代码
ALTER proc [dbo].[AA_AA_Sp_ZJ_FHD_Insert_Steoak](
@cacc_id varchar(100),--账套ID号
@dDate varchar(100),--订单日期
@cSTCode varchar(100),--销售类型
@cSTName varchar(100),--销售类型名称
@cDeptCode varchar(100),--销售部门
@cPersonCode varchar(100),--业务员
@cCusCode varchar(100),--客户编码
@cCusName varchar(200),--客户名称
@LogBy varchar(100),--制单、审核
@cMemo varchar(200),--备注
@iTaxRate varchar(200),--税率
@cShipAddress varchar(200),--车号
@cDefine2 varchar(200),--名称
@CarNumber varchar(50),--发货单 代销发货单 的cardnumber 01 发货单 05委托代销发货单
@cVouchType varchar(50),--发货单 05
***@invoiceDetails dbo.InvoiceDetailType READONLY,***
@SheetID varchar(50) output,--单号串
@msg varchar(200) output
)
table type 定义
CREATE TYPE [dbo].[InvoiceDetailType] AS TABLE(
[cWhCode] [nvarchar](200) NOT NULL,
[cInvCode] [nvarchar](200) NOT NULL,
[cInvName] [nvarchar](200) NOT NULL,
[iQuantity] [float] NULL,
[cBatch] [nvarchar](200) NULL,
[bBatchProperty1] [float] NULL,
[bBatchProperty2] [float] NULL,
[bBatchProperty3] [float]