樓下的太麻煩了吧。emp員工表,輸入任何部門號,返回部門的總工資,把總工資和部門好,分別放進emp2表裡。
編寫存儲過程查詢某部門員工的工資總和
create or replace procere my_text(v_deptno number)
is
cursor c is select* from emp;
v1 number:=0;
begin
for a in c loop
if(a.deptno=v_deptno) then
v1:=v1+a.sal;
end if;
end loop;
insert into emp2 values(v1,v_deptno);
end;
是不是很吊啊?樓主?
❷ SQL2000編寫存儲過程
1:
Create procere p_getCompany_max_person
as
begin
select top 1 company-name from
(
select sum(person-name) as count,company-name from works group by company
) as temp
end
go
2:
create procere p_getCompany_min_salary
as
begin
Declare @salary int
select @salary=min(salary) as salary from works
select company-name from works where salary=@salary
end
go
第三個懶得回答了,
❸ sql2000的存儲過程
if exists (select * from sysobjects where name = 'ProcName' and xtype = 'P')
drop procere ProcName
go
create procere ProcName
SqlServer不能像Oracle那樣用,必須如果存在的話先把以前的刪除才行
❹ sql存儲過程實例
CREATE OR REPLACE
procere procere_name
begin
for c in (select column_a_name from table_a_name)loop
update table_b_name set column_b_name=c.column_a_name where....
end loop;
end;
❺ SQL2000 寫一個存儲過程
請取出2009-03-11 07:48:16 這個時刻以前 2 分鍾的數據行.
2009-03-11 07:50:20 0 0 253
搞清楚是之前還是之後
declare @dt Datetime
set @dt=getdate()
select * from table1 where 時間 between dateadd(n,-2,@dt) and @dt--之前
select * from table1 where 時間 between @dt and dateadd(n,2,@dt)--之後
❻ 簡單sql存儲過程實例、儲過程實戰
實例1:只返回單一記錄集的存儲過程。
銀行存款表(bankMoney)的內容如下
Id
userID
Sex
Money
001
Zhangsan
男
30
002
Wangwu
男
50
003
Zhangsan
男
40
要求1:查詢表bankMoney的內容的存儲過程
create
procere
sp_query_bankMoney
as
select
*
from
bankMoney
go
exec
sp_query_bankMoney
注*
在使用過程中只需要把中的SQL語句替換為存儲過程名,就可以了很方便吧!
實例2(向存儲過程中傳遞參數):
加入一筆記錄到表bankMoney,並查詢此表中userID=
Zhangsan的所有存款的總金額。
Create
proc
insert_bank
@param1
char(10),@param2
varchar(20),@param3
varchar(20),@param4
int,@param5
int
output
with
encryption
---------加密
as
insert
bankMoney
(id,userID,sex,Money)
Values(@param1,@param2,@param3,
@param4)
select
@param5=sum(Money)
from
bankMoney
where
userID='Zhangsan'
go
在SQL
Server查詢分析器中執行該存儲過程的方法是:
declare
@total_price
int
exec
insert_bank
'004','Zhangsan','男',100,@total_price
output
print
'總余額為'+convert(varchar,@total_price)
go
在這里再啰嗦一下存儲過程的3種傳回值(方便正在看這個例子的朋友不用再去查看語法內容):
1.以Return傳回整數
2.以output格式傳回參數
3.Recordset
傳回值的區別:
output和return都可在批次程式中用變數接收,而recordset則傳回到執行批次的客戶端中。
實例3:使用帶有復雜
SELECT
語句的簡單過程
下面的存儲過程從四個表的聯接中返回所有作者(提供了姓名)、出版的書籍以及出版社。該存儲過程不使用任何參數。
USE
pubs
IF
EXISTS
(SELECT
name
FROM
sysobjects
WHERE
name
=
'au_info_all'
AND
type
=
'P')
DROP
PROCEDURE
au_info_all
GO
CREATE
PROCEDURE
au_info_all
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
GO
au_info_all
存儲過程可以通過以下方法執行:
EXECUTE
au_info_all
實例4:使用帶有參數的簡單過程
CREATE
PROCEDURE
au_info
@lastname
varchar(40),
@firstname
varchar(20)
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
=
@firstname
AND
au_lname
=
@lastname
GO
au_info
存儲過程可以通過以下方法執行:
EXECUTE
au_info
'Dull',
'Ann'
--
Or
EXECUTE
au_info
@lastname
=
'Dull',
@firstname
=
'Ann'
--
Or
EXECUTE
au_info
@firstname
=
'Ann',
@lastname
=
'Dull'
實例5:使用帶有通配符參數的簡單過程
CREATE
PROCEDURE
au_info2
@lastname
varchar(30)
=
'D%',
@firstname
varchar(18)
=
'%'
AS
SELECT
au_lname,
au_fname,
title,
pub_name
FROM
authors
a
INNER
JOIN
titleauthor
ta
ON
a.au_id
=
ta.au_id
INNER
JOIN
titles
t
ON
t.title_id
=
ta.title_id
INNER
JOIN
publishers
p
ON
t.pub_id
=
p.pub_id
WHERE
au_fname
LIKE
@firstname
AND
au_lname
LIKE
@lastname
GO
au_info2
存儲過程可以用多種組合執行。下面只列出了部分組合:
EXECUTE
au_info2
--
Or
EXECUTE
au_info2
'Wh%'
--
Or
EXECUTE
au_info2
@firstname
=
'A%'
--
Or
EXECUTE
au_info2
'[CK]ars[OE]n'
--
Or
EXECUTE
au_info2
'Hunter',
'Sheryl'
--
Or
EXECUTE
au_info2
'H%',
'S%'
❼ 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 server 2000 和VB 做一個存儲過程和觸發器的例子
1. 和特定表或視圖關聯。觸發器定義在特定的表或視圖上,稱為觸發器表或觸發器視圖2. 自動調用。當試圖在某個表插入、更新或刪除數據,而在那個表上定義了針對所做動作的觸發器,那麼觸發器會自動執行3. 不能被直接調用。不像普通的存儲過程,觸發器不能被直接調用,也不傳遞或接受參數4. 是一個事務的部分。觸發器及觸發它的語句被視為單個事務,可以在觸發器內的任何地方被回滾二、創建觸發器創建觸發器,觸發器是一種特殊的存儲過程,在用戶試圖對指定的表執行指定的數據修改語句時自動執行。Microsoft�0�3 SQL Server�6�4 允許為任何給定的 INSERT、UPDATE 或 DELETE 語句創建多個觸發器。1.語法CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR|AFTER|INSTEAD OF}{[INSERT][,][UPDATE]}ASsql_statement [ ...n ] 2.參數trigger_name是觸發器的名稱。觸發器名稱必須符合標識符規則,並且在資料庫中必須唯一。可以選擇是否指定觸發器所有者名稱。Table | view是在其上執行觸發器的表或視圖,有時稱為觸發器表或觸發器視圖。可以選擇是否指定表或視圖的所有者名稱。WITH ENCRYPTION加密 syscomments 表中包含 CREATE TRIGGER 語句文本的條目。使用 WITH ENCRYPTION 可防止將觸發器作為 SQL Server 復制的一部分發布。FOR | AFTER指定觸發器只有在觸發 SQL 語句中指定的所有操作都已成功執行後才激發。所有的引用級聯操作和約束檢查也必須成功完成後,才能執行此觸發器。如果僅指定 FOR 關鍵字,則 AFTER 是默認設置。不能在視圖上定義 AFTER 觸發器。INSTEAD OF指定執行觸發器而不是執行觸發 SQL 語句,從而替代觸發語句的操作。在表或視圖上,每個 INSERT、UPDATE 或 DELETE 語句最多可以定義一個 INSTEAD OF 觸發器。然而,可以在每個具有 INSTEAD OF 觸發器的視圖上定義視圖。{[DELETE][,][INSERT][,][UPDATE]}是指定在表或視圖上執行哪些數據修改語句時將激活觸發器的關鍵字。必須至少指定一個選項。在觸發器定義中允許使用以任意順序組合的這些關鍵字。如果指定的選項多於一個,需用逗號分隔這些選項。對於 INSTEAD OF 觸發器,不允許在具有 ON DELETE 級聯操作引用關系的表上使用 DELETE 選項。同樣,也不允許在具有 ON UPDATE 級聯操作引用關系的表上使用 UPDATE 選項。AS是觸發器要執行的操作。sql_statement是觸發器的條件和操作。觸發器條件指定其它准則,以確定 DELETE、INSERT 或 UPDATE 語句是否導致執行觸發器操作。3.注意事項:SQL Server 不允許在觸發器中使用下列語句: ALTER DATABASE、CREATE DATABASE、DROP DATABASE、LOAD DATABASE、LOAD LOG、RESTORE DATABASE、RESTORE LOG三、觸發器實例1.簡單的觸發器,幾種觸發器的比較.CREATE TRIGGER TRIG1 ON 圖書FOR DELETEAS PRINT '觸發器已執行!' 2.在「租借信息表」上創建 INSERT觸發器「借閱冊數」,如果「允借冊數」為0,就不能再借了。CREATE TRIGGER 借閱冊數 ON 借閱AFTER INSERTASIF (SELECT 允借冊數 FROM 讀者,inserted WHERE 讀者.借書證號=inserted.借書證號)=0BEGIN PRINT '你可借書的冊數為0,不能再借圖書了' ROLLBACK TRANSACTIONEND3.在「租借信息」表上創建 INSERT觸發器「借書期限」,如果學生借書時間超過30天則不能借書。CREATE TRIGGER 借書期限 ON 租借信息 AFTER INSERTAS IF EXISTS(SELECT * FROM 租借信息,inserted WHERE 租借信息.借書證號=inserted.借書證號 AND (GETDATE())-租借信息.借書日期)>30 AND 租借信息.還書日期 IS NULL)BEGIN PRINT '你有超期未還的圖書,不能再借圖書了!' ROLLBACK TRANSACTIONEND存儲過程的應用舉例 例1 創建一個「借書過程」存儲過程,該存儲過程實現的功能是幫助讀者完成借書過程。即讀者只要提供借書證號、圖書名稱和圖書的作者,就能完成借書。該程序完成的具體操作是:根據讀者所提供的圖書名稱和作者,在圖書信息表中進行查詢,如果該書未被借出則繼續完成借書操作,否則提示讀者圖書已經惜出。借書操作主要包括三個操作:向「租借信息」表中插入一條記錄(保存該讀者的借書信息),將「圖書信息」表中對應記錄的狀態列設為1(避免他人再惜),將「學生信息」表中對應記錄的借書冊數增1(統計該讀者的借書冊數)。這三個操作要麼都執行,要麼都不執行。USE 圖書借閱管理GOCREATE PROC 借書過程 @借書證號 char(5),@圖書名稱 varchar(40),@作者 varchar(20) AS DECLARE @借閱號 int,@圖書編號 varchar(6) IF EXISTS (SELECT * FROM 圖書信息 WHERE 圖書名稱=@圖書名稱 and 作者=@作者 and 狀態=0) BEGIN BEGIN TRAN SELECT @圖書編號=圖書編號 FROM 圖書信息 --取出圖書所對應的圖書編號 WHERE 圖書名稱=@圖書名稱 and 作者=@作者 and 狀態=0 UPDATE 圖書信息 SET 狀態=1 WHERE 圖書編號=@圖書編號 --修改"狀態"列的值 IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '更新圖書信息表失敗。' RETURN 1 END SELECT @借閱號=借閱號 FROM 租借信息 ORDER BY 借閱號 --取出最大借閱號 IF @借閱號 is null SET @借閱號=0 INSERT 租借信息(借閱號,借書證號,圖書編號,借書日期) VALUES (@借閱號+1,@借書證號,@圖書編號,getdate()) IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '借書失敗。' RETURN 3 END UPDATE 學生信息 SET 借書冊數=借書冊數+1 --修改該讀者的借書冊數 WHERE 借書證號=@借書證號 IF @@error!=0 BEGIN ROLLBACK TRAN PRINT '更新學生信息失敗。' RETURN 4 END COMMIT TRAN PRINT '恭喜您借書成功!圖書編號是:'+@圖書編號 RETURN 0 END ELSE BEGIN PRINT '圖書已經借出或沒有。' RETURN 2 END 執行」借書過程』USE 圖書借閱管理GOEXEC 借書過程 '00006','大學英語(2)','李慧琴' 例2 編寫「還書」存儲過程,要求通過學生的「借書證號」和「圖書編號」來完成還書過程。 還書操作:修改「租借信息」表中的「還書日期」,相應地將「圖書信息」表中對應記錄的「狀態」列的值修改為0,「學生信息」表中「借書冊數」減1。 CREATE PROC 還書 @借書證號varchar(5),@圖書編號 varchar(6),@借書日期 datetime=null AS BEGIN TRAN IF @還書日期 IS NOT NULL UPDATE 租借信息SET 還書日期=@還書日期 WHERE 圖書編號=@圖書編號 AND 借書證號=@借書證號 ELSE UPDATE 租借信息SET還書日期=getdate() WHERE 圖書編號=@圖書編號 AND 借書證號=@借書證號 IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT 『還書失敗。』 RETURN 1 END UPDATE 圖書信息 SET 狀態=0 WHERE圖書編號=@圖書編號 IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT 『還書失敗。』 RETURN 2 END UPDATE 學生信息 SET 借書冊數=借書冊數-1 WHERE 借書證號=@借書證號IF @@ERROR!=0 OR @@ROWCOUNT=0 BEGIN ROLLBACK TRAN PRINT 『還書失敗。』 RETURN 3 END COMMIT PRINT 『恭喜你還書成功!
❾ sql存儲過程,給幾個實例做做。。。
如:表table 欄位有 id(主鍵),name,pwd,age,sex
create proc p
@name varchar(10),
@pwd varchar(10)
as
select * from table where name=@name and pwd=@pwd
----根據用戶名和密碼得到個人相關信息
exec p '張三',123456 ---執行存儲過程
❿ SQL2000存儲過程謝謝
改一下:
create proc name1
(
@top1 varchar(5),
@top2 varchar(5)
)
as
declare @str varchar(200)
set @str = 'select top '+@top1+' 欄位1,欄位2 from table1 where id not in ( select top '+@top2+' id from table1 )'
exec(@str)
執行測試 exec name1 '2','3'