一、簡單的儲存過程:
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 中關於計算薪資的存儲過程
CREATE TABLE [HRSALARY] (
[YYYYMM] [char] (8) NOT NULL ,
[EId] [int] NOT NULL ,
[SolidPay] [money] NULL ,
[ERate] [money] NULL ,
CONSTRAINT [PK_HRSALARY] PRIMARY KEY CLUSTERED
(
[YYYYMM],
[EId]
) ON [PRIMARY]
) ON [PRIMARY]
GO
CREATE TABLE [PayScale] (
[YYYYMM] [char] (6) NOT NULL ,
[EId] [int] NOT NULL ,
[EName] [varchar] (50) NULL ,
[PayScale] [money] NULL ,
[Premium] [money] NULL ,
[EType] [int] NULL ,
CONSTRAINT [PK_PayScale] PRIMARY KEY CLUSTERED
(
[YYYYMM],
[EId]
) ON [PRIMARY]
) ON [PRIMARY]
GO
Create Procere dbo.Sp_UpdateSolidPay
As
Begin
Declare @Type int,@EId int, @pay money,@Pre money, @YYYYMM char(6)
Declare @SolidPay money,@Erate money
Declare Fetch_EIds_Cursor cursor for select yyyymm,Eid,payscale,premium,Etype from PayScale
Open Fetch_EIds_Cursor
Fetch Next Fetch_EIds_Cursor into @YYYYMM,@EId,@pay,@Pre,@Type
While @@FETCH_STATUS = 0
Begin
Select @Erate = case when @pay>=0 and @pay<=2000 then 0.01 when @pay >2000 and @pay<= 3000 then 0.05 when @pay >3000 then 0.1 else 0 end
If @Type = 1 --正式員工
Begin
Select @SolidPay = (@pay+@Pre)*(1-@Erate)/*求實發工資*/
End
If @Type = 2 --臨時員工
Begin
Select @SolidPay = (@pay)*(1-@Erate)/*求實發工資*/
End
If @Type = 3 --實習員工
Begin
Select @SolidPay = (@pay)*0.05+200,@Erate = 0 /*求實發工資*/
End
Update HRSALARY set SolidPay = @SolidPay,ERate = @Erate where yyyymm = @YYYYMM and EId = @EId
If @@ROWCOUNT = 0
Begin
insert into HRSALARY(YYYYMM,EId,SolidPay,ERate)
values(@YYYYMM,@EId,@SolidPay,@Erate)
If @@Error <> 0 goto L_Exit
End
If @@Error <> 0 goto L_Exit
Fetch Next Fetch_EIds_Cursor into @YYYYMM,@EId,@pay,@Pre,@Type
End
CLOSE Fetch_EIds_Cursor
DEALLOCATE Fetch_EIds_Cursor
Return 0
L_Exit:
CLOSE Fetch_EIds_Cursor
DEALLOCATE Fetch_EIds_Cursor
Return -1
End
③ 如何在SQL中對一個表的多個元組進行計算並相應存儲
不明白你的問題啊!
select (t.f1+t.f2)*t.f3 as compute from table t
如果table中的欄位f1,f2,f3為數字型,是可以在select中直接使用數學運算符的。
④ 如何讓資料庫自動計算並存儲
就是計算欄位?
給你個例子
CREATE TABLE test(qty INT,price MONEY,amount AS [price]*[qty])
這樣不就可以了?
⑤ sql計算查詢的結果如何保存在表的一列中
select a.language,a.songname,a.exist,c.col001,c.col002 from a
left join b c on a.filename=c.col001
where not exists(select 1 from b where col001=c.col001 and col002>c.col002)
⑥ sql 存儲過程判斷時間並計算合計如何寫
你確定你的表對嗎? 第一次收款金額+第二次收款金額 這兩個欄位在哪?
其實用case when 應該就能解決你的問題了。
⑦ sql中兩個欄位運算並把結果存入一個新欄位中
參考以下sql
SELECTSUBSTR(DATE_ADD(CONCAT('2018-11-12','12:30:31'),INTERVAL10MINUTE)FROM12FOR8)
SELECTSUBSTR(DATE_ADD(CONCAT('2018-11-12',IC_Time),INTERVALIFNULL(Transfer_TimeF,0)MINUTE)FROM12FOR8)FROMTrip_Chaining_hc1203ADD
與Alighting_Time相減,需要先知道Alighting_Time是什麼類型,不過你也可以參考著寫了
⑧ SQL取兩個值計算然後定義其屬於的范圍,應該怎麼寫存儲過程語句
call sp_add();
是不是你定義的過程有問題吧,並沒有指出返回結果來
像我這樣是可以的:
CREATE PROCEDURE sp_add(a int, b int,out c int)
begin
set c=a+ b;
end;
調用過程:
call sp_add (1,2,@a);
select @a;
⑨ sql 語句編寫 存儲過程 數學計算
如果只是寫個存儲過程,那很簡單的,因為不知道你具體功能,我只能這樣寫:
/*已有數據表1.列名a,b,c,d,e,f
編寫存儲過程:a^2+b*(c+d)/2-f*e*/
IF OBJECT_ID('table1') IS NOT NULL
DROP TABLE table1;
GO
CREATE TABLE table1
(a INT ,
b INT ,
c INT ,
d INT,
e INT ,
f INT )
GO
IF OBJECT_ID('sptabel1') IS NOT NULL
DROP PROCEDURE sptabel1;
GO
CREATE PROCEDURE sptabel1
AS
BEGIN
DECLARE @test INT,
@a INT ,
@b INT ,
@c INT ,
@d INT ,
@e INT ,
@f INT ;
DECLARE cur CURSOR FOR SELECT * FROM table1;
OPEN cur;
FETCH NEXT FROM cur INTO @a,@b,@c,@d,@e,@f;
WHILE @@FETCH_STATUS=0
BEGIN
SET @test=POWER(@a,2)+@b*(@c+@d)/2-@f*@e;
FETCH NEXT FROM cur INTO @a,@b,@c,@d,@e,@f;
END;
CLOSE cur;
DEALLOCATE cur;
END;
希望這個是你所需要的。