❶ 谁有比较详细的存储过程的教程!给我发一份,十分感谢!

存储过程的优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,
而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行
Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供
的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某此用户才具有对指定存储过程的使用
权存储过程的种类:
1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
如 sp_help就是取得指定对象的相关信息
2.扩展存储过程 以XP_开头,用来调用操作系统提供的功能
exec master..xp_cmdshell 'ping 10.8.16.1'
3.用户自定义的存储过程,这是我们所指的存储过程
常用格式
Create procere procee_name
[@parameter data_type][output]
[with]{recompile|encryption}
as
sql_statement

解释:
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
假如:
表book的内容如下
编号 书名 价格
001 C语言入门 $30
002 PowerBuilder报表开发 $52

实例1:查询表Book的内容的存储过程
create proc query_book
as
select * from book
go
exec query_book

实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额

Create proc insert_book
@param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
with encryption ---------加密
as insert book(编号,书名,价格) Values(@param1,@param2,@param3)
select @param4=sum(价格) from book
go
执行例子:
declare @total_price money
exec insert_book '003','Delphi 控件开发指南',$100,@total_price
print '总金额为'+convert(varchar,@total_price)
go

存储过程的3种传回值:
1.以Return传回整数
2.以output格式传回参数
3.Recordset
传回值的区别:
output和return都可在批次程式中用变量接收,
而 Recordset 则传回到执行批次的客户端中

实例3:设有两个表为Proct,Order1,其表内容如下:
Proct
产品编号 产品名称 客户订数
001 钢笔 30
002 毛笔 50
003 铅笔 100
Order1
产品编号 客户名 客户订金
001 南山区 $30
002 罗湖区 $50
003 宝安区 $4
请实现按编号为连接条件,将两个表连接成一个临时表,
该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中

代码如下:
Create proc temp_sale
as
select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
into #temptable from Proct a inner join Order1 b on a.产品编号=b.产品编号
if @@error=0
print 'Good'
else
print 'Fail'
go

❷ 求 数据库存储过程 PL/SQL oracle 的视频

这个东西哪有什么视频教程,而且oracle这东西又哪是一个视频就能讲清楚的,还是找个plsql教程看下吧。

❸ 如何创建SQL存储过程

CREATE proc ProcBlacker_ADD --定义存储过程
@UserID int, --用户输入的参数1
@strName varchar(20), --用户输入的参数2
@strMobile varchar(20), --用户输入的参数3
@strRemark nvarchar(200) --用户输入的参数4,最后一个不需要加,

as

declare @ID int --定义变量
declare @Account varchar(50) --同上
declare @Content varchar(50) --同上

if not exists(select * from tblBlackList(nolock) --如果不存在则执行下面的语句.
where fdcMobile=@strMobile)
begin
insert into tblBlackList(fdcMobile,fdcName,fdtTm,fdcMemo)
values(@strMobile,@strName,getdate(),@strRemark) --getdate()获取当前系统的时间
set @ID=@@identity --返回一行记录

select @Account=Account from dbo.UserInfo where UserID=@UserID
set @Content='添加黑名单('+'操作者:'+@Account+','+'用户名:'+@strName+'手机:'+@strMobile+'备注:'+@strRemark+')' --设置变量的值
exec ProcRecordLog @Account,'添加',@Content ---执行储过程ProcRecordLog

return @ID
end
GO
这个存储后面调用了ProcRecordLog存储过程

❹ 提供一些关于SQL 存储过程 的视频教程

我这有一些自己写的存储过程的总结。

其实你自己动手写几个就清楚了。

存储过程,其实就是讲一些数据库操作封装起来,对外不可见而已。

如果你需要,我可以把我的资料给你

❺ 谁有sql server 存储过程的教程分享下,谢谢!

我想将ZWsys数据库里面既jizhangpz表的结构复制到abc数据库中,:
exec="select * into abc.dbq.jizhangpz from ZWsys.dbq.jizhangpz where l=0" 负责复制数据库的包扩索引啊,标识列啊,关系 啊全会复制过去
Union查询来消除重复数据,也可以根据字段值查询 distinct 去掉重复
---------------创建文件夹 (但是少用,,,有时候可能无访问权)
USE Master
GO
exec sp_configure 'show advanced option',1
go
reconfigure
go
exec sp_configure 'xp_cmdshell',1
go
reconfigure
go
exec xp_cmdshell 'md d:\Text',no_output --创建一个Text文件夹 no_output是关闭输出提示错误会提示

--------------------建立数据库
IF EXISTS(SELECT * FROM sysdatabases WHERE name='MySchool')
DROP DATABASE MySchool
CREATE DATABASE MySchool
ON PRIMARY
(
NAME= ,
FILENAME= ,
SIZE= ,
FILEGROWTH=
)
LOG ON
(
NAME= ,
FILENAME= ,
SIZE= ,
MAXSIZE= ,
FILEGROWTH=
)
GO

---------------创建表
IF EXISTS(SELECT * FROM sysobjects WHERE name='Student')
DROP TABLE Student
CREATE TABLE Student
(
[..] PRIMARY KEY IDENTITY(1,1) NOT NULL,
[..] VARCHAR(20) NOT NULL,
[..] VARCHAR(10) NULL
)
GO

----表的约束
ALTER TABLE Student With nocheck --如果有数据后在要添加约束则在该表名后添加With nocheck
ADD CONSTRAINT UQ_起名 UNIQUE ([.列名.]), --唯一约束
CONSTRAINT DF_起名 DEFAULT('默认值') FOR [.列名.], --默认约束
CONSTRAINT CK_起名 CHECK(........), --检查约束
CONSTRAINT FK_起名 FOREIGN KEY([.列名.]) REFERENCES [.表名.]([.列名.]) --外键约束--该约束在外键表上建立 [.表名.]是主键表
GO
-----删除约束 ALTER TABLE Studnet DROP CONSTRAINT 约束名称----------

---------------使用变量
DECLARE @NO INT
SET @NO=10

SELECT @NO= stuno FROM Student

输出语句PRINT '数据名称'+CONVERT(VARCHAR(10),@@ERROR)
数据类型转换 PRINT '数据名称'+CAST(@NO AS VARCHAR(3))
日期函数 GETDATE()

-----------if else 应用
IF(..)
BEGIN
...
END
ELSE
BEGIN
...
END
---------WHILE 循环
WHILE(条件)
BEGIN
...
break,continue
END
使用break跳出当前循环结束while 使用continue回到while 循环语句

----CASE 多分支语句
SELECT 学号=Studentno,成绩=
CASE
WHEN StudentResult>60 THEN '好'
WHEN StudentResult<60 THEN '不好'
END
FROM Studnet

--------------------子查询 IN 和 NOT IN EXISTS 和 NOT EXISTS 存在检测存在的语句

随机数select rand()

-------------------------------事务
set nocount on 不显示搜影响的行数信息

事务语法
BEGIN TRANSACTION
DECLARE @aa INT --定义一个变量累计执行中的错误
SET @aa =0
.....SQL语句.......
SET @aa=@aa+@@ERROR --累计是否有错
.....SQL语句.......
SET @aa=@aa+@@ERROR --累计是否有错
IF @aa<>0
BEGIN
PRINT '失败'
ROLLBACK TRANSACTION --回滚
END
ELSE
BEGIN
PRINT '成功'
COMMIT TRANSACTION
END
GO

------------------------视图 VIEW
IF EXISTS(SELECT * FROM sysobjects WHERE name='vw_起名')
DROP VIEW vw_起名 -------删除视图
CREATE VIEW vw_起名
AS
......SQL语句.......
GO

-------------------索引 INDEX
IF EXISTS(SELECT * FROM sysobjects WHERE name='IX_起名')
DROP INDEX IX_起名
GO
CREATE UNIQUE CLUSTERED INDEX ix_起名 ON 表名(列名) ---如果NONCLUSTERED 就是非聚集索引
WITH FILLFACTOR=30 --- FILLFACTOR=30 这是填充因子安“百分比”为单位

安索引查询方法
select * from student
with (INDEX=ix_起名) --------查询时加上该索引
WHERE studentname like '李%'

-------查看表索引方法 exec sp_helpindex 表名

-------------##########------------------存储过程 PROC 全名 PROCEDURE
IF EXISTS(SELECT * FROM sysobjects WHERE name='proc_起名')
DROP PROC proc_起名
GO
CREATE PROC proc_起名
参数
AS
........SQL语句........

-----存储过程
-----存储过程好比一个方法
-----存储过程的语句
--create procedare 存名 procedare简写proc
-- --参数
--as
----逻辑

exec sp_columns 'Student'
exec sp_help 'Student'

----存储过程的创建(必须打开相应的数据库)
USE MySchool
GO
---1实现两数字相加
----1无惨无返回值
create proc proc_add1
--无参
as
declare @n1 int ,@n2 int ,@sum int
set @n1=10
set @n2=5
set @sum=@n1+@n2
print '两数的和'+convert(varchar(10),@sum)
---调用
exec proc_add1

---1实现两数字相加
----2无惨有返回值
create proc proc_add2
--无参
as
declare @n1 int ,@n2 int ,@sum int
set @n1=10
set @n2=5
set @sum=@n1+@n2
return @sum

---调用
declare @n int
exec @n=proc_add2
print '两数的和'+convert(varchar(10),@n)

---1实现两数字相加
----3有惨无返回值
create proc proc_add3
@n1 int,
@n2 int
as
declare @sum int
set @sum=@n1+@n2
print '两数的和'+convert(varchar(10),@sum)

---调用
exec proc_add3 10,5

---1实现两数字相加
----4有惨有返回值
create proc proc_add4
@n1 int,
@n2 int
as
declare @sum int
set @sum=@n1+@n2
return @sum

---调用
declare @n int
exec @n =proc_add4 10,5 --一个萝卜一个坑
print '两数的和'+convert(varchar(10),@n)

--******-带输出参数 调用的时候必须顶一个变量来接搜该值

-----------------实现带输出参数的
create proc proc_add5
@sum int output, --输出(最好放在第一个位置)
@n1 int,
@n2 int
as
set @sum=@n1+@n2
---调用
declare @n int --定义个变量接搜输出参数的值
exec proc_add5 @n output,10,5 ---exec proc_add5 @n output,@n1=10,@n2=5前加@n1也可以
print '两数的和'+convert(varchar(10),@n)

drop proc proc_dd
create proc proc_dd
@jin varchar(10) output,
@no int -- 房间号
as
SELECT dbo.Room.RoomID, dbo.ResideState.ResideName FROM dbo.ResideState CROSS JOIN dbo.Room
where dbo.Room.RoomID=@no

declare @po varchar(10)
exec proc_dd @po output ,4
print '该房间状态'+convert(varchar(20),@po)

-----实现输出参数带默认值的
create proc proc_add6
@sum int output,
@n1 int,
@n2 int=5 --带默认值(最好放在最后一个位置)
as
set @sum=@n1+@n2

---调用
declare @n int
exec proc_add6 @n output,10 --exec proc_add6 @n output,10,10如果写上第二个参数折会覆盖@n2的默认值
print '两数的和'+convert(varchar(10),@n)
--带默认的值不是写在最后一个调用的时候
--exec proc_add6 @n output default,10 ---默认值写在前 必须在后复制时加上default

❻ 使用SQL语句创建存储过程

使用SQL语句创建存储的具体过程如下:

1、首先,打开企业管理器,选择【工具】-【查询分析器】:

❼ mysql 数据库创建存储过程是怎么创建的

创建存储过程
mysql> delimiter $ -- delimiter $是设置 $为命令终止符号,代替默认的分号回,因为分答号有其他用处.
mysql> create procere sp_test(IN pi_id int, OUT po_name varchar(10))
-> begin
-> select * from test.tb_test;
-> select tb_test.name into po_name from test.tb_test where tb_test.id = pi_id;
-> end
-> $
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ; -- 恢复分号作为分隔终止符号

5.调用存储过程
mysql> set @po_name='';
Query OK, 0 rows affected (0.00 sec)
mysql> call sp_test(1,@po_name);

❽ SQL Server的存储过程怎么写

SQL server中如何存储:

首先准备数据,测试存储过程

use ssqadm;

创建测试books表

create table books_test ( book_id int identity(1,1) primary key,

book_name varchar(20),book_price float,book_auth varchar(10));

插入测试数据

insert into books_test (book_name,book_price,book_auth)values

('论语',25.6,'孔子'),

('天龙八部',25.6,'金庸'),

('雪山飞狐',32.7,'金庸'),

('平凡的世界',35.8,'路遥'),

('史记',54.8,'司马迁');

select * from books_test;*/

创建无参存储过程

if (exists (select * from sys.objects where name = 'getAllBooks'))

drop proc getAllBooks

go

create procere getAllBooks

as

begin

select * from books_test;

调用,执行存储过程

exec getAllBooks;

end

go

修改存储过程

alter procere getallbooks

as

select book_name from books_test;

修改存储过程的名称

sp_rename getallbooks,proc_get_allbooks;

go

exec proc_get_allbooks;

go

创建带参数的存储过程

use ssqadm

go

if (exists (select * from sys.objects where name = 'searchbooks'))

drop proc searchbooks

exec searchbooks

执行存储searchbooks得到如下结果:

go

create procere searchbooks (@bookid int)--括号里面是

as

begin

declare @book_id int;定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。

set @book_id = @bookid;

select* from books_test where book_id = @book_id;

end;

go

-- exec searchbooks

执行存储searchbooks得到如下结果:

创建带两个参数的存储过程

use ssqadm

go

if (exists (select * from sys.objects where name = 'book_test2'))

drop proc book_test2

exec book_test2

执行存储book_test2得到如下结果:

go

create procere book_test2

(@bookid int,@bookname varchar(20))括号里面是

as

begin

declare @book_id int;

定义一个标量变量,只是保证存储过程的完整性,在本存储是多此一举的。

declare @book_name varchar(20);

set @book_id = @bookid;

set @book_name = @bookname;

select* from books_test where book_id =

@book_id and book_name = @book_name;

end;

go

exec book_test2

(8)数据库存储过程教程扩展阅读:

SQL Server中查询存储命令子句:

USE [SSQADM]

Use 是跳转到哪个数据库,对这个数据库进行操作。

GO

GO向 SQL Server 实用工具发出一批 Transact-SQL 语句结束的信号,相当于提交上面的SQL语句。

GO是把t-sql语句分批次执行

(一步成功了才会执行下一步,即一步一个GO)

/****** Object: StoredProcere [dbo].[PROC_four_five_hr]

Script Date: 07/30/2018 13:44:55 ******/

SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ON

❾ 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