楼下的太麻烦了吧。emp员工表,输入任何部门号,返回部门的总工资,把总工资和部门好,分别放进emp2表里。
编写存储过程查询某部门员工的工资总和
create or replace procere my_text(v_deptno number)
is
cursor c is select* from emp;
v1 number:=0;
begin
for a in c loop
if(a.deptno=v_deptno) then
v1:=v1+a.sal;
end if;
end loop;
insert into emp2 values(v1,v_deptno);
end;
是不是很吊啊?楼主?
❷ SQL2000编写存储过程
1:
Create procere p_getCompany_max_person
as
begin
select top 1 company-name from
(
select sum(person-name) as count,company-name from works group by company
) as temp
end
go
2:
create procere p_getCompany_min_salary
as
begin
Declare @salary int
select @salary=min(salary) as salary from works
select company-name from works where salary=@salary
end
go
第三个懒得回答了,
❸ sql2000的存储过程
if exists (select * from sysobjects where name = 'ProcName' and xtype = 'P')
drop procere ProcName
go
create procere ProcName
SqlServer不能像Oracle那样用,必须如果存在的话先把以前的删除才行
❹ sql存储过程实例
CREATE OR REPLACE
procere procere_name
begin
for c in (select column_a_name from table_a_name)loop
update table_b_name set column_b_name=c.column_a_name where....
end loop;
end;
❺ SQL2000 写一个存储过程
请取出2009-03-11 07:48:16 这个时刻以前 2 分钟的数据行.
2009-03-11 07:50:20 0 0 253
搞清楚是之前还是之后
declare @dt Datetime
set @dt=getdate()
select * from table1 where 时间 between dateadd(n,-2,@dt) and @dt--之前
select * from table1 where 时间 between @dt and dateadd(n,2,@dt)--之后
❻ 简单sql存储过程实例、储过程实战
实例1:只返回单一记录集的存储过程。
银行存款表(bankMoney)的内容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查询表bankMoney的内容的存储过程
create
procere
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用过程中只需要把中的SQL语句替换为存储过程名,就可以了很方便吧!
实例2(向存储过程中传递参数):
加入一笔记录到表bankMoney,并查询此表中userID=
Zhangsan的所有存款的总金额。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查询分析器中执行该存储过程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
print
'总余额为'+convert(varchar,@total_price)
go
在这里再啰嗦一下存储过程的3种传回值(方便正在看这个例子的朋友不用再去查看语法内容):
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中。
实例3:使用带有复杂
SELECT
语句的简单过程
下面的存储过程从四个表的联接中返回所有作者(提供了姓名)、出版的书籍以及出版社。该存储过程不使用任何参数。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存储过程可以通过以下方法执行:
EXECUTE
au_info_all
实例4:使用带有参数的简单过程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存储过程可以通过以下方法执行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
实例5:使用带有通配符参数的简单过程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存储过程可以用多种组合执行。下面只列出了部分组合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
❼ SQL SERVER2000 存储过程 教程
学习存储过程,看几个实例就可以了。很好上手的。接下来就是多看多写。。。
我当初就是看了下面的例子。然后就进项目写了。
包含事务,参数,嵌套调用,游标,循环等
drop procere if exists pro_rep_shadow_rs
delimiter |
----------------------------------
-- rep_shadow_rs
-- 用来处理信息的增加,更新和删除
-- 每次只更新上次以来没有做过的数据
-- 根据不同的标志位
-- 需要一个输出的参数,
-- 如果返回为0,则调用失败,事务回滚
-- 如果返回为1,调用成功,事务提交
--
-- 测试方法
-- call pro_rep_shadow_rs( rtn)
-- select rtn
----------------------------------
create procere pro_rep_shadow_rs(out rtn int)
begin
-- 声明变量,所有的声明必须在非声明的语句前面
declare ilast_rep_sync_id int default -1
declare imax_rep_sync_id int default -1
-- 如果出现异常,或自动处理并rollback 但不再通知调用方了
-- 如果希望应用获得异常,需要将下面这一句,以及启动事务和提交事务的语句全部去掉
declare exit handler for sqlexception rollback
-- 查找上一次的
select eid into ilast_rep_sync_id from rep_de_proc_log where tbl=' rep_shadow_rs'
-- 如果不存在,则增加一行
if ilast_rep_sync_id=-1 then
insert into rep_de_proc_log(rid eid tbl) values(0 0 ' rep_shadow_rs' )
set ilast_rep_sync_id = 0
end if
-- 下一个数字
set ilast_rep_sync_id=ilast_rep_sync_id+1
-- 设置默认的返回值为0:失败
set rtn=0
-- 启动事务
start transaction
-- 查找最大编号
select max(rep_sync_id) into imax_rep_sync_id from rep_shadow_rs
-- 有新数据
if imax_rep_sync_id> =ilast_rep_sync_id then
-- 调用
call pro_rep_shadow_rs_do(ilast_rep_sync_id imax_rep_sync_id)
-- 更新日志
update rep_de_proc_log set rid=ilast_rep_sync_id eid=imax_rep_sync_id where tbl=' rep_shadow_rs'
end if
-- 运行没有异常,提交事务
commit
-- 设置返回值为1
set rtn=1
end
|
delimiter
drop procere if exists pro_rep_shadow_rs_do
delimiter |
---------------------------------
-- 处理指定编号范围内的数据
-- 需要输入2个参数
-- last_rep_sync_id 是编号的最小值
-- max_rep_sync_id 是编号的最大值
-- 无返回值
---------------------------------
create procere pro_rep_shadow_rs_do(last_rep_sync_id int max_rep_sync_id int)
begin
declare irep_operationtype varchar(1)
declare irep_status varchar(1)
declare irep_sync_id int
declare iid int
-- 这个用于处理游标到达最后一行的情况
declare stop int default 0
-- 声明游标
declare cur cursor for select id rep_operationtype irep_status rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id
-- 声明游标的异常处理,设置一个终止标记
declare continue handler for sqlstate ' 02000' set stop=1
-- 打开游标
open cur
-- 读取一行数据到变量
fetch cur into iid irep_operationtype irep_status irep_sync_id
-- 这个就是判断是否游标已经到达了最后
while stop < > 1 do
-- 各种判断
if irep_operationtype=' i' then
insert into rs0811 (id fnbm) select id fnbm from rep_shadow_rs where rep_sync_id=irep_sync_id
elseif irep_operationtype=' u' then
begin
if irep_status=' a' then
insert into rs0811 (id fnbm) select id fnbm from rep_shadow_rs where rep_sync_id=irep_sync_id
elseif irep_status=' b' then
delete from rs0811 where id=iid
end if
end
elseif irep_operationtype=' d' then
delete from rs0811 where id=iid
end if
-- 读取下一行的数据
fetch cur into iid irep_operationtype irep_status irep_sync_id
end while -- 循环结束
close cur -- 关闭游标
end
|
drop procere if exists pro_rep_shadow_rs
delimiter |
----------------------------------
-- rep_shadow_rs
-- 用来处理信息的增加,更新和删除
-- 每次只更新上次以来没有做过的数据
-- 根据不同的标志位
-- 需要一个输出的参数,
-- 如果返回为0,则调用失败,事务回滚
-- 如果返回为1,调用成功,事务提交
--
-- 测试方法
-- call pro_rep_shadow_rs( rtn)
-- select rtn
----------------------------------
create procere pro_rep_shadow_rs(out rtn int)
begin
-- 声明变量,所有的声明必须在非声明的语句前面
declare ilast_rep_sync_id int default -1
declare imax_rep_sync_id int default -1
-- 如果出现异常,或自动处理并rollback 但不再通知调用方了
-- 如果希望应用获得异常,需要将下面这一句,以及启动事务和提交事务的语句全部去掉
declare exit handler for sqlexception rollback
-- 查找上一次的
select eid into ilast_rep_sync_id from rep_de_proc_log where tbl=' rep_shadow_rs'
-- 如果不存在,则增加一行
if ilast_rep_sync_id=-1 then
insert into rep_de_proc_log(rid eid tbl) values(0 0 ' rep_shadow_rs' )
set ilast_rep_sync_id = 0
end if
-- 下一个数字
set ilast_rep_sync_id=ilast_rep_sync_id+1
-- 设置默认的返回值为0:失败
set rtn=0
-- 启动事务
start transaction
-- 查找最大编号
select max(rep_sync_id) into imax_rep_sync_id from rep_shadow_rs
-- 有新数据
if imax_rep_sync_id> =ilast_rep_sync_id then
-- 调用
call pro_rep_shadow_rs_do(ilast_rep_sync_id imax_rep_sync_id)
-- 更新日志
update rep_de_proc_log set rid=ilast_rep_sync_id eid=imax_rep_sync_id where tbl=' rep_shadow_rs'
end if
-- 运行没有异常,提交事务
commit
-- 设置返回值为1
set rtn=1
end
|
delimiter
drop procere if exists pro_rep_shadow_rs_do
delimiter |
---------------------------------
-- 处理指定编号范围内的数据
-- 需要输入2个参数
-- last_rep_sync_id 是编号的最小值
-- max_rep_sync_id 是编号的最大值
-- 无返回值
---------------------------------
create procere pro_rep_shadow_rs_do(last_rep_sync_id int max_rep_sync_id int)
begin
declare irep_operationtype varchar(1)
declare irep_status varchar(1)
declare irep_sync_id int
declare iid int
-- 这个用于处理游标到达最后一行的情况
declare stop int default 0
-- 声明游标
declare cur cursor for select id rep_operationtype irep_status rep_sync_id from rep_shadow_rs where rep_sync_id between last_rep_sync_id and max_rep_sync_id
-- 声明游标的异常处理,设置一个终止标记
declare continue handler for sqlstate ' 02000' set stop=1
-- 打开游标
open cur
-- 读取一行数据到变量
fetch cur into iid irep_operationtype irep_status irep_sync_id
-- 这个就是判断是否游标已经到达了最后
while stop < > 1 do
-- 各种判断
if irep_operationtype=' i' then
insert into rs0811 (id fnbm) select id fnbm from rep_shadow_rs where rep_sync_id=irep_sync_id
elseif irep_operationtype=' u' then
begin
if irep_status=' a' then
insert into rs0811 (id fnbm) select id fnbm from rep_shadow_rs where rep_sync_id=irep_sync_id
elseif irep_status=' b' then
delete from rs0811 where id=iid
end if
end
elseif irep_operationtype=' d' then
delete from rs0811 where id=iid
end if
-- 读取下一行的数据
fetch cur into iid irep_operationtype irep_status irep_sync_id
end while -- 循环结束
close cur -- 关闭游标
end
❽ 怎么用SQL server 2000 和VB 做一个存储过程和触发器的例子
1. 和特定表或视图关联。触发器定义在特定的表或视图上,称为触发器表或触发器视图2. 自动调用。当试图在某个表插入、更新或删除数据,而在那个表上定义了针对所做动作的触发器,那么触发器会自动执行3. 不能被直接调用。不像普通的存储过程,触发器不能被直接调用,也不传递或接受参数4. 是一个事务的部分。触发器及触发它的语句被视为单个事务,可以在触发器内的任何地方被回滚二、创建触发器创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。Microsoft�0�3 SQL Server�6�4 允许为任何给定的 INSERT、UPDATE 或 DELETE 语句创建多个触发器。1.语法CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE]}ASsql_statement [ ...n ] 2.参数trigger_name是触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称。WITH ENCRYPTION加密 syscomments 表中包含 CREATE TRIGGER 语句文本的条目。使用 WITH ENCRYPTION 可防止将触发器作为 SQL Server 复制的一部分发布。FOR | AFTER指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。INSTEAD OF指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。{[DELETE][,][INSERT][,][UPDATE]}是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。对于 INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。AS是触发器要执行的操作。sql_statement是触发器的条件和操作。触发器条件指定其它准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。3.注意事项:SQL Server 不允许在触发器中使用下列语句: ALTER DATABASE、CREATE DATABASE、DROP DATABASE、LOAD DATABASE、LOAD LOG、RESTORE DATABASE、RESTORE LOG三、触发器实例1.简单的触发器,几种触发器的比较.CREATE TRIGGER TRIG1 ON 图书FOR DELETEAS PRINT '触发器已执行!' 2.在“租借信息表”上创建 INSERT触发器“借阅册数”,如果“允借册数”为0,就不能再借了。CREATE TRIGGER 借阅册数 ON 借阅AFTER INSERTASIF (SELECT 允借册数 FROM 读者,inserted WHERE 读者.借书证号=inserted.借书证号)=0BEGIN PRINT '你可借书的册数为0,不能再借图书了' ROLLBACK TRANSACTIONEND3.在“租借信息”表上创建 INSERT触发器“借书期限”,如果学生借书时间超过30天则不能借书。CREATE TRIGGER 借书期限 ON 租借信息 AFTER INSERTAS IF EXISTS(SELECT * FROM 租借信息,inserted WHERE 租借信息.借书证号=inserted.借书证号 AND (GETDATE())-租借信息.借书日期)>30 AND 租借信息.还书日期 IS NULL)BEGIN PRINT '你有超期未还的图书,不能再借图书了!' ROLLBACK TRANSACTIONEND存储过程的应用举例 例1 创建一个“借书过程”存储过程,该存储过程实现的功能是帮助读者完成借书过程。即读者只要提供借书证号、图书名称和图书的作者,就能完成借书。该程序完成的具体操作是:根据读者所提供的图书名称和作者,在图书信息表中进行查询,如果该书未被借出则继续完成借书操作,否则提示读者图书已经惜出。借书操作主要包括三个操作:向“租借信息”表中插入一条记录(保存该读者的借书信息),将“图书信息”表中对应记录的状态列设为1(避免他人再惜),将“学生信息”表中对应记录的借书册数增1(统计该读者的借书册数)。这三个操作要么都执行,要么都不执行。USE 图书借阅管理GOCREATE PROC 借书过程 @借书证号 char(5),@图书名称 varchar(40),@作者 varchar(20) AS DECLARE @借阅号 int,@图书编号 varchar(6) IF EXISTS (SELECT * FROM 图书信息 WHERE 图书名称=@图书名称 and 作者=@作者 and 状态=0) BEGIN BEGIN TRAN SELECT @图书编号=图书编号 FROM 图书信息 --取出图书所对应的图书编号 WHERE 图书名称=@图书名称 and 作者=@作者 and 状态=0 UPDATE 图书信息 SET 状态=1 WHERE 图书编号=@图书编号 --修改"状态"列的值 IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '更新图书信息表失败。' RETURN 1 END SELECT @借阅号=借阅号 FROM 租借信息 ORDER BY 借阅号 --取出最大借阅号 IF @借阅号 is null SET @借阅号=0 INSERT 租借信息(借阅号,借书证号,图书编号,借书日期) VALUES (@借阅号+1,@借书证号,@图书编号,getdate()) IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '借书失败。' RETURN 3 END UPDATE 学生信息 SET 借书册数=借书册数+1 --修改该读者的借书册数 WHERE 借书证号=@借书证号 IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '更新学生信息失败。' RETURN 4 END COMMIT TRAN PRINT '恭喜您借书成功!图书编号是:'+@图书编号 RETURN 0 END ELSE BEGIN PRINT '图书已经借出或没有。' RETURN 2 END 执行”借书过程’USE 图书借阅管理GOEXEC 借书过程 '00006','大学英语(2)','李慧琴' 例2 编写“还书”存储过程,要求通过学生的“借书证号”和“图书编号”来完成还书过程。 还书操作:修改“租借信息”表中的“还书日期”,相应地将“图书信息”表中对应记录的“状态”列的值修改为0,“学生信息”表中“借书册数”减1。 CREATE PROC 还书 @借书证号varchar(5),@图书编号 varchar(6),@借书日期 datetime=null AS BEGIN TRAN IF @还书日期 IS NOT NULL UPDATE 租借信息SET 还书日期=@还书日期 WHERE 图书编号=@图书编号 AND 借书证号=@借书证号 ELSE UPDATE 租借信息SET还书日期=getdate() WHERE 图书编号=@图书编号 AND 借书证号=@借书证号 IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT ‘还书失败。’ RETURN 1 END UPDATE 图书信息 SET 状态=0 WHERE图书编号=@图书编号 IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT ‘还书失败。’ RETURN 2 END UPDATE 学生信息 SET 借书册数=借书册数-1 WHERE 借书证号=@借书证号IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT ‘还书失败。’ RETURN 3 END COMMIT PRINT ‘恭喜你还书成功!
❾ sql存储过程,给几个实例做做。。。
如:表table 字段有 id(主键),name,pwd,age,sex
create proc p
@name varchar(10),
@pwd varchar(10)
as
select * from table where name=@name and pwd=@pwd
----根据用户名和密码得到个人相关信息
exec p '张三',123456 ---执行存储过程
❿ SQL2000存储过程谢谢
改一下:
create proc name1
(
@top1 varchar(5),
@top2 varchar(5)
)
as
declare @str varchar(200)
set @str = 'select top '+@top1+' 字段1,字段2 from table1 where id not in ( select top '+@top2+' id from table1 )'
exec(@str)
执行测试 exec name1 '2','3'