数据库存储过程:传递表值参数,其中表值中局部变量循环插入数据库表中。好难,真的好难!!!

_明月 2017-09-01 09:16:05
加精

背景介绍:Tclass.java班级类,Student.java学生类。其中,Student类在Class类中充当一个属性。Tclass类、学生类属性定义如下。代码中省略get/set方法。

// Student.java类
public class Student {

private String sName;

private int sAge;

// 此处省略get/set方法
}

//Tclass.java类
public class Tclass {

private String cName;

private int cId;

private Timestamper cTime;

private List<Student> students;

// 此处省略get/set方法
}



需求:需要写一存储过程,将前台传递过来的JSON数据,调用存储过程将数据插入到tb_class表中。

对于前台传递过来的JSON数据,我个人已经使用Spring Boot框架成功将数据解析成Tclass对象,在这里各位就不必浪费时间去考虑前台传递JSON数据的事情。将已经转换成Tclass对象的JSON数据,以表值参数传递进存储过程中。

在这里,一个最大的难点在于,Tclass中的 private List<Student> students数据个数、内容信息可变,需要在存储过程中需要使用循环,依次遍历students集合中的数据,将数据插入到数据库tb_class表中。在遍历students集合插入数据过程中,Tclass.java中的 cName, cId, cTime字段信息是不变。

也就是说,在存储过程中,需要解决的2大难点在于:(1)、如何将Tclass.java类中不变的属性cName, cId, cTime与需要循环遍历且可变的List<Student> students 数据插入到tb_class表中? (2)、控制插入过程中事务一致性的问题。例如,List<Student> students中包含3条不同的数据,前2条插入成功,最后一条信息插入失败。但是需要控制当所有数据全部插入成功,事务才可提交,否则回滚。在执行3条数据插入的过程中,我还需要获取到每一条数据表中的主键,用以将这个主键cId值插入到另外一张表tb_School中。


对于tb_class表的结构,其字段类型与字段名称如下:

cName varchar(64),
cId int,
cTime dataTime,
sName varchar(64),
sAge int



=====================================================

以上是关于我遇到的数据库存储过程编写的问题!以下是java代码实现时,遇到的问题。

如果以上数据库存储过程解决,那么在Java程序代码中,又该如何去调用该存储过程? 将前台传递过来的JSON(已经解析成Tclass对象)以表值参数传递运用到存储过程中呢?



=====================================================
关于存储过程,我个人写了部分代码。对于存储过程部分,我问题中描述的需要循环遍历List<Student> students,好像需要用到数据库游标的知识。


USE [Test_Class] -- 使用Test_Class数据库
Go
SET ANSI_NULLS ON -- 设置编码格式
GO
SET QUOTED_IDENTIFIER ON
GO

/* 创建表类型 */
create type tb_TestClass as table(cName varchar(64), cId int,
cTime dateTime, sName varchar(128),
sAge int);
GO
CREATE PROCEDURE [dbo].[proc_user_tClass](@ManyRows as tb_TestClass readonly)
AS
BEGIN TRY -- 开启事物

insert into TB_Class(cName, cId, cTime, sName,sAge)
select cName, cId, cTime, sName,sAge from @ManyRows;

END

-- 以上就是关于需求中,我个人最大能力所能编写的存储结构!但是,这个存储结构远远无法满足需求!




java代码实现时:如何将已经转换成Tclass对象的JSON数据,以数据库表值参数的形式,传递运用到存储过程中呢?

关于在Java代码中的实现,我一筹莫展,不知道该怎么去解决!


好难,真的是好难。这个是我在项目开发过程中遇到的一个非常棘手的问题。对于我在项目中遇到的问题,和我以上描述的问题差不多,其中项目中的问题还要比这个难一点!





...全文
5813 62 打赏 收藏 转发到动态 举报
写回复
用AI写文章
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigworlddong 2017-10-09
  • 打赏
  • 举报
回复
学习到了,谢谢楼主分享
  • 打赏
  • 举报
回复
学习了,谢谢
lei_Dream 2017-09-29
  • 打赏
  • 举报
回复
非常不错,值得学习
qq_36631267 2017-09-28
  • 打赏
  • 举报
回复
可以把数据以字符串的形式传递到存储过程,数据要有分隔符,在存储过程拆解传递过来的字符串,然后存入临时表
weixin_40338074 2017-09-21
  • 打赏
  • 举报
回复
看了头晕,作为一名初学者,继续深入学习
fdb220 2017-09-14
  • 打赏
  • 举报
回复
好学习了。。。。。。。
_明月 2017-09-13
  • 打赏
  • 举报
回复
引用 49 楼 xmt1139057136 的回复:
java和数据库啊 www.xttblog.com www.codedq.net http://www.ndislwf.com 业余草 CODE大全 爱分享 欢迎关注我的个人微信公众号:业余草(yyucao)!
谢谢您 希望您能够将您的头像该一下,这个头像看着有些“拧巴”!
业余草 2017-09-13
  • 打赏
  • 举报
回复
-伊凡- 2017-09-12
  • 打赏
  • 举报
回复
mark一下,有空再仔细看一下
业余草 2017-09-12
  • 打赏
  • 举报
回复
java和数据库啊 www.xttblog.com www.codedq.net http://www.ndislwf.com 业余草 CODE大全 爱分享 欢迎关注我的个人微信公众号:业余草(yyucao)!
吉普赛的歌 2017-09-09
  • 打赏
  • 举报
回复
/*
-- 我在存储过程中,已经创建了一个表 tb_person04,现在我想将Email字段改成 Address ,而且类型也改变一下
CREATE TABLE tb_person04
(
    ID int identity(1,1) PRIMARY KEY NOT NULL,
    NAME varchar(64),
    AGE INT,
    SEX char(4)
    Email varchar(512)  -- 该字段为遗漏字段,如何在已经创建的tb_person04表中添加呢?
)
*/

--1. 加新字段
ALTER TABLE tb_person04 ADD [Address] NVARCHAR(500) 
--2. 将旧字段的值更新到新字段
UPDATE tb_person04 SET [Address]=[Email]
--3. 删除旧字段
ALTER TABLE tb_person04 DROP COLUMN [Email]
_明月 2017-09-09
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
又 @ me => 又不 @ me
真的抱歉,刚刚在存储过程中创建表的语句出错,我重新写一个。

create type testTable as table
(
    ID int identity(1,1) PRIMARY KEY NOT NULL,
    NAME varchar(64),
    AGE INT,
    SEX char(4),
    Email varchar(512) 
)

现在我想将表testTable中Email字段改成Address,而且类型也改变一下,我该如何操作呢?
_明月 2017-09-09
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
又 @ me => 又不 @ me
你好,我目前在SQL Server存储过程这里又遇到一个问题。 如,我在存储过程中,已经创建了一个表 tb_person04,现在我想将Email字段改成Address,而且类型也改变一下,我该如何操作呢?

CREATE TABLE tb_person04
(
	ID int identity(1,1) PRIMARY KEY NOT NULL,
	NAME varchar(64),
	AGE INT,
	SEX char(4)
	Email varchar(512)  -- 该字段为遗漏字段,如何在已经创建的tb_person04表中添加呢?
)
GO


_明月 2017-09-09
  • 打赏
  • 举报
回复
引用 47 楼 yenange 的回复:
[quote=引用 46 楼 dear_Alice_moon 的回复:] [quote=引用 45 楼 yenange 的回复:]
/*
-- 我在存储过程中,已经创建了一个表 tb_person04,现在我想将Email字段改成 Address ,而且类型也改变一下
CREATE TABLE tb_person04
(
    ID int identity(1,1) PRIMARY KEY NOT NULL,
    NAME varchar(64),
    AGE INT,
    SEX char(4)
    Email varchar(512)  -- 该字段为遗漏字段,如何在已经创建的tb_person04表中添加呢?
)
*/

--1. 加新字段
ALTER TABLE tb_person04 ADD [Address] NVARCHAR(500) 
--2. 将旧字段的值更新到新字段
UPDATE tb_person04 SET [Address]=[Email]
--3. 删除旧字段
ALTER TABLE tb_person04 DROP COLUMN [Email]
真是不好意思,周六还在打扰您。 您给的新增字段信息语句,在存储过程中用不了。另外2条语句,我猜测可能也无法使用。 我目前的一个思路是,将在存储过程中创建的表xr_Table表删除,之后再重新创建。 我今天下午查一查看看如何删除存储过程中创建的表,谢谢。
[/quote] 你这个是不是表, 是表值类型。 这个表值类型参数是只读的, 不可能在存储过程里改来改去的了。 弄错了不能改就重新创建一个新的表值类型,存储过程也重新对应改一下, 不要纠结了。 [/quote] 好的,谢谢您。 我周日试一试,谢谢。
吉普赛的歌 2017-09-09
  • 打赏
  • 举报
回复
引用 46 楼 dear_Alice_moon 的回复:
[quote=引用 45 楼 yenange 的回复:]
/*
-- 我在存储过程中,已经创建了一个表 tb_person04,现在我想将Email字段改成 Address ,而且类型也改变一下
CREATE TABLE tb_person04
(
    ID int identity(1,1) PRIMARY KEY NOT NULL,
    NAME varchar(64),
    AGE INT,
    SEX char(4)
    Email varchar(512)  -- 该字段为遗漏字段,如何在已经创建的tb_person04表中添加呢?
)
*/

--1. 加新字段
ALTER TABLE tb_person04 ADD [Address] NVARCHAR(500) 
--2. 将旧字段的值更新到新字段
UPDATE tb_person04 SET [Address]=[Email]
--3. 删除旧字段
ALTER TABLE tb_person04 DROP COLUMN [Email]
真是不好意思,周六还在打扰您。 您给的新增字段信息语句,在存储过程中用不了。另外2条语句,我猜测可能也无法使用。 我目前的一个思路是,将在存储过程中创建的表xr_Table表删除,之后再重新创建。 我今天下午查一查看看如何删除存储过程中创建的表,谢谢。
[/quote] 你这个是不是表, 是表值类型。 这个表值类型参数是只读的, 不可能在存储过程里改来改去的了。 弄错了不能改就重新创建一个新的表值类型,存储过程也重新对应改一下, 不要纠结了。
_明月 2017-09-09
  • 打赏
  • 举报
回复
引用 45 楼 yenange 的回复:
/*
-- 我在存储过程中,已经创建了一个表 tb_person04,现在我想将Email字段改成 Address ,而且类型也改变一下
CREATE TABLE tb_person04
(
ID int identity(1,1) PRIMARY KEY NOT NULL,
NAME varchar(64),
AGE INT,
SEX char(4)
Email varchar(512) -- 该字段为遗漏字段,如何在已经创建的tb_person04表中添加呢?
)
*/

--1. 加新字段
ALTER TABLE tb_person04 ADD [Address] NVARCHAR(500)
--2. 将旧字段的值更新到新字段
UPDATE tb_person04 SET [Address]=[Email]
--3. 删除旧字段
ALTER TABLE tb_person04 DROP COLUMN [Email]


真是不好意思,周六还在打扰您。

您给的新增字段信息语句,在存储过程中用不了。另外2条语句,我猜测可能也无法使用。

我目前的一个思路是,将在存储过程中创建的表xr_Table表删除,之后再重新创建。

我今天下午查一查看看如何删除存储过程中创建的表,谢谢。








繁花尽流年 2017-09-07
  • 打赏
  • 举报
回复
推荐贴?????
husoffer 2017-09-07
  • 打赏
  • 举报
回复
感谢楼主,来集成试试看能不能用起来~~~~
hugh_z 2017-09-05
  • 打赏
  • 举报
回复
学习了.给楼主32赞.
加载更多回复(37)

6,129

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 新技术前沿
社区管理员
  • 新技术前沿社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧