订单表和订单明细表的插入,删除问题

hezhou414 2007-04-09 06:53:46
我有两个表,一个是订单表(Oid,Rid,TotalPrice,....),一个是订单明细表(Oid,Bid,Quantity),其中订单明细表的订单ID和书ID为组合主键。现在我的问题是,要写一个存储过程,能插入一条记录到定单表的同时,能插入订单明细表。比如,我的一个订单,其中有3种书,这3种书的购买数量又不一样,有这些书的总价格,我要把这些记录插入到这两个表中,如何实现啊?
问题是sql没有数组变量,每次订单的订单条目,也就是要插入明细表的记录是变化的,怎么实现啊??
求救各位高手,把这个存储过程写出来吧!
...全文
1251 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
bearocean 2007-04-10
  • 打赏
  • 举报
回复
这种方案应该是可以的。
或者不使用存储过程...存储过程感觉上把业务逻辑剥离到数据库里了,很多书说更模块话了,实际我就觉得这话有点玄,个人对模块化的理解不同.我不大喜欢存储过程.
虽然可能性能好点.

另外关于购物车要不要存到数据库取决于你有没有必要保存用户有买什么东西的想法(注意是有想法而不一定是真的买了,否则就成定单了)除非你想挖掘客户的消费倾向而要收集这些数据..
否则写在session里就可以.

如果希望用户再次登陆的时候能够保留构物车里的物品信息.
写coockie也可以实现.
lsj19830812 2007-04-10
  • 打赏
  • 举报
回复
收csdn消息吧
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
您把qq号码告诉我,我就给分结贴了哦。我的是364628388
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
难道没有一个规范的吗?我能加你qq吗?以后我有什么问题可以直接问您啊,老大
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
只有看别人代码喽
购物车如果数据不大直接存session中就可以啊
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
现在一般的购物车的数据库操作是什么样的?我觉得应该有更合理的方案,不知道购物车是不是也要做一个表呢还是怎么搞啊?我菜,希望您能再多指点指点
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
另外你可以在页面上用js控制拼成的这个字符串的长度
如果太长则提示不能一次性处理这么多即可
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
对,是有这个问题
但再多能有多少数据
传入定义成clob,多大都可以接收
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
其实我觉得这样做有个问题,必须把1001|A001|NUM1#1001|B001|NUM2#这个字符串的变量定义得很大,如果说我的这个订单的条目很多,一次性买了很多东西,而且超过了你定义的这个长度怎么办?疑惑中......
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
CHARINDEX ( expression1 , expression2 [ , start_location ] )

expression1
包含要查找的字符序列的表达式。expression1 参数是 ntext 类型或可隐式转换为 nvarchar 数据类型的表达式。

expression2
通常用于搜索指定序列的列的表达式。expression2 参数是 ntext 类型或可隐式转换为 nvarchar 数据类型的表达式。

start_location
在 expression2 中搜索 expression1 的起始字符位置。如果没有给定 start_location、或者给定值为负数或零,那么搜索将会开始于 expression2 的起始位置。start_location 参数可以是 tinyint、smallint、int 或 bigint。



lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
查一下吧
我下班了
回头再给你查
2000也很强,应该有相应的函数
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
肯定是SQL Server2000啊,晕,不好意思,SQL Server2000的对应的那些函数是什么呢?比如POSSTR在SQL Server2000中是怎么写的啊
jk88811 2007-04-09
  • 打赏
  • 举报
回复
楼主都没说用什么数据库管理系统, 大家就把存储过程都写出来了...

lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
V_CURRENT类似V_TEMP也是临时变量

V_CURRENT初始为1001|A001|NUM1
然后往下
V_OID = 1001
V_CURRENT = A001|NUM1
再往下

V_BID = A001
V_CURRENT = NUM1

再往下

V_NUM = NUM1


hezhou414 2007-04-09
  • 打赏
  • 举报
回复
哇,不过POSSTR,SUBSTR这些方法是SQL函数库里面的方法吗?不会是oracle的吧?
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
对,临时变量

V_TEMP初始为传来的1001|A001|NUM1#1001|B001|NUM2#
这个串

循环一次变成1001|B001|NUM2#

lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
WHILE V_LENGTH>0 DO --当要解析的字符串长度>0继续循环
SET V_POS = POSSTR(V_TEMP,'#');--获取要解析字符串第一个#位置
SET V_CURRENT= SUBSTR( V_TEMP, 1, V_POS-1 );--获取#前面字符串
SET V_TEMP = SUBSTR( V_TEMP, V_POS+1 );--获得#后面字符串作为下次要解析的字符串
SET V_LENGTH = LENGTH(V_TEMP);--更新要解析字符串长度为后面字符串长度

SET V_POS = POSSTR(V_CURRENT,'|'); --获取第一个|位置
SET V_OID= SUBSTR( V_CURRENT, 1, V_POS-1 );--获取|前面字符串
SET V_CURRENT= SUBSTR( V_CURRENT, V_POS+1 );--不说了一样的作用

SET V_POS = POSSTR(V_CURRENT,'|');
SET V_BID= SUBSTR( V_CURRENT, 1, V_POS-1 );
SET V_CURRENT= SUBSTR( V_CURRENT, V_POS+1 );

--最后一个字段,不再截取
SET V_NUM= V_CURRENT;

INSERT INTO TABLE(V_OID,V_BID,V_NUM);
END WHILE;
hezhou414 2007-04-09
  • 打赏
  • 举报
回复
V_TEMP是什么意思啊?临时的字符串吗?
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
V_POS,V_LENGTH 记得DECLARE为INT
其他的都是VARCHAR了
lsj19830812 2007-04-09
  • 打赏
  • 举报
回复
V_POS 当前字符位置啊
POSSTR 获得当前字符位置啊
加载更多回复(6)
技术选型1,前端微信小程序原生框架cssJavaScript2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云数据库云存储 1,小程序端1-1,首页首页有以下几个功能点点餐菜单浏览排号等位拨打电话顶部轮播图搜索菜品这里点餐分两种1,可以设置直接点餐直接点餐:适合小型饭店,或者奶茶类的快餐店。直接就可以下单,不用识别桌号2,也可设置扫码点餐扫码点餐适合中大型饭店,可以区分桌号,方便管理我后面会教大家如何生成桌号二维码,只需要把对应桌号的二维码贴在餐桌上,用户点击 扫码点餐 识别二维码,即可获取到桌号信息。1-2,菜品浏览页菜品浏览分两种1,不带分类适合菜品少的时候2,带分类菜品多的时候,带分类更方便客户选择不带分类 带分类 1-3,搜索功能我们这里搜索有两个触发方式1,直接点击搜索图标2,点击键盘上的搜索键1-4,搜索结果,支持模糊查询如我这里只搜‘鱼’,那么菜品中所有包含鱼的都可以搜索到 1-5,购物车首先菜品列页可以直接添加商品到购物车购物车弹起后可以做如下操作1,增删单个菜品2,清空购物车3,删除菜品这些操作都和菜品列是联动的,也就是菜品列和购物车里增删个数,都是可以同步的。我会在项目预览章节的视频里做具体演示。1-6,下单页下单页就是确认订单后进行下单支付的。有以下功能1,点餐明细2,价格计算3,桌号地址4,就餐人数5,添加备注6,点击下单1-7,支付页支付页分两种方式1,模拟支付适合前期学习,毕业设计等演示类的场景。2,真实微信支付适合商用,但是使用微信支付必须要有营业执照,所以前期如果只是学习的话,建议使用模拟支付。 1-8,我的订单页我的订单页分以下几个状态1,新下单待上餐2,已上餐待评价3,订单完成4,订单取消1-9,提交评论页我们可以对店家进行评论。 1-10,评价列页可以查看所有评价和自己的评价 1-11,排号等位可以看出,我们可以选择就餐人数,排大桌或者小桌。我这里已排小桌为例通过上图可以看出1,当前排号情况2,我的排号3,可以重新排号4,到号时会有到号提示后面我会把订阅消息功能加进来,这样到号后会有订阅消息提示。 1-12,个人中心个人中心分登录和未登录两种状态未登录已登录 1-13,微信授权登录小程序 2,后厨端和排号管理端2-1,后厨端主要供后厨的厨师使用1,可以查看当前新下单2,完成后可以操作菜品完成3,可以监听用户新下单4,有新订单时会有语音提示5,厨师登录页语音提示我会在视频课里具体演示厨师登录页 厨师管理页可以查看待制作订单用户新下单后,会有语音提示 2-2,排号管理页同样也有登录页,和上面厨师登录一样,这里重点看下排号管理页管理员可以查看当前排号情况,可以叫号。3,cms管理后台我们这里的可视化网页后台使用的时云开发自带的cms(内容管理)3-1,登录页 3-2,管理后台我们可以在这里 1,添加轮播图,删除轮播图,修改轮播图2,添加菜品,删除菜品,修改菜品,上架下架菜品3,管理订单4,查看评价5,管理后厨和排号管理员6,查看排号数据  比如我查询某个用户的所有订单 查询所有新下单还未上菜的订单 还有更多的功能,我会在视频课里给大家用视频来演示,这样更直观。 4,数据库数据库我们这里用云开发自带的云数据库餐厅管理员查看趋势图
数据库主键设计原则 或许大家都设计过数据库,也为定义过主键,今天我想阐述的是,应该如何正确的设计一个主键,在以往的一些资料中,都没有提及到主键设计的原则. 我为此总结了一下: 1.是否要采用GUID作为主键 用GUID作主键有它的优势与不足.优势是GUID具有唯一性,在任何情况下,可以产生全球唯一的值.这是GUID最大的优势,也方便数据导入, 比如要求从另一个系统中把数据导入进来,那么,不用担心,导入时,会导致主键冲突.不足是GUID值太复杂.不易记忆, 因为有时,难免我们会用记录的方式,来进行记录判断.而且数据太长,影响数据库效率.GUID的产生不是以一定的次序产生, 对于按主键物理排序的数据库来说,如果在记录的前部插入一条记录,可能会导致后面N次方的数据条数后移.这将导致数据插入效率. 因此GUID的采用应该要慎重. 2.是否要采用自动递增的方式 对于以前谈到的主键,要求唯一性,因此大家都用自动递增的方式.这样的方式是非常不可取的.可能是为了方便插入记录时,不必去人为创建主键值. 以为这样会方便,其实不是的.带来的麻烦要远远胜于这种所谓的"方便".第一:数据导入不方便,经常会有从另一系统导入数据进来,自动递增的主键, 将不允许原中的ID被导入进来.这会导致主键丢失.第二:对于象订单这样的有主外键的来说,如果订单的"主档"主键是自动生成的. 那么在保存一个订单时,会要求对主档明细同进行事务保存,而此时,先要生成一条订单,然后取出这个订单自动生成的主键, 然后再把此作为明细的一个外键,进行明细的保存.这过程中,将变以复杂而且不可行.事务如何处理.订单主档插入记录后, 要是明细保存时遇到错误,主档记录还要进行删除.烦.插入成功以后,还要取出产生的最大值.这将是一个严重的浪费. 记录多的话会影响速度,而且会存在并行插入.导致获取的记录可能是不正确的. 因此在以上的严重问题下,请不要采用自动递增方式. 3.是否要采用int型作为主键 以前大家都采用int型,都是出来主键都是数字导致的.其实我们也明白.并不是只是数字的东西就是数字型的.比如电话号码等. 因此对于主键,采用 int型的优势是速度快,插入,查询时都可能会比其他的方式快.但我这种快的效果也未必有多明显, 比如以varchar(15)为例,物理主键排序的数据,会自动以主键进行物理数据排序.因此,就算是字符型的数据,在插入时也会插入到相应的物理位置上, 也就是说,在插入时可能会影响一些速度.但在以后的查询中,速度影响不会太明显.而我要说的,不采用int型作为主键,不是说,里面不存数据. 我还是建议大家在主键中存放数字,这样的排序比较要比夹杂字母的排序来的快,之所以要采用字符型,也是为以后的数据导入作准备, 有一天,会要求从其他导入数据时,可以在导入数据的主键上加一个特定字母来避免与原主键冲突.比如在导入数据的主键前加一个"N"字母. 这也就不用担心,要求导入数据中的主键是数字型还是字符型了. 4.是否采用编号来定义主键 这个问题是老生常谈了.主键设计有个原则,就是主键不应具有任何实际意义.这条其实是非常重要,有人就是觉得编号本身是唯一的, 可以作为主键用,但可能会为以后带来麻烦.因为带有实际意义的字段,还是存在被修改的可能性.而对于主键最大的忌讳就是修改主键, 这可能会导致非常严重的不可估计的后果.比如学生编号,平时以为永远不会修改,但修改的可能还是会存在. 还有一种,面上是唯一的,但实际上应该是允许重复的.我举个例子,订单吧,订单编号应该是唯一吧.是的.可是会存在这样的情况, 一张原来的订单是因为某个原因,要求订单作废.那好给订单的状态标识为"cancel".然后允许再次录入同样编号的订单. 因此.对于这样的情况下在,虽然有效的订单编号只有一个,但在数据库角度会允许编号重复. 所以不管如何,还是建议大家为都建一个没有任何意义的主键,如ID. 因此,总结一下,我在设计主键,会采用字符型的.不采用自动递增,在新增记录时,系统生成主键值.一般为全数字进行存入, 至于主键值的生成规则,可以按需求进行规则定义.如果没有特殊的要求, 只是为了保持唯一,可以定义一个字段存放一个数值.在生成时,自动加一.然后再存回去.这也比从一个中寻找最大值要来的快吧. 目前一个比较好的主键是采用GUID,当然我是推荐主键还是字符型的,但值由GUID生成,GUID是可以自动生成,也可以程序生成 ,而且键值不可能重复,可以解决系统集成问题,几个系统的GUID值导到一起时,也不会发生重复,就算有"o"老数据也可以区分,而且效率很高, 在.NET里可以直接使用System.Guid.NewGuid()进行生成,在SQL里也可以使用 NewID()生成。   优点是:   同 IDE

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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