當前位置:首頁 » 存儲配置 » 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 20:20:40 瀏覽:297
python在類中定義函數調用函數 發布:2025-02-04 20:14:47 瀏覽:595
安卓手機的壁紙是哪個 發布:2025-02-04 20:14:44 瀏覽:198
java發展前景 發布:2025-02-04 20:10:19 瀏覽:76
mac登陸密碼哪裡設置 發布:2025-02-04 19:50:20 瀏覽:525
手游腳本封號 發布:2025-02-04 19:42:12 瀏覽:435
玩單機游戲要哪些配置的電腦 發布:2025-02-04 19:17:41 瀏覽:1003
c語言編程圖書 發布:2025-02-04 19:01:52 瀏覽:898
在哪裡開啟密碼顯示 發布:2025-02-04 18:38:30 瀏覽:791
怎麼查詢qq密碼 發布:2025-02-04 18:20:10 瀏覽:516