`
maiguang
  • 浏览: 263527 次
  • 性别: Icon_minigender_1
  • 来自: 焦作
社区版块
存档分类
最新评论

存储过程批量插入数据库表数据

阅读更多

  数据库表(userInfo)结构如下:
 


CREATE TABLE [dbo].[userInfo] (
 [userID] [int] IDENTITY (1, 1) NOT NULL ,
 [roleType] [int] NULL ,
 [groupID] [int] NULL ,
 [userCode] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [userName] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [text1] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [text2] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
 [text3] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
 
    存储过程如下(这里是批量插入99000条数据,roleType,groupID两个字段为随机生成的0-5之间的数):
 


CREATE PROCEDURE add_UserInfo
AS
DECLARE @userCode VARCHAR(30)
DECLARE @userName VARCHAR(30)

DECLARE @userCode_base VARCHAR(30)
DECLARE @count INTEGER
DECLARE @index INTEGER
DECLARE @rand1 INTEGER
DECLARE @rand2 INTEGER
SET @userCode_base='qs_'
SET @userName='userName'
SET @count=100000
SET @index=10000

WHILE @index<@count
BEGIN
 SET @userCode=@userCode_base+CONVERT(VARCHAR,@index)
 SET @rand1=convert(int,rand()*5)
 SET @rand2=convert(int,rand()*5)
 INSERT INTO userInfo (userCode,roleType,groupID,userName,text1,text2,text3)
 VALUES (@userCode,@rand1,@rand2,@userName,'aokei kaol jof','','aokei kaol jof')
 
 SET @index=@index+1
END
GO

 

 

我建的:

ALTER PROCEDURE "DBA"."add_member"
AS
DECLARE @userCode VARCHAR(30)
DECLARE @userCode_base VARCHAR(30)
DECLARE @count INTEGER
DECLARE @index INTEGER
SET @userCode_base='00000000000000'
SET @count=100300
SET @index=100000

WHILE @index<@count
BEGIN
 SET @userCode=@userCode_base+CONVERT(VARCHAR,@index)
insert into hy_member( gw_id,yuanggong,tijiaoshijian,bumen,T1,hydanwei_id,gzdw_name,
dj_id,xm,xb,hy_bumen,zhiwu,jishuzhicheng,zjhm,bgdh,cz,sj,email,address,youbian,
xueli,jingli,
chengguo,xingzhi,un,pw,hy_stuts,i_date,memo,mem_T,his_date,stuts,sh_stuts,tb_status,city_id
,jiebie,lxr_id)
values
(@idCode,'','2008-12-08','','0','','南极洲生生世世荒岛探险局','',
'张三 Tom john.motoluola.nokia ','男','计划科','副经理','高
级','111111111111111','1111111','1111111','1111111','111111',
'地球北纬33古古怪怪古古怪怪的东经180村3号','450000',
'','','','理事','11','21','1','2008-12-08','呜呜呜','MEMT_2',
'2008-12-08','0','2','0','','','0')
 SET @index=@index+1
END

 

 

 

 存储过程的特点

  Sybase的存储过程是集中存储在SQL Server中的预先定义且已经编译好的事务。存储过程由SQL语句和流程控制语句组成。它的功能包括:接受参数;调用另一过程;返回一个状态值给调用过程或批处理,指示调用成功或失败;返回若干个参数值给调用过程或批处理,为调用者提供动态结果;在远程SQL Server中运行等。

  

  存储过程的性能特点如下:

  ·存储过程是预编译过的,这就意味着它与普通的SQL语句或批处理的SQL语句不同,当首次运行一个存储过程时,SQL Server的查询处理器对其进行分析,在排除了语法错误之后形成存储在系统中的可执行方案。由于查询处理的大部分工作已经完成,所以存储过程执行速度很快。

  ·存储过程和待处理的数据都放在同一台运行SQL Server的计算机上,使用存储过程查询当地的数据,效率自然很高。

  ·存储过程一般多由Client端通过存储过程的名字进行调用,即跨网传送的只是存储过程的名字及少量的参数(如果有的话),而不是构成存储过程的许多SQL语句,因此可以减少网络传输量,加快系统响应速度。

  ·存储过程还有着如同C语言子函数那样的被调用和返回值的方便特性。

  所以,存储过程大大增强了SQL语言的功能、效率和灵活性。掌握和应用好存储过程,对进一步发挥Sybase数据库系统的强大功能有着重要的意义。

  

  存储过程的语法规则

  建立存储过程的语法规则为:

  CREATE PROCedure[owner.]procedurename[;number]

  [[(]@parameter_name datatype[=default][OUTput]

  [,@parameter_name datatype[=default][OUTput]]...[)]]

  [WITH RECOMPILE]

  AS SQL_statements

  使用存储过程的语法规则为:

  [EXECute][@return-status=]

  [[[server.]database.]owner.]procedurename[;number]

  [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput]

  [,[@parameter_name=]value|[@parameter_name=]@variable[OUTput]...]]

  [WITH RECOMPILE]

  下面简要介绍这两个命令的常用选项以及建立和使用存储过程的要点,关于选项的更为详细的说明请参考有关手册。

  ·[[[server.]database.]owner.]procedure_name:存储过程的名字。

  ·@parameter_name datatype[=default][OUTput]:形式参数(形参)的名称、类型。df ault是赋予的缺省值(可选),OUTput指定本参数为输出参数(可选)。形参是存储过程中的自变量,可以有多个,名字必须以@打头,最长30个字符。

  ·SQL_statements:定义存储过程功能的SQL语句。

  ·@return_status:接受存储过程返回状态值的变量。

  ·[@parameter_name=]value:实际参数(实参),@parameter_name为实参的名称(可选)。如果某个实参以@parameter_name=value提供,那么随后的实参也都要采用这一形式提供。



  ·[@parameter_name=]@varialbe[OUTput]:将变量@varialbe中的值作为实参传递给形参@parameter_name(可选),如果变量@varialbe是用来接受返回的参数值,则选项OUTput不可缺少。

  

  存储过程的建立和使用,我们将通过几个例子进行介绍。

  假设有一个用下述语句生成的技能工资表RS-LS-GZ-JiNeng:

  create table RS_LS_GZ_JiNeng     /*技能工资表*/

  (GeRen_id char(4),         /*个人代码 */

  RiQi smalldatetime,         /*执行日期 */

  YuanYin_id char(1) null,       /*变动原因代码 */

  JinE smallmoney)           /*技能工资金额 */

  该表存储着某单位员工多年来技能工资的历史档案。

  例1.如果要查询全体员工的技能工资变动历史,则可先建立一个存储过程p-RsGz-JiNeg-All:

  create procedure p_RsGz_JiNeng_All as

  select *

  from RS_LS_GZ_JiNeng

  order by GeRenid,RiQi

  然后用批处理语句调用存储过程p_RsGz_JiNeng_All进行查询:

  execute p_RsGz_JiNeng_All

  本例只显示查询到的数据,无输入、输出参量,是最简单的一个存储过程。

  例2.如果要查询某人技能工资的变动历史,可建立另一个存储过程p_RsGz_JiNeng:

  create procedure p_RsGz_JiNeng @c_GeRenId char(4)

  as

  select *from RS_LS_GZ_JiNeng

  where GeRen_id=@c_GeRenId

  order by RiQi

  之后用批处理语句调用存储过程p_Rs_Gz_JiNeng进行查询:

  declare @GeRenId char(4)

  select @GeRenId="0135" /*设要查询员工的个人代码为"0135" */

  execute p_RsGz_JeNeng @c_GeRenId=@GeRenId

  存储过程p_RsGz_JiNeng中定义了一个形参@c_GeRenId,是字符型变量。在调用该过程的批处理中,既可以用具体的值也可以用变量作为实参。用变量作实参(如本例)时,必须用del are语句加以说明。值得注意的是,在批处理的调用过程语句中,@c_GeRenId=@GeRenId中的@ c_GeRenId是存储过程p_RsGz_JiNeng中的形参名,不是批处理中的变量,所以不能将它列入d eclare语句的变量单中。

  例3.如果要计算当月工资,就必须从工资历史中查出员工距离当前最近的一次技能工资变动的结果:

  create procedure p_RsGz_JiNeng_Slt

  (@c_GeRenId char(4),@sm_JinE smallmoney output)

  as

  select @sm_JinE=JinE

  from RS_LS_GZ_JiNeng

  where RiQi=(select max(RiQi)

  from RS_LS_GZ_JiNeng

  where GeRenid=@c-GeRenId)/*找出历史记录中距离当前最近的日期*/

  调用存储过程p_RsGz_JiNeng_Slt进行查询:

  declare @GeRenId char(4),@JinE smallmoney

  select @GeRenid="0135"/*设要查询员工的个人代码为"0135"*/

  select @JinE=0

  execute p_RsGz_JiNeng_slt @c_GeRenId=@GeRenId,@sm_JinE=@ JinE output

  这里,变量 @JinE用来存储过程形参@sm_JinE传回的金额。在调用过程语句中,@sm_JiE = @JinE output中的output不可省略。否则,变量@JinE将得不到形参传回的数值而始终为零(等于初值)。

  例4.查到了个人代码为"0135"员工的技能工资就显示其历史纪录,查不到则显示一条出错信息。

  create procedure p_RsGz_JiNeng_Rtn

  @c_GeRenId char(4)

  as

  declare @ErrCode smallint

  select @ErrCode=0

  if exists(select* from RS-LS-GZ-JiNeng

   where GeRenid=@c-GeRenId)

   begin

    select *

    from RS_LS_GZ_JiNeng

    whrer GeRen_id=@c_GeRenId

    order by RiQi

    return @ErrCode

   end

  esle

   begin

    select @ErrCode=1

    return @ErrCode

   end

  调用存储过程p_RsGz_JiNeng_Rtn:

  declare @GeRenId char(4),@RtnCode smallint

  select @GeRenId="0135"

  select @RtnCode=0

  execute @RtnCode=p_RsGz_JiNeng_Rtn @c_GeRenId=@GeRenId

  if @RtnCode=1

   print"No this one!"

  存储过程p_RsGz_JiNeng_Rtn向调用者返回一个存储在变量@ErrCode里的值,这个值被称为状态值,它向调用者反映存储过程执行的成败状态。在本例中,如果查不到指定员工技能工资的任何记录时,就认为"查无此人",返回出错状态值1。否则,返回成功状态值0。

  调用过程的批处理语句使用变量@RtnCode存储返回的状态值,一旦检出存储过程p_RsG_ JiNeng_Rtn返回了错误标志(@RtnCode=1),就显示一条信息"No this one!"。

  小结

  上述四个例子简要介绍了存储过程常用的几种形式,从中我们已经可以领略到它的编程特色以及使用上的灵活性和方便性。

  虽然上述例子在调用存储过程时都是用SQL的批处理语句实现的,但并不意味着这是唯一的方法。例如在存储过程中调用存储过程(即所谓过程嵌套)的现象就很常见。另外,在其它Sybase数据库开发系统 (如PowerBuilder)的 script语句中调用Sybase的存储过程也非常普遍。

分享到:
评论

相关推荐

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    Delphi批量插入数据库数据..rar

    本压缩包“Delphi批量插入数据库数据”可能包含了一个或多个示例代码,用于演示如何在Delphi中高效地向数据库批量插入数据。 批量插入数据是数据库操作中的常见需求,尤其是在处理大量数据时,为了提高效率和减少...

    oracle 批量插入数据存储过程

    oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用

    批量插入数据到Oracle数据库Demo

    本教程将详细讲解如何进行批量插入数据到Oracle数据库,以提高数据导入的效率。 批量插入数据到Oracle数据库通常比单条插入更有效率,因为它减少了与数据库的交互次数,降低了网络延迟,并减少了系统资源的占用。...

    excel批量导入数据库

    Excel数据批量导入数据库的过程涉及数据的读取、转换和存储。首先,Excel文件(通常是.XLSX或.XLS格式)中的数据被解析,然后根据预定义的映射规则转换成数据库可识别的格式,最后这些数据被插入到合适的数据库表中...

    C#实现批量插入sqlserver数据

    在C#编程中,批量插入数据到SQL Server数据库是一个常见的需求,特别是在处理大量数据时,效率至关重要。本篇文章将详细探讨三种不同的批量插入方法:常规的`INSERT`语句、`SqlBulkCopy`类以及使用表值参数。我们将...

    百万数据批量插入存储过程

    mysql 数据库已存储过程插入一千万条测试数据!利用项目即将上限需要,可以完全系统的测试项目性能!里面又完整的文档和各项说明:打开文档就可以实际操作。

    C++Oracle存储过程批量插入

    本话题主要探讨的是如何在C++程序中使用Oracle数据库进行存储过程的批量插入操作。Oracle存储过程是预编译的SQL语句集合,它可以提高执行效率,减少网络通信,并且能够封装复杂的业务逻辑。 首先,我们需要理解C++...

    C#大数据批量插入Access程序

    2. **创建数据表实例**:创建一个`DataTable`对象,模拟要插入的数据表结构。设置列名和数据类型,与Access中的目标表对应。 3. **填充数据**:将大量数据加载到`DataTable`中,可以是读取CSV文件、数据库导出或...

    sql下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的...

    88秒插入1000万条数据到MySQL数据库表的操作方法

    其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4232009 &gt; ...

    利用存储过程将Excel中数据导入到数据库表中

    存储过程通常在数据库端定义,比如MySQL或Oracle,用于执行复杂的操作,如批量插入或更新数据。以下是一个简单的MySQL存储过程示例,用于插入数据: ```sql CREATE PROCEDURE importData(IN dataText TEXT) BEGIN ...

    Oracle中多表关联批量插入批量更新与批量删除操作

    在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...

    批量导入数据库中数据

    总的来说,批量导入数据库数据是一个涉及多个步骤的过程,包括数据准备、格式匹配、错误处理和性能优化等。理解并熟练运用这些知识点,可以有效地提升数据处理效率,让大数据量的导入变得简单且可靠。

    数据库存储过程批量生成十万条数据

    批量插入百万条数据,自定义函数,动态生成数据,伪造真实数据。

    存储过程游标用于批量的插入数据

    ### 存储过程与游标的综合应用:批量插入数据 #### 一、存储过程简介 在数据库管理系统(DBMS)中,存储过程是一种预编译的SQL代码块,它可以接受输入参数并返回输出值,类似于编程语言中的函数或过程。通过创建...

    oracle数组存储过程批量插入

    在本例中,我们探讨了如何使用数组存储过程进行批量插入和删除。数组在Oracle中的使用通常涉及定义PL/SQL类型,这允许我们创建索引数组以存储特定数据类型。 首先,我们创建一个名为`MSGPAG`的包,其中定义了一个名...

    ACCESS和SQL批量插入数据工具

    这款工具专为数据库管理员和开发人员设计,用于快速、高效地向ACCESS和SQL Server数据库中批量插入数据,尤其在进行负荷测试时,它能显著提高工作效率。 首先,我们来了解一下ACCESS。ACCESS是Microsoft Office套件...

    往数据库插入数据,相同的不插入

    在Java开发中,常常会遇到需要将一系列数据插入数据库的需求。但在实际操作过程中,为了避免重复数据的插入,我们需要实现一种机制来判断待插入的数据是否已存在于数据库中。这不仅可以提高数据的准确性,还能有效...

Global site tag (gtag.js) - Google Analytics