数据库表(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万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...
mysql利用存储过程批量添加数据库表随机测试内容
oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量的定义,循环及游标的使用等, 亲测好用
mysql 数据库已存储过程插入一千万条测试数据!利用项目即将上限需要,可以完全系统的测试项目性能!里面又完整的文档和各项说明:打开文档就可以实际操作。
批量插入百万条数据,自定义函数,动态生成数据,伪造真实数据。
本文将介绍三种批量插入数据的方法。第一种方法是使用循环语句逐个将数据项插入到数据库中;第二种方法使用的是SqlBulkCopy,使您可以用其他源的数据有效批量加载 SQL Server 表;第三种使用的方法是sql server中的...
使用for loop向表中批量插入数据,推荐使用plsql执行,Dbvisualizer语句执行会出错
这是一篇将最新的省市区json数据通过java读取之后,遍历然后存储到数据库中的资源,json数据和数据库sql都包含在内,.java文件中是通过url访问的,controller可能需要稍微改一下,不想搞得话就直接运行sql文件吧!
为了满足客户的要求,客户要求两台数据库服务器在不能直接通信的情况下,要保证两台数据库数据保持同步,并且要保证效率,数据量一般每分钟最少可以到达2万条(只能通过端口访问),所以只能使用程序先生成满足特定...
在.net中内存表datatable用来暂时存储批量数据,然后用数据集dataset来批量更新数据库。一次更新批量插入。(C#+.net+SQL Server 2005)
技术方案二:由于是考虑到大数据量的批量插入,于是我想到了ADO.NET2.0的一个新的特性:SqlBulkCopy。有关这个的性能,很早之前我是亲自做过性能测试的,效率非常高。这也是我向公司同事推荐的技术方案。技术方案三...
国产数据库达梦数据库,利用存储函数可以方便快捷建立大量测试用表
数据库、登录、用户、模式、基表、视图、索引、序列、全文索引、存储过程和触发器 的定义和删除语句,登录、基表、视图、仝文索引的修改语句,对象的更名语句; 査询(含全文检索)、插入、删除、修改语句; 数据库安全...
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。这篇文章主要介绍了mybatis中批量插入的两种方式(高效插入)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
一时也想不到怎么把sqlserver表数据复制到oracle中,于是请教公司主管,用存储过程实现可以查询出所有数据的insert脚本,在oracle库中创建好表,直接把sqlserver中的insert脚本复制到oracle执行就可以批量添加了。
2、左边数据库对象(Database Objects)中选择对应的表,右边目标(Target)中选择文件(File)选择脚本存储的名称及位置,再在上面选择高级(Advanced)。 3、去掉记录选项(Record Options)中插入记录(Insert ...
用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被等知名网站所采纳,成为了一种流行的...
PgBulkInsert是一个Java库,用于使用Binary COPY协议批量插入PostgreSQL。 它提供了PostgreSQL 的包装器: 是PostgreSQL特有的功能,它允许高效地批量导入表或从表导出数据。 与使用INSERT和SELECT相比,这是将...
用java语言实现对word表格操作,实现自动批量往数据库中插入数据,节省插入数据时间。
实例266 利用INSERT语句批量插入数据 实例267 利用SELECT INTO生成临时表 8.3 更新数据 实例268 批量修改数据 实例269 将指定字段数据为空的记录添上数据 8.4 删除数据 实例270 删除单条数据 实例271 删除数据库中无...