當前位置:首頁 » 服務存儲 » 存儲過程教程
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

存儲過程教程

發布時間: 2022-01-18 09:24:43

❶ 使用sql語句創建存儲過程

使用SQL語句創建存儲的具體過程如下:

1、首先,打開企業管理器,選擇【工具】-【查詢分析器】:

❷ 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 存儲過程 類似的教程么

SQL SERVER例子
CREATE PROCEDURE 存儲過程名?--創建
ALTER PROCEDURE 存儲過程名?--修改
CREATE PROCEDURE INSERT_AreaCategory

@CategoryNumber varchar(1000),
@CategoryName varchar(100),
@Code varchar(50),
@Description varchar(1000),
@ParentId int,
@Layer int,
@ServicePrice decimal(18,2),
@ShowType smallint,
@IsIndexShow smallint,
@SortInfo varchar(50),
@OrderIndex int,
@UrlLink varchar(200),
@CategoryIco varchar(500),
@CreateOn datetime,
@CreateBy int,
@IntField int,
@VarcharField varchar(1000),
@Res VARCHAR(10) OUTPUT
AS
SET NOCOUNT ON
BEGIN
BEGIN TRANSACTION
DECLARE @CategoryCount INT

SELECT @CategoryCount=COUNT(*) FROM AreaCategory WHERE CategoryName=@CategoryName AND ParentId=@ParentId AND DeletionStateCode=0

IF @CategoryCount=0
BEGIN

INSERT INTO
AreaCategory
([CategoryNumber],[CategoryName],[Code],[Description],[ParentId],[Layer],[ServicePrice],[ShowType],[IsIndexShow],[SortInfo],[OrderIndex],[UrlLink],[CategoryIco],[CreateOn],[CreateBy],[IntField],[VarcharField])
VALUES
(@CategoryNumber,@CategoryName,@Code,@Description,@ParentId,@Layer,@ServicePrice,@ShowType,@IsIndexShow,@SortInfo,@OrderIndex,@UrlLink,@CategoryIco,@CreateOn,@CreateBy,@IntField,@VarcharField)
SET @Res='0' --0表示添加目錄成功
END
ELSE
BEGIN
SET @Res='2' --2表示父目錄下已經存在此目錄
END

IF @@ERROR !=0
BEGIN
ROLLBACK TRANSACTION
RAISERROR 20000 'INSERT_OrganizationCategory: Cannot insert data into OrganizationCategory'
SET @Res='1' --1表示添加失敗
RETURN(1)
END
COMMIT TRANSACTION

END
SET NOCOUNT OFF

GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

ORACLE 裡面存儲過程相對來說比較復雜點,基本上ORACLE裡面的存儲過程,函數,之類的都要放在一個包裡面
首先定義包,包裡面要定義個游標,用於返回數據集,還有其他包中存在的存儲過程,函數等。

接著就是定義包體了,包體裡面就是實實在在的存儲過程和函數的實現形式。

下面寫個例子
oracle返回結果集,需要用包來實現。
包的作用是定義一個游標類型,以返回結果。
下面給一個最簡單的例子,你可以研究一下,很容易看懂。
CREATE OR REPLACE PACKAGE pkg_clsb
AS
--定義返回值(游標類型)
TYPE myrctype IS REF CURSOR;
--定義查詢過程
PROCEDURE pro_emp (cur_result OUT myrctype);
END pkg_clsb;
/

CREATE OR REPLACE PACKAGE BODY pkg_clsb
AS
--查詢過程
PROCEDURE pro_emp (cur_result OUT myrctype)
IS
sqlstr VARCHAR2 (500);
BEGIN
OPEN cur_result FOR
select * from emp ;
END pro_emp ;
END pkg_clsb;
/

❹ 怎樣學習存儲過程比較好

首先要學習一下相關的數據語言了解各種語言的結構,參照樣例嘗試學習各類操作以實踐為主這樣學習比較實用一些

❺ 提供一些關於SQL 存儲過程 的視頻教程

我這有一些自己寫的存儲過程的總結。

其實你自己動手寫幾個就清楚了。

存儲過程,其實就是講一些資料庫操作封裝起來,對外不可見而已。

如果你需要,我可以把我的資料給你