一、简单的储存过程:
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;
希望这个是你所需要的。