- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SQL数据库存储过程示例解析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
什么是存储过程:存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了.
存储过程的好处:
1.由于数据库执行动作时,是先编译后执行的。然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高.
2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率.
3.通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全.
小结:总之存储过程是好东西,在做项目时属于必备利器,下面介绍存储过程的基本语法.
存储过程的语法和参数讲解 。
存储过程的一些基本语法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
--------------创建存储过程-----------------
CREATE
PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[
VARYING
] [ =
default
] [
OUTPUT
]
] [ ,...n ]
[
WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[
FOR
REPLICATION ]
AS
sql_statement [ ...n ]
--------------调用存储过程-----------------
EXECUTE
Procedure_name
''
--存储过程如果有参数,后面加参数格式为:@参数名=value,也可直接为参数值value
--------------删除存储过程-----------------
drop
procedure
procedure_name
--在存储过程中能调用另外一个存储过程,而不能删除另外一个存储过程
|
创建存储过程的参数: 1.procedure_name :存储过程的名称,在前面加#为局部临时存储过程,加##为全局临时存储过程.
2.; number:是可选的整数,用来对同名的过程分组,以便用一条 DROP PROCEDURE 语句即可将同组的过程一起除去。例如,名为 orders 的应用程序使用的过程可以命名为 orderproc;1、orderproc;2 等。DROP PROCEDURE orderproc 语句将除去整个组。如果名称中包含定界标识符,则数字不应包含在标识符中,只应在 procedure_name 前后使用适当的定界符.
3.@parameter: 存储过程的参数。可以有一个或多个。用户必须在执行过程时提供每个所声明参数的值(除非定义了该参数的默认值)。存储过程最多可以有 2.100 个参数。 使用 @ 符号作为第一个字符来指定参数名称。参数名称必须符合标识符的规则。每个过程的参数仅用于该过程本身;相同的参数名称可以用在其它过程中。默认情况下,参数只能代替常量,而不能用于代替表名、列名或其它数据库对象的名称。有关更多信息,请参见 EXECUTE.
4.data_type:参数的数据类型。所有数据类型(包括 text、ntext 和 image)均可以用作存储过程的参数。不过,cursor 数据类型只能用于 OUTPUT 参数。如果指定的数据类型为 cursor,也必须同时指定 VARYING 和 OUTPUT 关键字。有关 SQL Server 提供的数据类型及其语法的更多信息,请参见数据类型。 说明 对于可以是 cursor 数据类型的输出参数,没有最大数目的限制.
5.VARYING: 指定作为输出参数支持的结果集(由存储过程动态构造,内容可以变化)。仅适用于游标参数.
6.default: 参数的默认值。如果定义了默认值,不必指定该参数的值即可执行过程。默认值必须是常量或 NULL。如果过程将对该参数使用 LIKE 关键字,那么默认值中可以包含通配符(%、_、[] 和 [^]).
7.OUTPUT :表明参数是返回参数。该选项的值可以返回给 EXEC[UTE]。使用 OUTPUT 参数可将信息返回给调用过程。Text、ntext 和 image 参数可用作 OUTPUT 参数。使用 OUTPUT 关键字的输出参数可以是游标占位符.
8.RECOMPILE: 表明 SQL Server 不会缓存该过程的计划,该过程将在运行时重新编译。在使用非典型值或临时值而不希望覆盖缓存在内存中的执行计划时,请使用 RECOMPILE 选项.
9.ENCRYPTION: 表示 SQL Server 加密 syscomments 表中包含 CREATE PROCEDURE 语句文本的条目。使用 ENCRYPTION 可防止将过程作为 SQL Server 复制的一部分发布。 说明 在升级过程中,SQL Server 利用存储在 syscomments 中的加密注释来重新创建加密过程.
10.FOR REPLICATION :指定不能在订阅服务器上执行为复制创建的存储过程。.使用 FOR REPLICATION 选项创建的存储过程可用作存储过程筛选,且只能在复制过程中执行。本选项不能和 WITH RECOMPILE 选项一起使用.
11.AS :指定过程要执行的操作.
12.sql_statement :过程中要包含的任意数目和类型的 Transact-SQL 语句。但有一些限制.
小结:看过这些基本语法后,下面我就根据语法创建各式的存储过程.
创建存储过程 。
针对上面的表,我使用存储过程对它做一些操作:
1. 只返回单一记录集的存储过程 。
1
2
3
4
5
6
7
8
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
GetUserAccount
as
select
*
from
UserAccount
go
-------------执行上面的存储过程----------------
exec
GetUserAccount
|
结果:相当于运行 select * from UserAccount 这行代码,结果为整个表的数据.
2.没有输入输出的存储过程 。
1
2
3
4
5
6
7
8
9
10
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
inUserAccount
as
insert
into
UserAccount (UserName,[
PassWord
],RegisterTime,RegisterIP)
values
(9,9,
'2013-01-02'
,9)
go
-------------执行上面的存储过程----------------
exec
inUserAccount
|
结果:相当于运行 insert into UserAccount (UserName,[PassWord],RegisterTime,RegisterIP) values(9,9,'2013-01-02',9) 这行代码.
3.有返回值的存储过程 。
1
2
3
4
5
6
7
8
9
10
11
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
inUserAccountRe
as
insert
into
UserAccount (UserName,[
PassWord
],RegisterTime,RegisterIP)
values
(10,10,
'2013-01-02'
,10)
return
@@rowcount
go
-------------执行上面的存储过程----------------
exec
inUserAccountRe
|
解释:这里的@@rowcount为执行存储过程影响的行数,执行的结果是不仅插入了一条数据,还返回了一个值即 return value =1 ,这个可以在程序中获取,稍后在c#调用存储过程中会有说到.
4.有输入参数和输出参数的存储过程 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
GetUserAccountRe
@UserName
nchar
(20),
@UserID
int
output
as
if(@UserName>5)
select
@UserID=
COUNT
(*)
from
UserAccount
where
UserID>25
else
set
@UserID=1000
go
-------------执行上面的存储过程----------------
exec
GetUserAccountRe
'7'
,
null
|
解释:@UserName为输入参数,@UserID为输出参数。 运行结果为@userID为COOUT(*)即 =1.
5. 同时具有返回值、输入参数、输出参数的存储过程 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
GetUserAccountRe1
@UserName
nchar
(20),
@UserID
int
output
as
if(@UserName>5)
select
@UserID=
COUNT
(*)
from
UserAccount
where
UserID>25
else
set
@UserID=1000
return
@@rowcount
go
-------------执行上面的存储过程----------------
exec
GetUserAccountRe1
'7'
,
null
|
结果:@userID为COOUT(*)即 =1,Retun Value=1.
6.同时返回参数和记录集的存储过程 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
GetUserAccountRe2
@UserName
nchar
(20),
@UserID
int
output
as
if(@UserName>5)
select
@UserID=
COUNT
(*)
from
UserAccount
where
UserID>25
else
set
@UserID=1000
select
*
from
UserAccount
return
@@rowcount
go
-------------执行上面的存储过程----------------
exec
GetUserAccountRe2
'7'
,
null
|
结果:返回执行 select * from UserAccount 这句代码的结果集,同时@userID为COOUT(*)即 =1,Retun Value=9.
7.返回多个记录集的存储过程 。
1
2
3
4
5
6
7
8
9
10
11
|
-------------创建名为GetUserAccount的存储过程----------------
create
Procedure
GetUserAccountRe3
as
select
*
from
UserAccount
select
*
from
UserAccount
where
UserID>5
go
-------------执行上面的存储过程----------------
exec
GetUserAccountRe3
|
结果:返回两个结果集,一个为 select * from UserAccount,另一个为 select * from UserAccount where UserID>5 .
小结:上面我们创建了各式的存储过程,下面看我们在c#中怎样调用这些存储过程.
C#调用存储过程 。
这里调用的存储过程为上面我写的那些各式各样的存储过程.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
public
partial
class
ProcedureTest : System.Web.UI.Page
{
public
static
string
conn = ConfigurationManager.ConnectionStrings[
"StuRelationDBConnectionString"
].ConnectionString;
public
SqlConnection con =
new
SqlConnection(conn);
protected
void
Page_Load(
object
sender, EventArgs e)
{
runGetUserAccountRe3();
}
//只返回单一记录集的存储过程GetUserAccount
public
void
runGetUserAccount()
{
SqlDataAdapter dp =
new
SqlDataAdapter(common(
"GetUserAccount"
));
DataSet ds =
new
DataSet();
// 填充dataset
dp.Fill(ds);
rpt.DataSource = ds;
rpt.DataBind();
}
//没有输入输出的存储过程inUserAccount
public
void
runinUserAccount()
{
con.Open();
Label1.Text = common(
"inUserAccount"
).ExecuteNonQuery().ToString();
con.Close();
}
//有返回值的存储过程inUserAccountRe
public
void
runinUserAccountRe()
{
// 创建参数
SqlCommand cmd = common(
"inUserAccountRe"
);
IDataParameter[] parameters = {
new
SqlParameter(
"rval"
, SqlDbType.Int,4)
};
// 将参数类型设置为 返回值类型
parameters[0].Direction = ParameterDirection.ReturnValue;
// 添加参数
cmd.Parameters.Add(parameters[0]);
con.Open();
// 执行存储过程并返回影响的行数
Label1.Text = cmd.ExecuteNonQuery().ToString();
con.Close();
// 显示影响的行数和返回值
Label1.Text +=
"-"
+ parameters[0].Value.ToString();
}
//有输入参数和输出参数的存储过程
public
void
runGetUserAccountRe()
{
SqlCommand cmd = common(
"GetUserAccountRe"
);
// 创建参数
IDataParameter[] parameters = {
new
SqlParameter(
"@UserName"
, SqlDbType.NChar,20) ,
new
SqlParameter(
"@UserID"
, SqlDbType.Int) ,
};
// 设置参数类型
parameters[0].Value =
"7"
;
parameters[1].Direction = ParameterDirection.Output;
// 设置为输出参数
// 添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
con.Open();
// 执行存储过程并返回影响的行数
Label1.Text = cmd.ExecuteNonQuery().ToString();
con.Close();
// 显示影响的行数和输出参数
Label1.Text +=
"-"
+ parameters[1].Value.ToString();
}
//同时具有返回值、输入参数、输出参数的存储过程GetUserAccountRe1
public
void
runGetUserAccountRe1()
{
SqlCommand cmd = common(
"GetUserAccountRe1"
);
// 创建参数
IDataParameter[] parameters = {
new
SqlParameter(
"@UserName"
, SqlDbType.NChar,20) ,
new
SqlParameter(
"@UserID"
, SqlDbType.Int) ,
new
SqlParameter(
"rval"
, SqlDbType.Int,4)
};
// 设置参数类型
parameters[0].Value =
"7"
;
parameters[1].Direction = ParameterDirection.Output;
// 设置为输出参数
parameters[2].Direction = ParameterDirection.ReturnValue;
//设置为返回值
// 添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
cmd.Parameters.Add(parameters[2]);
con.Open();
// 执行存储过程并返回影响的行数
Label1.Text = cmd.ExecuteNonQuery().ToString();
con.Close();
// 显示影响的行数和输出参数
Label1.Text +=
"-输出参数为:"
+ parameters[1].Value.ToString();
Label1.Text +=
"-返回值为:"
+ parameters[2].Value.ToString();
}
//同时返回参数和记录集的存储过程GetUserAccountRe2
public
void
runGetUserAccountRe2()
{
SqlCommand cmd = common(
"GetUserAccountRe2"
);
// 创建参数
IDataParameter[] parameters = {
new
SqlParameter(
"@UserName"
, SqlDbType.NChar,20) ,
new
SqlParameter(
"@UserID"
, SqlDbType.Int) ,
new
SqlParameter(
"rval"
, SqlDbType.Int,4)
};
// 设置参数类型
parameters[0].Value =
"7"
;
parameters[1].Direction = ParameterDirection.Output;
// 设置为输出参数
parameters[2].Direction = ParameterDirection.ReturnValue;
//设置为返回值
// 添加参数
cmd.Parameters.Add(parameters[0]);
cmd.Parameters.Add(parameters[1]);
cmd.Parameters.Add(parameters[2]);
con.Open();
// 执行存储过程并返回影响的行数
Label1.Text = cmd.ExecuteNonQuery().ToString();
DataSet ds =
new
DataSet();
SqlDataAdapter dt =
new
SqlDataAdapter(cmd);
dt.Fill(ds);
rpt.DataSource = ds;
rpt.DataBind();
con.Close();
// 显示影响的行数和输出参数
Label1.Text +=
"-输出参数为:"
+ parameters[1].Value.ToString();
Label1.Text +=
"-返回值为:"
+ parameters[2].Value.ToString();
}
//返回多个记录集的存储过程
public
void
runGetUserAccountRe3()
{
DataSet ds =
new
DataSet();
SqlDataAdapter dt =
new
SqlDataAdapter(common(
"GetUserAccountRe3"
));
dt.Fill(ds);
rpt1.DataSource = ds.Tables[0].DefaultView;
rpt1.DataBind();
rpt2.DataSource = ds.Tables[1].DefaultView;
rpt2.DataBind();
}
public
SqlCommand common(
string
proName)
{
SqlCommand cmd =
new
SqlCommand();
// 设置sql连接
cmd.Connection = con;
// 如果执行语句
cmd.CommandText = proName;
// 指定执行语句为存储过程
cmd.CommandType = CommandType.StoredProcedure;
return
cmd;
}
}
|
附带SQLServer数据库的一些全局变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
select
APP_NAME ( )
as
w
--当前会话的应用程序
select
@@IDENTITY
--返回最后插入的标识值
select
USER_NAME()
--返回用户数据库用户名
SELECT
@@CONNECTIONS
--返回自上次SQL启动以来连接或试图连接的次数。
SELECT
GETDATE()
--当前时间
SELECT
@@CPU_BUSY/100
--返回自上次启动SQL 以来 CPU 的工作时间,单位为毫秒
USE tempdb
SELECT
@@DBTS
as
w
--为当前数据库返回当前 timestamp 数据类型的值。这一 timestamp 值保证在数据库中是唯一的。
select
@@IDENTITY
as
w
--返回最后插入的标识值
SELECT
@@IDLE
as
w
--返回SQL自上次启动后闲置的时间,单位为毫秒
SELECT
@@IO_BUSY
AS
w
--返回SQL自上次启动后用于执行输入和输出操作的时间,单位为毫秒
SELECT
@@LANGID
AS
w
--返回当前所使用语言的本地语言标识符(ID)。
SELECT
@@LANGUAGE
AS
w
--返回当前使用的语言名
SELECT
@@LOCK_TIMEOUT
as
w
--当前会话的当前锁超时设置,单位为毫秒。
SELECT
@@MAX_CONNECTIONS
as
w
--返回SQL上允许的同时用户连接的最大数。返回的数不必为当前配置的数值
EXEC
sp_configure
--显示当前服务器的全局配置设置
SELECT
@@MAX_PRECISION
as
w
--返回 decimal 和 numeric 数据类型所用的精度级别,即该服务器中当前设置的精度。默认最大精度38。
select
@@OPTIONS
as
w
--返回当前 SET 选项的信息。
SELECT
@@PACK_RECEIVED
as
w
--返回SQL自启动后从网络上读取的输入数据包数目。
SELECT
@@PACK_SENT
as
w
--返回SQ自上次启动后写到网络上的输出数据包数目。
SELECT
@@PACKET_ERRORS
as
w
--返回自SQL启动后,在SQL连接上发生的网络数据包错误数。
SELECT
@@SERVERNAME
as
w
--返回运行SQL服务器名称。
SELECT
@@SERVICENAME
as
w
--返回SQL正在其下运行的注册表键名
SELECT
@@TIMETICKS
as
w
--返回SQL服务器一刻度的微秒数
SELECT
@@TOTAL_ERRORS
AS
w
--返回 SQL服务器自启动后,所遇到的磁盘读/写错误数。
SELECT
@@TOTAL_READ
as
w
--返回 SQL服务器自启动后读取磁盘的次数。
SELECT
@@TOTAL_WRITE
as
w
--返回SQL服务器自启动后写入磁盘的次数。
SELECT
@@TRANCOUNT
as
w
--返回当前连接的活动事务数。
SELECT
@@VERSION
as
w
--返回SQL服务器安装的日期、版本和处理器类型。
|
以上就是本文的全部内容,希望对大家的学习有所帮助.
最后此篇关于SQL数据库存储过程示例解析的文章就讲到这里了,如果你想了解更多关于SQL数据库存储过程示例解析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如果我声明了类似的类型 type test(NSIZE) integer, len :: NSIZE real :: dummy(NSIZE) contains procedure,
我知道这是一个不太可能的事情,但是由于“选项私有(private)模块”的限制,甚至更糟糕的“私有(private)子/函数”的限制,有谁知道是否有一种方法可以从 Excel 应用程序隐藏 VBA 过
我有两个表,property 和 component。 component.id_property = property.id。 我正在尝试创建一个过程,该过程对所选属性的组件进行计数,如果所选属性没
我有一份报告,它是在 SSRS 2005 中开发的,我正在使用存储过程从数据库中获取结果。报告输出的结果非常简单,如下图所示。 如果假设我正在寻找不同的成员 例如:- MemberID c108 c
我需要一个通用函数/过程,该函数/过程将根据提供的数据计算出我的淡入淡出时间和值,如下所示: 我将字节值保存在字节数组中:这些是起始值。然后,我在其他数组中存储了一些值:这些将是新值。然后我有时间要提
我想在界面的多个按钮上创建相同的操作。是否只能通过创建单独的操作监听器方法并调用执行操作的方法才可行,还是还有其他方法?是否可以将按钮放在一个组中并执行以下操作:- groupButton.setOn
我有以下情况: procedure Test; begin repeat TryAgain := FALSE; try // Code // Code if this an
我正在尝试执行以下操作;假设我在 Oracle 中创建了一个对象类型 create type test as object( name varchar2(12), member procedure p
问题: 如果可能的话,如何声明一个用于任何类型参数的函数 T其中 T 的唯一约束是它被定义为 1D array如 type T is array ( integer range <> ) of a_r
我正在尝试创建这个 mysql 过程来制作一个包含今年所有日期和所有时间的表(以一小时为间隔。) CREATE TABLE FECHAS ( created_at datetime ); CREA
所以, 我在这里面临一个问题,这让我发疯,我认为这是一个愚蠢的错误,所以我不是 MySQL 的新手,但它并不像我想象的那样工作。 尝试将此语句部署到 MySQL 后,我收到此错误: ERROR 106
我有一个架构,其中包含星球大战中的人物列表、他们出现的电影、他们访问的行星等。这是架构: CREATE DATABASE IF NOT EXISTS `starwarsFINAL` /*!40100
我一直在为一家慈善机构创建一款应用程序,允许家庭在节日期间注册接收礼物。数据库组织有多个表。下面列出了这些表(及其架构/创建语句): CREATE TABLE IF NOT EXISTS ValidD
正如上面标题所解释的,我正在尝试编写一个sql函数来按日期删除表而不删除系统表。我在此消息下方放置了一张图片,以便直观地解释我的问题。任何帮助将不胜感激!感谢您的时间! 最佳答案 您可以通过查询INF
DELIMITER $$ CREATE PROCEDURE INSERT_NONE_HISTORY_CHECKBOX() BEGIN DECLARE note_id bigint(20); F
是否可以编写一个存储过程或触发器,在特定时间在数据库内部自动执行,而无需来自应用程序的任何调用?如果是,那么任何人都可以给我一个例子或链接到一些我可以阅读如何做到这一点的资源。 最佳答案 查看 pgA
我需要创建一个过程:1)从表中的字段中选择一些文本并将其存储在变量中2) 更新相同的记录字段,仅添加 yyyymmdd 格式的日期以及过程中的附加文本输入...类似这样的... delimiter /
好的,这就是我想做的: 如果条目已存在(例如基于字段name),则只需返回其id 如果没有,请添加 这是我迄今为止所管理的(对于“如果不存在,则创建它”部分): INSERT INTO `object
以下是我编写的程序,用于找出每位客户每天购买的前 10 件商品。 这是我尝试过的第一个 PL/SQL 操作。它没有达到我预期的效果。 我使用的逻辑是接受开始日期、结束日期以及我对每个客户感兴趣的前“x
我正在尝试在MySQL中创建一个过程那insert week s(当年)发送至我的 week table 。但存在一个问题,因为在为下一行添加第一行后,我收到错误: number column can
我是一名优秀的程序员,十分优秀!