第一篇:mysql 5.0存儲(chǔ)過(guò)程學(xué)習(xí)總結(jié)
mysql 5.0存儲(chǔ)過(guò)程學(xué)習(xí)總結(jié)
一.創(chuàng)建存儲(chǔ)過(guò)程 1.基本語(yǔ)法:
create procedure sp_name()begin end 2.參數(shù)傳遞
二.調(diào)用存儲(chǔ)過(guò)程
1.基本語(yǔ)法:call sp_name()注意:存儲(chǔ)過(guò)程名稱后面必須加括號(hào),哪怕該存儲(chǔ)過(guò)程沒(méi)有參數(shù)傳遞
三.刪除存儲(chǔ)過(guò)程 1.基本語(yǔ)法:
drop procedure sp_name// 2.注意事項(xiàng)
(1)不能在一個(gè)存儲(chǔ)過(guò)程中刪除另一個(gè)存儲(chǔ)過(guò)程,只能調(diào)用另一個(gè)存儲(chǔ)過(guò)程
四.區(qū)塊,條件,循環(huán) 1.區(qū)塊定義,常用 begin end;也可以給區(qū)塊起別名,如: lable:begin end lable;可以用leave lable;跳出區(qū)塊,執(zhí)行區(qū)塊以后的代碼
2.條件語(yǔ)句 3.循環(huán)語(yǔ)句 :while循環(huán) loop循環(huán) repeat until循環(huán) repeat until循環(huán)
五.其他常用命令
1.show procedure status 顯示數(shù)據(jù)庫(kù)中所有存儲(chǔ)的存儲(chǔ)過(guò)程基本信息,包括所屬數(shù)據(jù)庫(kù),存儲(chǔ)過(guò)程名稱,創(chuàng)建時(shí)間等 2.show create procedure sp_name 顯示某一個(gè)存儲(chǔ)過(guò)程的詳細(xì)信息
mysql存儲(chǔ)過(guò)程基本函數(shù)
一.字符串類(lèi)
CHARSET(str)//返回字串字符集 CONCAT(string2 [,...])//連接字串
INSTR(string ,substring)//返回substring首次在string中出現(xiàn)的位置,不存在返回0 LCASE(string2)//轉(zhuǎn)換成小寫(xiě)
LEFT(string2 ,length)//從string2中的左邊起取length個(gè)字符 LENGTH(string)//string長(zhǎng)度
一起推論壇
一起推論壇004km.cn
第二篇:課題:SQLServer存儲(chǔ)過(guò)程返回值總結(jié)
SQLServer存儲(chǔ)過(guò)程返回值總結(jié)
1.存儲(chǔ)過(guò)程沒(méi)有返回值的情況(即存儲(chǔ)過(guò)程語(yǔ)句中沒(méi)有return之類(lèi)的語(yǔ)句)
用方法 int count = ExecuteNonQuery(..)執(zhí)行存儲(chǔ)過(guò)程其返回值只有兩種情況
(1)假如通過(guò)查詢分析器執(zhí)行該存儲(chǔ)過(guò)程,在顯示欄中假如有影響的行數(shù),則影響幾行count就是幾
(2)假如通過(guò)查詢分析器執(zhí)行該存儲(chǔ)過(guò)程,在顯示欄中假如顯示'命令已成功完成。'則count =-1;在顯示欄中假如有查詢結(jié)果,則count =-1
總結(jié):A.ExecuteNonQuery()該方法只返回影響的行數(shù),假如沒(méi)有影響行數(shù),則該方法的返回值只能是-1,不會(huì)為0。
B.不論ExecuteNonQuery()方法是按照CommandType.StoredProcedure或者CommandType.Text執(zhí)行,其效果和A一樣。
2.獲得存儲(chǔ)過(guò)程的返回值--通過(guò)查詢分析器獲得
(1)不帶任何參數(shù)的存儲(chǔ)過(guò)程(存儲(chǔ)過(guò)程語(yǔ)句中含有return)
---創(chuàng)建存儲(chǔ)過(guò)程
CREATE PROCEDURE testReturn
AS
return 145
GO
---執(zhí)行存儲(chǔ)過(guò)程
DECLARE @RC int
exec @RC=testReturn
select @RC
---說(shuō)明
查詢結(jié)果為145
(2)帶輸入?yún)?shù)的存儲(chǔ)過(guò)程(存儲(chǔ)過(guò)程語(yǔ)句中含有return)
---創(chuàng)建存儲(chǔ)過(guò)程
create procedure sp_add_table1
@in_name varchar(100), @in_addr varchar(100), @in_tel varchar(100)
as
if(@in_name = '' or @in_name is null)
return 1
else
begin
insert into table1(name,addr,tel)values(@in_name,@in_addr,@in_tel)
return 0
end
---執(zhí)行存儲(chǔ)過(guò)程
<1>執(zhí)行下列,返回1
declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count
<2>執(zhí)行下列,返回0
declare @count int exec @count = sp_add_table1 '','中三路','123456' select @count
---說(shuō)明
查詢結(jié)果不是0就是1
(3)帶輸出參數(shù)的存儲(chǔ)過(guò)程(存儲(chǔ)過(guò)程中可以有return可以沒(méi)有return)
例子A:
---創(chuàng)建存儲(chǔ)過(guò)程
create procedure sp_output
@output int output
as
set @output = 121
return 1
---執(zhí)行存儲(chǔ)過(guò)程
<1>執(zhí)行下列,返回121
declare @out int
exec sp_output @out output
select @out
<2>執(zhí)行下列,返回1
declare @out int
declare @count int exec @count = sp_output @out output
select @count
---說(shuō)明
有return,只要查詢輸出參數(shù),則查詢結(jié)果為輸出參數(shù)在存儲(chǔ)過(guò)程中最后變成的值;只要不查詢輸出參數(shù),則查詢結(jié)果為return返回的值
例子B:
---創(chuàng)建存儲(chǔ)過(guò)程
create procedure sp_output
@output int output
as
set @output = 121
---執(zhí)行存儲(chǔ)過(guò)程
<1>執(zhí)行下列,返回121
declare @out int
exec sp_output @out output
select @out
<2>執(zhí)行下列,返回0
declare @out int
declare @count int
exec @count = sp_output @out output
select @count
---說(shuō)明
沒(méi)有return,只要查詢輸出參數(shù),則查詢結(jié)果為輸出參數(shù)在存儲(chǔ)過(guò)程中最后變成的值;只要不查詢輸出參數(shù),則查詢結(jié)果為0
總結(jié):
(1)存儲(chǔ)過(guò)程共分為3類(lèi):
A.返回記錄集的存儲(chǔ)過(guò)程---------------------------其執(zhí)行結(jié)果是一個(gè)記錄集,例如:從數(shù)據(jù)庫(kù)中檢索出符合某一個(gè)或幾個(gè)條件的記錄
B.返回?cái)?shù)值的存儲(chǔ)過(guò)程(也可以稱為標(biāo)量存儲(chǔ)過(guò)程)-----其執(zhí)行完以后返回一個(gè)值,例如:在數(shù)據(jù)庫(kù)中執(zhí)行一個(gè)有返回值的函數(shù)或命令
C.行為存儲(chǔ)過(guò)程----用來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的某個(gè)功能,而沒(méi)有返回值,例如:在數(shù)據(jù)庫(kù)中的更新和刪除操作
(2)含有return的存儲(chǔ)過(guò)程其返回值為return返回的那個(gè)值
(3)沒(méi)有return的存儲(chǔ)過(guò)程,不論執(zhí)行結(jié)果有無(wú)記錄集,其返回值是0
(4)帶輸出參數(shù)的存儲(chǔ)過(guò)程:假如有return則返回return返回的那個(gè)值,假如要select輸出參數(shù),則出現(xiàn)輸出參數(shù)的值,于有無(wú)return無(wú)關(guān)
--------------------3.獲得存儲(chǔ)過(guò)程的返回值--通過(guò)程序獲得
---------------------------SqlParameter[] cmdParms = {..,new SqlParameter(“@return”,SqlDbType.Int)};cmdParms[cmdParms.Length1].Direction = ParameterDirection.Output或者 cmdParms[cmdParms.Length1].Value;
分類(lèi): asp.net
第三篇:存儲(chǔ)過(guò)程的優(yōu)缺點(diǎn)個(gè)人總結(jié)
優(yōu)點(diǎn)
1.在生產(chǎn)環(huán)境下,可以通過(guò)直接修改存儲(chǔ)過(guò)程的方式修改業(yè)務(wù)邏輯(或bug),而不用重啟服務(wù)器。但這一點(diǎn)便利被許多人濫用了。有人直接就在正式服務(wù)器上修改存儲(chǔ)過(guò)程,而沒(méi)有經(jīng)過(guò)完整的測(cè)試,后果非常嚴(yán)重。
2.執(zhí)行速度快。存儲(chǔ)過(guò)程經(jīng)過(guò)編譯之后會(huì)比單獨(dú)一條一條執(zhí)行要快。但這個(gè)效率真是沒(méi)太大影響。如果是要做大數(shù)據(jù)量的導(dǎo)入、同步,我們可以用其它手段。
3.減少網(wǎng)絡(luò)傳輸。存儲(chǔ)過(guò)程直接就在數(shù)據(jù)庫(kù)服務(wù)器上跑,所有的數(shù)據(jù)訪問(wèn)都在服務(wù)器內(nèi)部進(jìn)行,不需要傳輸數(shù)據(jù)到其它終端。但我們的應(yīng)付服務(wù)器通常與數(shù)據(jù)庫(kù)是在同一內(nèi)網(wǎng),大數(shù)據(jù)的訪問(wèn)的瓶頸會(huì)是硬盤(pán)的速度,而不是網(wǎng)速。
4.能夠解決presentation與數(shù)據(jù)之間的差異,說(shuō)得文藝青年點(diǎn)就是解決OO模型與二維數(shù)據(jù)持久化之間的阻抗。領(lǐng)域模型和數(shù)據(jù)模型的設(shè)計(jì)可能不是同一個(gè)人(一個(gè)是SA,另一個(gè)是DBA),兩者的分歧可能會(huì)很大——這不奇怪,一個(gè)是以O(shè)O的思想來(lái)設(shè)計(jì),一個(gè)是結(jié)構(gòu)化的數(shù)據(jù)來(lái)設(shè)計(jì),大家互不妥協(xié)——你說(shuō)為了軟件的彈性必須這么設(shè)計(jì),他說(shuō)為了效率必須那樣設(shè)計(jì),為了抹平鴻溝,就用存儲(chǔ)過(guò)程來(lái)做數(shù)據(jù)存儲(chǔ)的邏輯映射(把屬性映射到字段)。好吧,臺(tái)下已經(jīng)有同學(xué)在叨咕ORM了。
5.方便DBA優(yōu)化。所有的SQL集中在一個(gè)地方,DBA會(huì)很高興。這一點(diǎn)算是ORM的軟肋。不過(guò)按照CQRS框架的思想,查詢是用存儲(chǔ)過(guò)程還是ORM,還真不是問(wèn)題——DBA對(duì)數(shù)據(jù)庫(kù)的優(yōu)化,ORM一樣會(huì)受益。況且放在ORM中還能用二級(jí)緩存,有些時(shí)候效率還會(huì)更高。
缺點(diǎn)
1.SQL本身是一種結(jié)構(gòu)化查詢語(yǔ)言,加上了一些控制(賦值、循環(huán)和異常處理等),但不是OO的,本質(zhì)上還是過(guò)程化的,面對(duì)復(fù)雜的業(yè)務(wù)邏輯,過(guò)程化的處理會(huì)很吃力。這一點(diǎn)算致命傷。
2.不便于調(diào)試?;旧蠜](méi)有較好的調(diào)試器,很多時(shí)候是用print來(lái)調(diào)試,但用這種方法調(diào)試長(zhǎng)達(dá)數(shù)百行的存儲(chǔ)過(guò)程簡(jiǎn)直是噩夢(mèng)。好吧,這一點(diǎn)不算啥,C#/java一樣能寫(xiě)出噩夢(mèng)般的代碼。
3.沒(méi)辦法應(yīng)用緩存。雖然有全局臨時(shí)表之類(lèi)的方法可以做緩存,但同樣加重了數(shù)據(jù)庫(kù)的負(fù)擔(dān)。如果緩存并發(fā)嚴(yán)重,經(jīng)常要加鎖,那效率實(shí)在堪憂。
4.無(wú)法適應(yīng)數(shù)據(jù)庫(kù)的切割(水平或垂直切割)。數(shù)據(jù)庫(kù)切割之后,存儲(chǔ)過(guò)程并不清楚數(shù)據(jù)存儲(chǔ)在哪個(gè)數(shù)據(jù)庫(kù)中。
5.精通SQL的新手越來(lái)越少——不要笑,這是真的,我面試過(guò)N多新人,都不知道如何創(chuàng)建全局臨時(shí)表、不知道having、不知道聚集索引和非聚集索引,更別提游標(biāo)和提交叉表查詢了。好吧,這個(gè)缺點(diǎn)算是湊數(shù)用的,作為屌絲程序員,我們的口號(hào)是:沒(méi)有不會(huì)的,只有不用的。除了少數(shù)有語(yǔ)言潔癖的人,我相信精通SQL只是時(shí)間問(wèn)題。
總結(jié)
存儲(chǔ)過(guò)程最大的優(yōu)點(diǎn)是部署的方便性——可以在生產(chǎn)環(huán)境下直接修改——雖然濫用的后果很?chē)?yán)重。
存儲(chǔ)過(guò)程最大的缺點(diǎn)是SQL語(yǔ)言本身的局限性——我們不應(yīng)該用存儲(chǔ)過(guò)程處理復(fù)雜的業(yè)務(wù)邏輯——讓SQL回歸它“結(jié)構(gòu)化查詢語(yǔ)言”的功用吧。
第四篇:用java調(diào)用oracle存儲(chǔ)過(guò)程總結(jié)
用java調(diào)用oracle存儲(chǔ)過(guò)程總結(jié)
分類(lèi): PL/SQL系列 2009-09-24 15:08 253人閱讀 評(píng)論(0)收藏 舉報(bào)
聲明:
以下的例子不一定正確,只是為了演示大概的流程。
一:無(wú)返回值的存儲(chǔ)過(guò)程 存儲(chǔ)過(guò)程為:
CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)AS BEGIN
INSERT INTO HYQ.B_ID(I_ID,I_NAME)VALUES(PARA1, PARA2);END TESTA;
然后呢,在java里調(diào)用時(shí)就用下面的代碼: package com.hyq.src;
import java.sql.*;import java.sql.ResultSet;
public class TestProcedureOne {
public TestProcedureOne(){
}
public static void main(String[] args){
String driver = “oracle.jdbc.driver.OracleDriver”;
String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521: hyq ”;
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
CallableStatement cstmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);
CallableStatement proc = null;
proc = conn.prepareCall(“{ call HYQ.TESTA(?,?)}”);
proc.setString(1, “100”);
proc.setString(2, “TestOne”);
proc.execute();
}
catch(SQLException ex2){
ex2.printStackTrace();
}
catch(Exception ex2){
ex2.printStackTrace();
}
finally{
try {
if(rs!= null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch(SQLException ex1){
}
}
} }
二:有返回值的存儲(chǔ)過(guò)程(非列表)
當(dāng)然了,這就先要求要建張表TESTTB,里面兩個(gè)字段(I_ID,I_NAME)。
存儲(chǔ)過(guò)程為: CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)AS BEGIN
SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;END TESTB;
在java里調(diào)用時(shí)就用下面的代碼: package com.hyq.src;
public class TestProcedureTWO {
public TestProcedureTWO(){
}
public static void main(String[] args){
String driver = “oracle.jdbc.driver.OracleDriver”;
String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);
CallableStatement proc = null;
proc = conn.prepareCall(“{ call HYQ.TESTB(?,?)}”);
proc.setString(1, “100”);
proc.registerOutParameter(2, Types.VARCHAR);
proc.execute();
String testPrint = proc.getString(2);
System.out.println(“=testPrint=is=”+testPrint);
}
catch(SQLException ex2){
ex2.printStackTrace();
}
catch(Exception ex2){
ex2.printStackTrace();
}
finally{
try {
if(rs!= null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch(SQLException ex1){
}
}
} }
}
注意,這里的proc.getString(2)中的數(shù)值2并非任意的,而是和存儲(chǔ)過(guò)程中的out列對(duì)應(yīng)的,如果out是在第一個(gè)位置,那就是proc.getString(1),如果是第三個(gè)位置,就是proc.getString(3),當(dāng)然也可以同時(shí)有多個(gè)返回值,那就是再多加幾個(gè)out參數(shù)了。
三:返回列表
由于oracle存儲(chǔ)過(guò)程沒(méi)有返回值,它的所有返回值都是通過(guò)out參數(shù)來(lái)替代的,列表同樣也不例外,但由于是集合,所以不能用一般的參數(shù),必須要用pagkage了.所以要分兩部分,1,建一個(gè)程序包。如下:
CREATE OR REPLACE PACKAGE TESTPACKAGE AS
TYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;
2,建立存儲(chǔ)過(guò)程,存儲(chǔ)過(guò)程為:
CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR)IS BEGIN
OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;
可以看到,它是把游標(biāo)(可以理解為一個(gè)指針),作為一個(gè)out 參數(shù)來(lái)返回值的。在java里調(diào)用時(shí)就用下面的代碼: package com.hyq.src;import java.sql.*;
import java.io.OutputStream;import java.io.Writer;
import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;
public class TestProcedureTHREE {
public TestProcedureTHREE(){
}
public static void main(String[] args){
String driver = “oracle.jdbc.driver.OracleDriver”;
String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;
Statement stmt = null;
ResultSet rs = null;
Connection conn = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(strUrl, “hyq”, “hyq”);
CallableStatement proc = null;
proc = conn.prepareCall(“{ call hyq.testc(?)}”);
proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
rs =(ResultSet)proc.getObject(1);
while(rs.next())
{
System.out.println(“
}
}
catch(SQLException ex2){
ex2.printStackTrace();
}
catch(Exception ex2){
ex2.printStackTrace();
}
finally{
try {
if(rs!= null){
rs.close();
if(stmt!=null){
stmt.close();
}
if(conn!=null){
conn.close();
}
}
}
catch(SQLException ex1){
}
}
} }
四。Hibernate調(diào)用存儲(chǔ)過(guò)程
Connection con = session.connect();
CallableStatement proc = null;
con = connectionPool.getConnection();
proc = con.prepareCall(“{ call set_death_age(?, ?)}”);proc.setString(1, XXX);
proc.setInt(2, XXx);...proc.execute();
session.close();
在Hibernate中調(diào)用存儲(chǔ)過(guò)程的示范代碼--
如果底層數(shù)據(jù)庫(kù)(如Oracle)支持存儲(chǔ)過(guò)程,也可以通過(guò)存儲(chǔ)過(guò)程來(lái)執(zhí)行批量更新。存儲(chǔ)過(guò)程直接在數(shù)據(jù)庫(kù)中運(yùn)行,速度更加快。在Oracle數(shù)據(jù)庫(kù)中可以定義一個(gè)名為batchUpdateStudent()的存儲(chǔ)過(guò)程,代碼如下:
create or replace procedure batchUpdateStudent(p_age in number)as begin update STUDENT set AGE=AGE+1 where AGE>p_age;end;以上存儲(chǔ)過(guò)程有一個(gè)參數(shù)p_age,代表學(xué)生的年齡,應(yīng)用程序可按照以下方式調(diào)用存儲(chǔ)過(guò)程: tx = session.beginTransaction();Connection con=session.connection();String procedure = “{call batchUpdateStudent(?)}”;CallableStatement cstmt = con.prepareCall(procedure);cstmt.setInt(1,0);//把年齡參數(shù)設(shè)為0 cstmt.executeUpdate();tx.commit();在以上代碼中,我用的是Hibernate的 Transaction接口來(lái)聲明事務(wù),而不是采用JDBC API來(lái)聲明事務(wù)。
存儲(chǔ)過(guò)程中有一個(gè)參數(shù)p_age,代表客戶的年齡,應(yīng)用程序可按照以下方式調(diào)用存儲(chǔ)過(guò)程:
代碼內(nèi)容
tx = session.beginTransaction();Connection con=session.connection();
String procedure = “{call batchUpdateCustomer(?)}”;
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0);//把年齡參數(shù)設(shè)為0
cstmt.executeUpdate();
tx.commit();
CREATE procedure selectAllUsers DYNAMIC RESULT SETS 1 BEGIN
DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR
SELECT * FROM test;
OPEN temp_cursor1;END;
映射文件中關(guān)于存儲(chǔ)過(guò)程內(nèi)容如下
............
{ ? = call selectAllUsers()}
{ ? = call selectAllUsers()} 也可以寫(xiě)成{ call selectAllUsers()},如果有參數(shù)就寫(xiě)成
{ ? = call selectAllUsers(?,?,?)}
代碼中對(duì)query設(shè)置相應(yīng)位置上的值就OK Java調(diào)用關(guān)鍵代碼如下
Session session = HibernateUtil.currentSession();
Query query = session.getNamedQuery(“selectAllUsers”);
List list = query.list();
System.out.println(list);
要求你的存儲(chǔ)過(guò)程必須能返回記錄集,否則要出錯(cuò)
如果你的存儲(chǔ)過(guò)程是完成非查詢?nèi)蝿?wù)就應(yīng)該在配置文件用以下三個(gè)標(biāo)簽
setFirstResult(int)和setMaxResults(int)方法來(lái)分頁(yè)
第五篇:教學(xué):數(shù)據(jù)庫(kù)-存儲(chǔ)過(guò)程資料
教學(xué)三:存儲(chǔ)過(guò)程
一、教學(xué)目的
(1)掌握T-SQL流控制語(yǔ)句;(2)掌握創(chuàng)建存儲(chǔ)過(guò)程的方法;(3)掌握存儲(chǔ)過(guò)程的執(zhí)行方法;(4)掌握存儲(chǔ)過(guò)程的管理和維護(hù)。
二、教學(xué)內(nèi)容
1、創(chuàng)建簡(jiǎn)單存儲(chǔ)過(guò)程
(1)創(chuàng)建一個(gè)名為stu_pr的存儲(chǔ)過(guò)程,該存儲(chǔ)過(guò)程能查詢出051班學(xué)生的所有資料,包括學(xué)生的基本信息、學(xué)生的選課信息(含未選課同學(xué)的信息)。要求在創(chuàng)建存儲(chǔ)過(guò)程前請(qǐng)判斷該存儲(chǔ)過(guò)程是否已創(chuàng)建,若已創(chuàng)建則先刪除,并給出“已刪除!”信息,否則就給出“不存在,可創(chuàng)建!”的信息。
if exists(select name from sysobjects where name='stu_pr'and type='p')begin print '已刪除!' drop procedure stu_pr end else print '不存在,可創(chuàng)建!' go create procedure stu_pr as select * from Student_20103322 left outer join SC_20103322
on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where classno='051' 1
exec stu_pr
2、創(chuàng)建帶參數(shù)的存儲(chǔ)過(guò)程
(1)創(chuàng)建一個(gè)名為stu_proc1的存儲(chǔ)過(guò)程,查詢某系、某姓名的學(xué)生的學(xué)號(hào)、姓名、年齡,選修課程名、成績(jī)。系名和姓名在調(diào)用該存儲(chǔ)過(guò)程時(shí)輸入,其默認(rèn)值分別為“%”與“林%”。執(zhí)行該存儲(chǔ)過(guò)程,用多種參數(shù)加以測(cè)試。
if exists(select name from sysobjects where name='stu_proc1' and type='p')begin
print '已刪除!' drop procedure stu_proc1 end else
print '不存在,可創(chuàng)建!' go create procedure stu_proc1 @Sdept char(8)='%',@Sname varchar(8)='林%' as select Sdept,Student_20103322.Sno,Sname,DATEDIFF(YEAR,Birth,GETDATE())age,Cname,Grade from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Sdept like @Sdept and Sname like @Sname
execute stu_proc1 '計(jì)算機(jī)系','林紅' 3
execute stu_proc1 '信息安全','胡光璟'
(2)創(chuàng)建一個(gè)名為Student_sc的存儲(chǔ)過(guò)程,可查詢出某段學(xué)號(hào)的同學(xué)的學(xué)號(hào)、姓名、總成績(jī)。(學(xué)號(hào)起始號(hào)與終止號(hào)在調(diào)用時(shí)輸入,可設(shè)默認(rèn)值)。執(zhí)行該存儲(chǔ)過(guò)程。if exists(select name from sysobjects where name='Student_sc'and type='p')begin print '已刪除!' drop procedure student_sc end else print '不存在,可創(chuàng)建!' go create procedure Student_sc @Sno1 char(8),@Sno2 char(8)as select Student_20103322.Sno,Sname,SUM(Grade)總成績(jī) from Student_20103322,SC_20103322,Course_20103322 where Student_20103322.Sno=SC_20103322.Sno and Course_20103322.Cno=SC_20103322.Cno and Student_20103322.Sno>=@Sno1 and Student_20103322.Sno<=@Sno2 group by Student_20103322.Sno,Sname
execute Student_sc '20110000','20110003' 5
3、創(chuàng)建帶輸出參數(shù)的存儲(chǔ)過(guò)程
(1)創(chuàng)建一個(gè)名為Course_sum的存儲(chǔ)過(guò)程,可查詢某門(mén)課程考試的總成績(jī)??偝煽?jī)可以輸出,以便進(jìn)一步調(diào)用。
if exists(select name from sysobjects where name='Course_sum'and type='p')begin print '已刪除!' drop procedure Course_sum end else print '不存在,可創(chuàng)建!' go create procedure Course_sum @Cname varchar(20),@sum int output as select @sum=sum(Grade)from SC_20103322,Course_20103322 where Course_20103322.Cno=SC_20103322.Cno and Cname=@Cname
group by SC_20103322.Cno,Cname
declare @ping int exec Course_sum '高數(shù)',@ping output print '高數(shù)的考試總成績(jī)?yōu)椋?+cast(@ping as varchar(20))
(2)創(chuàng)建一執(zhí)行該存儲(chǔ)過(guò)程的批處理,要求當(dāng)總成績(jī)小于100時(shí),顯示信息為:“XX課程的總成績(jī)?yōu)椋篨X,其總分未達(dá)100分”。超過(guò)100時(shí),顯示信息為:“XX課程的總成績(jī)?yōu)椋篨X”。
declare @sum int
declare @Cname varchar(20)Exec Course_sum @cname,@sum out begin
if @sum <100 print cast(@cname as varchar)+'課程的總成績(jī)?yōu)?'+cast(@sum as varchar)+ ',其總分未達(dá)分'
else
print cast(@cname as varchar)+'課程的總成績(jī)?yōu)?'+cast(@sum as varchar)end
declare @sum int
declare @Cname varchar(20)set @Cname='高數(shù)' Exec Course_sum @cname,@sum out begin
if @sum <100 print cast(@cname as varchar)+'課程的總成績(jī)?yōu)?'+cast(@sum as varchar)+ ',其總分未達(dá)分'
else
print cast(@cname as varchar)+'課程的總成績(jī)?yōu)?'+cast(@sum as varchar)end
4、創(chuàng)建帶重編譯及加密選項(xiàng)的存儲(chǔ)過(guò)程
創(chuàng)建一個(gè)名為update_sc、并帶重編譯及加密選項(xiàng)的存儲(chǔ)過(guò)程,可更新指定學(xué)號(hào)、指定課程號(hào)的學(xué)生的課程成績(jī)。(學(xué)號(hào)、課程號(hào)由調(diào)用時(shí)輸入)
if exists(select name from sysobjects where name='update_sc'and type='p')begin print '已刪除!' drop procedure update_sc end else print '不存在,可創(chuàng)建!' go create procedure update_sc
@sno char(8),@cno char(3),@grade tinyint with RECOMPILE , ENCRYPTION as update SC_20103322 set Grade=@grade
where Sno=@sno and Cno=@cno
declare @sno char(8),@cno char(3),@grade tinyint set @sno='20103322' set @cno='003' set @grade='100' exec update_sc @sno,@cno,@grade begin print cast(@sno as varchar)+'的'+cast(@cno as varchar)+'課程成績(jī)?yōu)椋?+cast(@grade as varchar)end
5、使用T-SQL語(yǔ)句管理和維護(hù)存儲(chǔ)過(guò)程
(1)使用sp_helptext查看存儲(chǔ)過(guò)程Student_sc的定義腳本
exec sp_helptext student_sc
(2)使用select語(yǔ)句查看Student_sc存儲(chǔ)過(guò)程的定義腳本(提示:通過(guò)查詢表sysobjects和表syscomments)
select *
from sysobjects,syscomments where name = 'Student_sc'
(3)將存儲(chǔ)過(guò)程stu_pr改為查詢學(xué)號(hào)為2011001的學(xué)生的詳細(xì)資料。
alter procedure stu_pr as select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001'
(4)刪除存儲(chǔ)過(guò)程stu_pr。
drop procedure stu_pr
6、使用SQL Server Management Studio管理存儲(chǔ)過(guò)程
(1)在SQL Server Management Studio中重新創(chuàng)建剛刪除的存儲(chǔ)過(guò)程stu_pr create procedure stu_pr as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' end
(2)查看存儲(chǔ)過(guò)程stu_pr,并將該過(guò)程修改為查詢051班女生的所有資料。
ALTER procedure [dbo].[stu_pr] as begin select * from Student_20103322 left outer join SC_20103322 on(Student_20103322.Sno=SC_20103322.Sno)left outer join Course_20103322 on(Course_20103322.Cno=SC_20103322.Cno)where Student_20103322.Sno='2011001' and Sex='女' end
(3)刪除存儲(chǔ)過(guò)程stu_pr
【完】