面試題sql的存儲過程-ag真人国际官网
什麼是存儲過程?分為哪幾類?
答:存儲過程是sql語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。
1.使用存儲過程有什麼好處?
答:優點:(1)提供安全機制(2)改進了執行性能(3)減少網路流量(4)允許模塊化程序設計
⑵ sql 中的存儲過程誰能描述下下··謝謝
標准答案:
在最新的sql2005中的存儲過程(procere)類似於java語言中的方法,它是sql語句和控制流語句的預編譯集合。存儲過程在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數,邏輯控制語句以及其他強大的編程功能。
存儲過程可包含邏輯控制語句和數據操作語句,它可以接收參數,輸出參數,返回單個或多個結果集以及返回值。
給你一個例子:
create proc proc_takemoney
@cardid1 varchar(20), --匯款賬號
@pwd int , --匯款密碼
@takemoney money, --匯款金額
@cardid2 varchar(20) --存款賬號
as
set nocount on
declare @err int
set @err = 0
if exists(select 1 from cardinfo where cardid = @cardid1 and pass = @pwd)
begin
begin tran --事物開始
update cardinfo set balance = balance @takemoney where cardid = @cardid2 --接受款帳戶加上@takemoney
set @err = @err @@error
update cardinfo set balance = balance - @takemoney where cardid = @cardid1 --匯款帳戶減去@takemoney
set @err = @err @@error
/*--交易信息表插入交易信息--*/
insert into transinfo(transdate,cardid,transtype,transmoney) values(default,@cardid1,'支取',@takemoney)
set @err = @err @@error
insert into transinfo(transdate,cardid,transtype,transmoney) values(default,@cardid2,'存入',@takemoney)
set @err = @err @@error
/*--交易信息--*/
select top 2 * from transinfo order by transdate desc
if(@err<>0)
begin
rollback tran --錯誤回滾事物
end
else
begin
commit tran --無錯誤提交事物
end
end --if結束
else
begin
print '密碼錯誤'
end
/*--調用存儲過程--*/
declare @cardid1 varchar(20),@cardid2 varchar(20),@pwd int ,@takemoney money
set @cardid1 ='1010 3576 1234 5678' --張三卡號
set @pwd = 888888 --張三密碼
set @cardid2 ='1010 3576 1212 1134' --李四卡號
set @takemoney =20 --匯款金額
exec proc_takemoney @cardid1 ,@pwd,@takemoney,@cardid2
⑶ 求:存儲過程面試題!
其實存儲過程的基本寫法我相信你都知道了。
面試這種語言不要緊張,估計多數是要考你對sql效率概念的理解。
普通的sql語句誰都會寫的,但是這樣的語句往往會造成程序的低效,在壓力比較大的伺服器上,很有可能造成系統的癱瘓。
注意幾點:
1、寫語句要用到索引
2、not exists 替換 not in
3、exists 替換 in
4、盡量不要用3個表以上的連接,寧可單個單個取
5、注意書寫規則,要寫的明白寫,錯誤信息返回那個地方要注意
6、寫游標的話,要注意有退出的地方和關閉游標。
7、變數之間要注意轉換,隱式的轉換往往會耗掉更多的時間。
這些是最基本的了,你需要查閱相關資料進行了解下。
⑷ 什麼是sql的存儲過程
sql存儲過程說簡單點就是一個在t-sql下用戶可以自行定義的函數,
但是與一般的函數也有不同的地方,比如它的返回值只能return(int類型),如果你要輸出什麼信息的話只能用output.這也是存儲過程的一個特色吧,設定的參數可以有輸出。講起來有點抽象,給你個例子看看吧!
首先創建一個存儲過程
create
procere
cunchuguocheng
@a
int,
@b
int,
@c
int
output
as
begin
select
@c
=
@a @b
return(0)
end
然後調用這個存儲過程
declare
@value
int,
--返回值
@c
int
--結果值
exec
@value
=
cunchuguocheng
2,2,@c
output
select
@value
as
返回值
select
@c
as
結果值
程序寫的很簡單,你運行一下我想你就會對存儲過程有所了解了。
⑸ sql 中存儲過程怎麼使用
一、簡單的儲存過程:
1、創建一個存儲過程
create procere getusers()
begin
select * from user;
end;12345
2、調用存儲過程
call getusers();12
3、刪除存儲過程
drop procere if exists getusers;
二、帶參數的存儲過程
1、mysql 支持 in (傳遞給存儲過程) , out (從存儲過程傳出) 和 inout (對存儲過程傳入和傳出) 類型的參數 , 存儲過程的代碼位於 begin 和 end 語句內 , 它們是一系列 sql 語句 , 用來檢索值 , 然後保存到相應的變數 (通過指定into關鍵字) ;
2、下面的存儲過程接受三個參數 , 分別用於獲取用戶表的最小 , 平均 , 最大分數 , 每個參數必須具有指定的類型 , 這里使用十進制值(decimal(8,2)) , 關鍵字 out 指出相應的參數用來從存儲過程傳出
create procere getscores(
out minscore decimal(8,2),
out avgscore decimal(8,2),
out maxscore decimal(8,2)
)
begin
select min(score) into minscore from user;
select avg(score) into avgscore from user;
select max(score) into maxscore from user;
end;1234567891011
3、調用此存儲過程 , 必須指定3個變數名(所有 mysql 變數都必須以@開始) , 如下所示 :
call getscores(@minscore, @avgscore, @maxscore);12
4、該調用並沒有任何輸出 , 只是把調用的結果賦給了調用時傳入的變數@minscore, @avgscore, @maxscore, 然後即可調用顯示該變數的值 :
select @minscore, @avgscore, @maxscore;
5、使用 in 參數 , 輸入一個用戶 id , 返回該用戶的名字 :
create procere getnamebyid(
in userid int,
out username varchar(200)
)
begin
select name from user
where id = userid
into username;
end;12345678910
6、調用存儲過程 :
call getnamebyid(1, @username);
select @username;123
⑹ sql語句高手進,關於一個比較復雜的存儲過程
題目所述功能要求,可以用一句sql語句實現,當然如果要傳遞一些參數地濾的話還是需要存儲過程.
語句思路:
1.按dwbh,時間匯總個人表中金額
2.按dwbh,時間匯總單位表中金額
3.將以上兩個匯總結果進行關聯,關聯的條件是相同dwbh、相同時間情況下金額不同的記錄.即可以實現金額不相同的數據篩選出來.
"--"符號為註解,以下語句中的中文欄位為假想欄位,可以替換為實際欄位.關鍵在於理解語句思路.語句如下:
select
gr.dwbh
,
gr.個人表交費時間
as
時間,gr.個人交費總金額,dw.單位交費總金額,(gr.個人交費總金額
-
dw.單位交費總金額)
as
差額
from
(
select
dwbh,個人表交費時間,sum(交費金額)
as
個人交費總金額
--子查詢匯總出個人交費表中的單位、時間、金額,並取別名為gr嵌入from子句中
from
bcd
group
by
dwbh,交費時間
)
as
gr
inner
join
--
將上下兩個子查詢進行內聯
(
select
dwbh,單位表交費時間,sum(交費金額)
as
單位交費總金額
--子查詢匯總出單位交費表中的單位、時間、金額,並取別名為dw嵌入from子句中
from
abc
groub
by
dwbh,交費時間
)
as
dw
on
gr.dwbh
=
dw.dwbh
and
gr.個人表交費時間
=
dw.單位表交費時間
and
gr.個人交費總金額
<>
dw.單位交費總金額
--兩個子查詢內聯的條件是單位編號相同,時間相同,但金額不同的記錄
⑺ sql中存儲過程是干什麼用的
存儲過程是在大型資料庫系統中,一組為了完成特定功能的sql 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。
資料庫存儲過程的實質就是部署在資料庫端的一組定義代碼以及sql。將常用的或很復雜的工作,預先用sql語句寫好並用一個指定的名稱存儲起來,那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了image外,其他sql server所支持的數據類型都可使用。
(7)面試題sql的存儲過程擴展閱讀:
sql中存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止sql注入式攻擊,而且可以將grant、deny以及revoke許可權應用於存儲過程。
4、存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般sql語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。