当前位置:首页 » 存储配置 » c存储过程的使用

c存储过程的使用

发布时间: 2023-06-26 03:44:50

❶ 讲解Sybase存储过程的建立和使用

存储过程的特点

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

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

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

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

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

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

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

存储过程的语法规则

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

CREATEPROCere[owner ]procerename[;number] [[(]@parameter_namedatatype[=default][OUTput] [ @parameter_namedatatype[=default][OUTput]] [)]] [WITHREPILE] ASSQL_statements

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

[EXECute][@return status=] [[[server ]database ]owner ]procerename[;number] [[@parameter_name=]value|[@parameter_name=]@varialbe[OUTput] [ [@parameter_name=]value|[@parameter_name=]@variable[OUTput] ]] [WITHREPILE]

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

·[[[server ]database ]owner ]procere_name:存储过程的名字

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

·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( ) /*个人代码 */

RiQi *** alldatetime /*执行日期 */

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

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

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

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

createprocerep_RsGz_JiNeng_Allas select* fromRS_LS_GZ_JiNeng orderbyGeRenid RiQi

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

execute p_RsGz_JiNeng_All

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

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

createprocerep_RsGz_JiNeng@c_GeRenIdchar( ) as select*fromRS_LS_GZ_JiNeng whereGeRen_id=@c_GeRenId orderbyRiQi

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

declare @GeRenId char( )

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

execute p_RsGz_JeNeng @c_GeRenId=@GeRenId

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

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

createprocerep_RsGz_JiNeng_Slt (@c_GeRenIdchar( ) @ *** _JinE *** allmoneyoutput) as select@ *** _JinE=JinE fromRS_LS_GZ_JiNeng whereRiQi=(selectmax(RiQi) fromRS_LS_GZ_JiNeng

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

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

declare@GeRenIdchar( ) @JinE *** allmoney select@GeRenid= /*设要查询员工的个人代码为 */ select@JinE= executep_RsGz_JiNeng_slt@c_GeRenId=@GeRenId @ *** _JinE=@JinEoutput

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

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

createprocerep_RsGz_JiNeng_Rtn @c_GeRenIdchar( ) as declare@ErrCode *** allint select@ErrCode= ifexists(select*fromRS LS GZ JiNeng whereGeRenid=@c GeRenId) begin select* fromRS_LS_GZ_JiNeng whrerGeRen_id=@c_GeRenId orderbyRiQi return@ErrCodE end eslE begin select@ErrCode= return@ErrCodE end

调用存储过程p_RsGz_JiNeng_Rtn:

declare@GeRenIdchar( ) @RtnCode *** allint select@GeRenId= select@RtnCode= execute@RtnCode=p_RsGz_JiNeng_Rtn@c_GeRenId=@GeRenId if@RtnCode= print Nothisone!

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

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

小结

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

lishixin/Article/program/Oracle/201311/17494

❷ oracle的存储过程的作用

1.存储过程可以使得程序执行效率更高、安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更高,直接写sql语句会带来安全性问题,如:sql注入
2.建立过程不会很耗系统资源,因为过程只是在调用才执行。
3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。

4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。

5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。

7.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。

缺点就是:
1、大量的利用过程,会对服务器压力比较大。

❸ C#中使用存储过程、触发器、范式!

use
OlayOnlineShop
go
--
=============================================
--
创建触发器
当管理员删除某个产品时先把购物车对应的产品清空
--
=============================================
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'trig_ProctInfo')
DROP
TRIGGER
trig_ProctInfo
GO
CREATE
TRIGGER
trig_ProctInfo
ON
ProctInfo
INSTEAD
OF
DELETE
AS
BEGIN
--产品ID
DECLARE
@ProctId
INT
SELECT
@ProctId=ProctId
FROM
DELETED
--判断购物车中是否有该产品
IF
EXISTS
(SELECT
CartId
FROM
Cart
WHERE
ProctId=@ProctId)
BEGIN
DELETE
FROM
Cart
WHERE
ProctId=@ProctId
END
DELETE
FROM
ProctInfo
WHERE
ProctId=@ProctId
END
GO
--
=============================================
--
创建触发器
当删除购物车时先清空对应的定单信息
--
=============================================
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'trig_Cart')
DROP
TRIGGER
trig_Cart
GO
CREATE
TRIGGER
trig_Cart
ON
Cart
INSTEAD
OF
DELETE
AS
BEGIN
--购物车ID,订单ID
DECLARE
@UserId
INT,
@CartId
INT,@OrderId
INT
--提取
用户ID,购物车ID和订单ID
SELECT
@UserId=UserId
FROM
DELETED
DECLARE
cart_cursor
CURSOR
SCROLL
DYNAMIC
FOR
--查询数据
存入游标
SELECT
CartId
FROM
Cart
WHERE
UserId=@UserId
OPEN
cart_cursor
FETCH
NEXT
FROM
cart_cursor
INTO
@CartId
--循环删除订单和购物车
WHILE(@@fetch_status=0)
BEGIN
IF
EXISTS
(SELECT
OrderId
FROM
OrderInfo
WHERE
CartId=@CartId)
BEGIN
SELECT
@OrderId=OrderId
FROM
OrderInfo
WHERE
CartId=@CartId
DELETE
FROM
OrderInfo
WHERE
OrderId=@OrderId
END
FETCH
NEXT
FROM
cart_cursor
INTO
@CartId
END
DELETE
FROM
Cart
WHERE
UserId=@UserId
CLOSE
cart_cursor
DEALLOCATE
cart_cursor
END
GO
---
=============================================
--
创建出发器
当用户下了订单,给用户加消费积分
--
==============================================
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
='trig_OrderInfo'
)
DROP
TRIGGER
trig_OrderInfo
GO
CREATE
TRIGGER
trig_OrderInfo
ON
OrderInfo
FOR
INSERT
AS
BEGIN
--定义购物车ID,用户ID,产品ID
以及产品价格和积分值
DECLARE
@cardId
INT,@userId
INT,@proctID
INT,@price
MONEY,@cent
INT
--获取购物车ID和,用户ID,产品ID以及产品价格
SELECT
@cardId
=
CartId
FROM
INSERTED
SELECT
@userId
=
UserId
FROM
Cart
WHERE
CartId=@cardId
SELECT
@proctID
=ProctId
FROM
Cart
WHERE
CartId=@cardId
SELECT
@price=ProctPrice
FROM
ProctInfo
WHERE
ProctId=@proctId
SET
@cent=@price/50
---获取积分,以50为等级
IF(@cent<1)
RETURN
ELSE
BEGIN
UPDATE
UserInfo
SET
Mark=Mark+@cent
WHERE
UserId=@userId
END
END
GO
--
=============================================
--
创建触发器
当同一用户购买同一商品时数量增加
--
=============================================
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'trig_Cart'
)
DROP
TRIGGER
trig_Cart
GO
CREATE
TRIGGER
trig_Cart
ON
Cart
INSTEAD
OF
INSERT
AS
BEGIN
DECLARE
@userId
INT,@proctId
INT,@count
INT
DECLARE
@Date
DATETIME,@Remark
VARCHAR(200),@Remark2
VARCHAR(200)
--取出用户ID和产品ID等
SELECT
@userId=UserId
,@proctId=ProctId,@count=[Count],
@Date=[Date],@Remark=Remark,@Remark2=Remark2
FROM
INSERTED
--判断用户是否购买过产品
IF
EXISTS(SELECT
UserId
FROM
Cart
WHERE
UserId=@userId)
BEGIN
--判断用户购买的产品是否跟上次一致
IF
EXISTS(SELECT
ProctId
FROM
Cart
WHERE
ProctId=@proctId)
BEGIN
--取出同一产品的数量
UPDATE
Cart
SET
[Count]=[Count]+@count
WHERE
UserId=@UserId
AND
ProctId=@proctId
END
ELSE
BEGIN
--用户购买的产品不一致
INSERT
INTO
Cart
Values(@userId,@proctId,@count,@Date,@Remark,@Remark2)
END
END
ELSE
BEGIN
--用户没有购买过产品
INSERT
INTO
Cart
Values(@userId,@proctId,@count,@Date,@Remark,@Remark2)
END
END
GO
------用户信息表UserInfo测试数据存储过程
:
proc_userInfo_all
USE
OlayOnlineShop
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_userInfo_all')
DROP
PROCEDURE
proc_userInfo_all
GO
CREATE
PROCEDURE
proc_userInfo_all
@LoginName
VARCHAR(20),@UserName
VARCHAR(20),
@Password
NVARCHAR(50),@Gender
BIT,@Age
INT,@Email
VARCHAR(50),
@Address
VARCHAR(500),
@Date
DATETIME,@Role
INT,@Mark
INT,@Remark
VARCHAR(200)
AS
INSERT
INTO
UserInfo
(LoginName,UserName,[Password],Gender,Age,Email,Address,[Date],Role,Mark,Remark)
VALUES
(@LoginName
,@UserName
,@Password
,@Gender,
@Age,@Email,@Address
,@Date
,@Role
,@Mark,@Remark
)
GO
--
EXEC
proc_userInfo_all
'KK','潇潇','999999',1,18,'[email protected]','广西南宁','2007-9-19',1,999,''
-----产品类别信息表Category测试数据存储过程
:
pro_Category_all
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_Category_all')
DROP
PROCEDURE
proc_Category_all
GO
CREATE
PROCEDURE
proc_Category_all
@CategoryName
VARCHAR(50),@Description
VARCHAR(500),
@Remark
VARCHAR(200)
AS
INSERT
INTO
Category
(CategoryName,[Description],Remark)
VALUES(@CategoryName,@Description,@Remark)
GO
--EXEC
proc_Category_all
'保养类','能保养皮肤等等....','很棒的哦!!!!'
---产品信息表ProctInfo测试数据存储过程
:
pro_ProctInfo_all
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_ProctInfo_all')
DROP
PROCEDURE
proc_ProctInfo_all
GO
CREATE
PROCEDURE
proc_ProctInfo_all
@ProctName
VARCHAR(200),@CategoryId
INT,
@ProctBigPicture
VARCHAR(200),@ProctSmallPicture
VARCHAR(200),
@ProctPrice
MONEY,@Description
VARCHAR(200),@Virtue
VARCHAR(1500),
@Element
VARCHAR(1500),@HowToUse
VARCHAR(1500),@Date
DATETIME,@Remark
VARCHAR(200)
AS
INSERT
INTO
ProctInfo
(ProctName,CategoryId,ProctBigPicture,ProctSmallPicture,ProctPrice,[Description],
Virtue,Element,HowToUse,[Date],Remark)
VALUES
(@ProctName,@CategoryId,@ProctBigPicture,@ProctSmallPicture,@ProctPrice,@Description,
@Virtue,@Element,@HowToUse,@Date,@Remark)
GO
--
EXEC
proc_ProctInfo_all
'防晒油',1,'f.jpg','b.jpg',80.00,'女士专用','保护女士外出游玩','使用方法很简单','产品成分','2007-10-29','备注'
----购物车信息表Cart测试数据存储过程
:pro_Cart_all
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_Cart_all')
DROP
PROCEDURE
proc_Cart_all
GO
CREATE
PROCEDURE
proc_Cart_all
@UserId
INT,@ProctId
INT,
@Date
DATETIME,@Count
INT,
@Remark
VARCHAR(200)
AS
INSERT
INTO
Cart(UserId,ProctId,[Date],Count,Remark)
VALUES(@UserId,@ProctId,@Date,
@Count,@Remark)
GO
--EXEC
proc_Cart_all
1,1,'2007-10-29',1,'购物车'
---定单信息表OrderInfo
测试数据存储过程:pro_OrderInfo_all
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_OrderInfo_all')
DROP
PROCEDURE
proc_OrderInfo_all
GO
CREATE
PROCEDURE
proc_OrderInfo_all
@CartId
INT,@Date
DATETIME,@Postalcode
CHAR(6),
@BillerAddress
VARCHAR(500),@BillerName
VARCHAR(20),
@Phone
VARCHAR(20),@Remark
VARCHAR(200)
AS
INSERT
INTO
OrderInfo
(CartId,[Date],Postalcode,BillerAddress,BillerName,Phone,Remark)
VALUES(@CartId,@Date,@Postalcode,@BillerAddress,@BillerName,@Phone,@Remark)
GO
--EXEC
proc_OrderInfo_all
1,'2007-10-29','534000','南宁东葛路66号','95599
8153
95063
52662','2024188','定单'
---留言信息表MessageBoard测试数据存储过程
:
pro_MessageBoard_all
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_MessageBoard_all')
DROP
PROCEDURE
proc_MessageBoard_all
GO
CREATE
PROCEDURE
proc_MessageBoard_all
@UserId
INT,@Topic
VARCHAR(200),@Content
VARCHAR(200),
@Date
DATETIME,@Remark
VARCHAR(200)
AS
INSERT
INTO
MessageBoard
(UserId,Topic,Content,[Date],Remark)
VALUES(@UserId,@Topic,@Content,@Date,@Remark)
GO
--EXEC
proc_MessageBoard_all
1,'2007-10-29','我想购买防晒油','2007-10-29','留言'
---搜索产品信息
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'proc_ProctInfo')
DROP
PROCEDURE
proc_ProctInfo
GO
CREATE
PROCEDURE
proc_ProctInfo
@CategoryName
VARCHAR(50),@ProctName
VARCHAR(200),
@MinMoney
VARCHAR(100),@MaxMoney
VARCHAR(100)
AS
DECLARE
@sql
VARCHAR(800)
DECLARE
@min
VARCHAR(100)
DECLARE
@max
VARCHAR(300)
SET
@min='0'
SET
@max='100'
SELECT
@sql='select
C.CategoryId,C.CategoryName,P.ProctId,P.ProctName,P.ProctSmallPicture,P.ProctPrice
from
ProctInfo
P
inner
join
Category
C
on
P.CategoryId=C.CategoryId'
--判断产品类别是否为空
IF
(@CategoryName
<>
''
AND
@CategoryName
is
not
null)
BEGIN
--判断是否搜索全部产品
IF
(@CategoryName!='全部')
BEGIN
SELECT
@sql
=
@sql+'
where
C.CategoryName
like
''%'
+
@CategoryName
+
'%'''
END
END
--判断产品名称是否存在
IF
(@ProctName
<>
''
AND
@ProctName
is
not
null)
BEGIN
--判断是否搜索全部产品
IF
(@CategoryName='全部')
BEGIN
SELECT
@sql
=
@sql+'
where
P.ProctName
like
''%'
+
@ProctName
+
'%'''
END
ELSE
BEGIN
SELECT
@sql
=
@sql+'
and
P.ProctName
like
''%'
+
@ProctName
+
'%'''
END
END
--判断小金额是否有
IF
(@MinMoney
!=
'')
BEGIN
SET
@min
=
@MinMoney
END
--判断大金额是否有
IF
(@MaxMoney
!=
'')
BEGIN
SET
@max
=@MaxMoney
END
IF
(@MinMoney
!=
''
OR
@MaxMoney
!=
'')
BEGIN
SELECT
@sql
=
@sql+'
and
P.ProctPrice
between
'+@min+'
and
'+@max
END
EXEC(@sql)
GO
EXEC
proc_ProctInfo
'新生','玉兰','0','28'

❹ mysql存储过程的基本用法有哪些

mysql存储过程的基本用法有哪些
在外部程序访问数据库时(例如 php),要组织很多 SQL 语句。

特别是业务逻辑复杂的时候,一大堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高。

一、MySQL 创建存储过程

"pr_add" 是个简单的 MySQL 存储过程,这个MySQL 存储过程有两个 int 类型的输入参数 "a"、"b",返回这两个参数的和。
复制代码 代码如下:
drop procere if exists pr_add;

计算两个数之和
复制代码 代码如下:
create procere pr_add
(
a int,
b int
)
begin
declare c int;
if a is null then
set a = 0;
end if;
if b is null then
set b = 0;
end if;
set c = a + b;
select c as sum;
/*
return c;
不能在 MySQL 存储过程中使用。return 只能出现在函数中。

*/
end;

二、调用 MySQL 存储过程
复制代码 代码如下:
call pr_add(10, 20);

执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。
复制代码 代码如下:
set @a = 10;
set @b = 20;
call pr_add(@a, @b);

三、MySQL 存储过程特点

创建 MySQL 存储过程的简单语法为:
复制代码 代码如下:
create procere 存储过程名字()
(
[in|out|inout] 参数 datatype
)
begin
MySQL 语句;
end;

MySQL 存储过程参数如果不显式指定"in"、"out"、"inout",则默认为"in"。习惯上,对于是"in" 的参数,我们都不会显式指定。

1. MySQL 存储过程名字后面的"()"是必须的,即使没有一个参数,也需要"()"

2. MySQL 存储过程参数,不能在参数名称前加"@",如:"@a int"。下面的创建存储过程语法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要在变量名字前加"@",虽然 MySQL 客户端用户变量要加个"@"。
复制代码 代码如下:
create procere pr_add
(
@a int, -- 错误
b int -- 正确
)

3. MySQL 存储过程的参数不能指定默认值。

4. MySQL 存储过程不需要在 procere body 前面加 "as"。而 SQL Server 存储过程必须加 "as" 关键字。
复制代码 代码如下:
create procere pr_add
(
a int,
b int
)
as -- 错误,MySQL 不需要 "as"
begin
mysql statement ...;
end;

5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。
复制代码 代码如下:
create procere pr_add
(
a int,
b int
)
begin
mysql statement 1 ...;
mysql statement 2 ...;
end;

6. MySQL 存储过程中的每条语句的末尾,都要加上分号 ";"
复制代码 代码如下:
...
declare c int;
if a is null then
set a = 0;
end if;
...
end;

7. MySQL 存储过程中的注释。
复制代码 代码如下:
/*
这是个
多行 MySQL 注释。
*/
declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格)
if a is null then # 这也是个单行 MySQL 注释
set a = 0;
end if;

❺ 如何通过c或c++调用存储过程

给个例子给你看下:
...

_CommandPtr m_cmdptr;
m_cmdptr.CreateInstance(__uuidof( Command ) );

_ParameterPtr inParam2=NULL;
_ParameterPtr inParam3=NULL;
_ParameterPtr inParam4=NULL;
_ParameterPtr outParam1=NULL;
_ParameterPtr outParam2=NULL;
_ParameterPtr outParam3=NULL;

inParam2.CreateInstance(__uuidof(Parameter));
inParam3.CreateInstance(__uuidof(Parameter));
inParam4.CreateInstance(__uuidof(Parameter));
outParam1.CreateInstance(__uuidof(Parameter));
outParam2.CreateInstance(__uuidof(Parameter));
outParam3.CreateInstance(__uuidof(Parameter));

m_cmdptr->ActiveConnection=m_pConnection;
m_cmdptr->CommandType=adCmdStoredProc;
m_cmdptr->CommandText=_bstr_t("proc_XXX");//存储过程的名称

//输入参数
inParam2=m_cmdptr->CreateParameter(_bstr_t("@P1"),adVarChar,adParamInput,32,_bstr_t(P1));
m_cmdptr->Parameters->Append(inParam2);

inParam3=m_cmdptr->CreateParameter(_bstr_t("@P2"),adVarChar,adParamInput,20,_bstr_t(P2));
m_cmdptr->Parameters->Append(inParam3);

//输出参数
outParam1=m_cmdptr->CreateParameter("@P4",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam1);
outParam2=m_cmdptr->CreateParameter("@P5",adInteger,adParamOutput,sizeof(int));
m_cmdptr->Parameters->Append(outParam2);
outParam3=m_cmdptr->CreateParameter(_bstr_t("@P6"),adVarChar,adParamOutput,20,_bstr_t(P6));
m_cmdptr->Parameters->Append(outParam3);

//执行

m_cmdptr->Execute(NULL,NULL,adCmdStoredProc);

//取返回值

long p1=m_cmdptr->Parameters->GetItem("@P4")->Value;
long p2=m_cmdptr->Parameters->GetItem("@P5")->Value;

VARIANT vtP6 =m_cmdptr->Parameters->GetItem("@P6")->Value;
if (vtP6.vt != VT_NULL)
strcpy(tp,(_bstr_t)vtP6);

m_cmdptr.Detach;

❻ 如何使用mysql的API在c/c++的代码中,创建一个存储过程

MySQL的概述
MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司。在2008年1月16号被Sun公司收购。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL的官方网站的网址是:
[编辑本段]MySQL的特性
1.使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性
2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统
3.为多种编程语言提供了API。这些编程语言包括C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。
4.支持多线程,充分利用CPU资源
5.优化的SQL查询算法,有效地提高查询速度
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名
7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径
8.提供用于管理、检查、优化数据库操作的管理工具
9.可以处理拥有上千万条记录的大型数据库
[编辑本段]MySQL的应用
与其他的大型数据库例如Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,如规模小、功能有限(MySQL Cluster的功能和效率都相对比较差)等,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于MySQL是开放源码软件,因此可以大大降低总体拥有成本。
目前Internet上流行的网站构架方式是LAMP(Linux+Apache+MySQL+PHP),即使用Linux作为操作系统,Apache作为Web服务器,MySQL作为数据库,PHP作为服务器端脚本解释器。由于这四个软件都是遵循GPL的开放源码软件,因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。
[编辑本段]MySQL管理
可以使用命令行工具管理MySQL数据库(命令mysql 和 mysqladmin),也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。
phpMyAdmin是由php写成的MySQL资料库系统管理程式,让管理者可用Web接口管理MySQL资料库。
phpMyBackupPro也是由PHP写成的,可以透过Web接口创建和管理数据库。它可以创建伪cronjobs,可以用来自动在某个时间或周期备份MySQL 数据库。
另外,还有其他的GUI管理工具,例如早先的mysql-front 以及 ems mysql manager,navicat 等等。
[编辑本段]Mysql存储引擎
MyISAM Mysql的默认数据库,最为常用。拥有较高的插入,查询速度,但不支持事务
InnoDB 事务型数据库的首选引擎,支持ACID事务,支持行级锁定
BDB 源自Berkeley DB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性
Memory 所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失
Merge 将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用
Archive 非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度,但其对查询的支持相对较差
Federated 将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
Cluster/NDB 高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用
CSV 逻辑上由逗号分割数据的存储引擎
BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继
另外,Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。
[编辑本段]Mysql最常见的应用架构
单点(Single),适合小规模应用
复制(Replication),适合中小规模应用
集群(Cluster),适合大规模应用
[编辑本段]mysql历史版本
MySQL公司目前在同时开发两个版本的软件,4.1版以及5.0版。4.1版本的代码已经发布并有望在8个月后公布最终代码。而5.0版本的最后产品将在6个月后发布。
MySQL4.1版本中增加了不少新的性能,包括对主键的更高速度的缓存,对子查询的更好的支持,以及应网络约会网站所要求的,基于地理信息的查询。
而其同步开发的5.0版本则把目标对准了企业用户,对于4.1版本中的所有新特性,5.0版本悉数收入囊中,并且独具以下特点:对外键的良好支持;系统自动报错机制以及对存储过程的充分支持。

SQL全称是“结构化查询语言(Structured Query Language)”
SQL(STructured Query Language)是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL同时也是数据库脚本文件的扩展名。
SQL是高级的非过程化编程语言,允许用户在高层数据结构上工作。他不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统可以使用相同的SQL语言作为数据输入与管理的接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使他具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。
结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxporo、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。
美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。
SQL语言包含4个部分:
※ 数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
※ 数据操作语言(DML),例如:INSERT、UPDATE、DELETE语句。
※ 数据查询语言(DQL),例如:SELECT语句。
※ 数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
SQL语言包括三种主要程序设计语言类别的陈述式:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)。

❼ 关于存储过程里使用游标和循环的问题

、带参数游标for循环 一 首先编写存储程整体结构,: create or replace procere test_proc is v_date date; --变量定义 begin select sysdate into v_date from al; end test_proc; 二 定义游标: create or replace procere test_proc is v_date date; --定义变量 cursor cur is select * from ldcode; --定义游标 begin select sysdate into v_date from al; end test_proc; 三 编写for循环: create or replace procere test_proc is v_date date; --定义变量 cursor cur is select * from ldcode where rownum<一0; --定义游标 begin select sysdate into v_date from al; --游标for循环始 for temp in cur loop --temp临变量名,自任意起 Dbms_Output.put_line(temp.Code); --输某字段,使用"变量名.列名"即 end loop; --游标for循环结束 end test_proc; 四 测试运行点击【DBMS Output】标签页查看结图: END 二、带参数游标for循环 一 定义带参数游标: cursor cur(v_codetype ldcode.Codetype%TYPE) is select * from ldcode where codetype = v_codetype; --定义游标 定义游标格式: cursor 游标名称(变量定义) is 查询语句; 注意: where条件变量名v_codetype要与游标定义cur(v_codetype ldcode.Codetype%TYPE)致 二 编写for循环部: --游标for循环始 for temp in cur('llmedfeetype') loop --temp临变量名,自任意起 --cur('llmedfeetype')"游标名称(传入变量)" Dbms_Output.put_line(temp.Code); --输某字段,使用"变量名.列名"即 end loop; --游标for循环结束 三 测试运行点击【DBMS Outpu

热点内容
死神脚本 发布:2025-02-04 21:57:03 浏览:165
phpposthtml 发布:2025-02-04 21:37:46 浏览:87
最新asp源码 发布:2025-02-04 21:17:33 浏览:570
让linux死机 发布:2025-02-04 20:48:08 浏览:141
单方块生存服务器里如何获取岩浆 发布:2025-02-04 20:48:07 浏览:785
快速指数算法 发布:2025-02-04 20:20:40 浏览:299
python在类中定义函数调用函数 发布:2025-02-04 20:14:47 浏览:596
安卓手机的壁纸是哪个 发布:2025-02-04 20:14:44 浏览:202
java发展前景 发布:2025-02-04 20:10:19 浏览:77
mac登陆密码哪里设置 发布:2025-02-04 19:50:20 浏览:526