0
点赞
收藏
分享

微信扫一扫

数据库函数、存储过程

西特张 2022-03-30 阅读 63
sql

 

 

 

 

 

 

 

-- mysql 数字函数

-- ABS(x):返回x的绝对值

 

-- ceil(x):返回不小于x的最小整数值 大于等于

 

 

-- mod(x,y) :返回x/y的模 (取余)

 

-- rand():返回0~1内的随机值

 

-- round(x,y):返回参数x的四舍五入的有y位小数的值

 

-- truncate(x,y):返回数字x截断位y位小数的结果

 

-- mysql 聚合函数

-- avg():返回某列的平均值

 

-- count():返回某列的行数

-- max():返回某列的最大值

-- min(): 返回某列的最小值

 

-- sum(): 返回某列之和

select sum(prod_price) from  products ;

-- mysql字符串函数

-- concat(s1,s2,....):字符串连接

 

-- left(str,x):返回字符串str最左边的x个字符

 

-- lpad(str,n,pad):在str最左边填充n个pad

 

-- replace(str,s1,s2):用字符串s2替换字符str中所有出现的字符串s1

-- substring(str,x,y):返回从字符串str的x位置起y个字符长度的字符

 

-- mysql 日期函数

-- now(): 返回当前的日期和时间

 

-- year(data): 返回日期data的年份

 

 

-- date_add(date,interval expr type):返回一个日期或时间值加上一个时间间隔的时间值

 

-- datediff(expr,expr2):返回起始时间expr和结束时间expr2 之间的天数

 

-- ifnull(value1,value2):如果value不为空,返回value1,否则返回value2

 

-- case when [value1] then[result1].....else[default] end:如果value1是真,返回result1,否则返回result

运行结果:

 

  1. 函数示例一、二、三,手动敲一遍。

-- 函数示例一

-- 创建一个函数hello(name),返回hello+name;

-- mysql

-- oracle

-- 测试

运行结果:

 

 

-- 函数示例二

-- 创建一个函数max_number(var1,var2),返回其中较大的值

-- mysql

-- oracle

-- 测试

运行结果:

 

-- 函数示例三

-- 根据需求判断输入时间属于前一天或当天,例如小于10点为前一天,超过10点即为当天

-- mysql

create function get_date(v_datetime datetime,v_time varchar(50))

returns varchar(50)

begin

declare v_date varchar(50);

declare cDate varchar(50);

declare beginDate varchar(50);

set cDate=date_format(v_datetime,'%Y-%m-%d %H:%i:%s');

set beginDate=concat(date_format(v_datetime,'%Y-%m-%d'),v_time); 

if cDate < beginDate then

  set v_date=date_format(date_add(v_datetime,interval -1 day),'%Y-%m-%d');

else

  set v_date=date_format(v_datetime,'%Y-%m-%d');

 end if;

return v_date;

end;

-- oracle

CREATE  OR REPLACE FUNCTION  get_date(v_datetime date,v_time varchar2)

RETURN  varchar2 AS 

v_date varchar2(50);

cDate varchar2(50);

beginDate varchar2(50);

BEGIN 

cDate := to_char(v_datetime,'YYYY-MM-DD hh24:mi:ss');

beginDate := concat(to_char(v_datetime,'YYYY-MM-DD'),v_time);

IF  cDate < beginDate then

   v_date := to_char(v_datetime-1,'YYYY-MM-DD');

ELSE 

    v_date := to_char(v_datetime,'YYYY-MM-DD');

END  IF ;

RETURN  v_date;

END;

  1. 针对函数示例二,在MySQL下创建一个函数get_max_number,用于获取3个整数的最大值。

create function get_max_number(var1 int,var2 int,var3 int)

returns int 

begin

-- declare max_number int;

if var1>var2 and var1>var3 then

return var1;

elseif var2>var1 and var2>var3 then

return var2;

else 

return var3;

end if;

end;

select get_max_number(1,2,3) from dual;

  1. 分别在Oracle与MySQL下创建存储过程pro_delete_all_order,用游标的方式从orders表中获取所有订单号,然后将每个订单号的记录删除,包括orders和orderitems的相关记录。 

-- MySql

create procedure pro_delete_all_order()

begin

declare c int(11);

declare total int default 0;

declare done int default false;

declare all_order cursor for select o.order_num from orders o;

declare continue handler for not found set done=true;

set total=0;

open all_order;

fetch all_order into c;

while(not done) do

delete from orderitems where order_num=c;

delete from orders where order_num =c;

set total=total+1;

fetch all_order into c;

end while;

close all_order;

select total;

end;

 call pro_delete_all_order();

--oracle

CREATE OR REPLACE PROCEDURE pro_delete_all_order

AS 

CURSOR all_order IS SELECT * FROM ORDERS o;

BEGIN

FOR temp IN all_order LOOP 

DELETE FROM ORDERITEMS o WHERE o.ORDER_NUM =temp.ORDER_NUM;

DELETE FROM ORDERS o WHERE o.ORDER_NUM =temp.ORDER_NUM;

COMMIT;

END LOOP ;

END;

BEGIN 

pro_delete_all_order;

END;

 

 

 

 

 

 

举报

相关推荐

0 条评论