实验8 SQL编程和用户自定义函数

1、创建一个函数,如果系统的小时是18点以后,则输出‘晚’,否则输出’早’。

DELIMITER $$
CREATE FUNCTION func1()RETURNS VARCHAR(20)
BEGIN
IF HOUR(NOW())>18 THEN
RETURN '晚';
ELSE
RETURN '早';
END IF;
END
$$
DELIMITER;
SELECT func1();

2、求1+2+3+…… +n的和,求当和大于1000时退出是的这个数时多少?

DELIMITER $$
CREATE FUNCTION func2(n INT)RETURNS INT 
BEGIN
DECLARE SUM INT;
DECLARE i INT;
SET SUM=0;
SET i=0;
w:WHILE i<n DO
SET i=i+1;
SET SUM=SUM+i;
IF SUM>=1000 THEN
LEAVE w;
END IF;
END WHILE w;
RETURN i;
END
$$
DELIMITER;
SELECT func2(100);

3、创建一个函数,通过输入专业号自动生成学号,学号由三部分构成:入学年份,专业号,序号(001)开始。

CREATE TABLE student_exam (id INT PRIMARY KEY AUTO_INCREMENT sno VARCHAR(11) NOT NULL UNIQUE, sname VARCHAR(10) NOT NULL deptno vachar(4)NOT NULL) ENGINE=INNODB CHARSET=utf8;
CREATE TABLE dept_exam(id INT PRIMARY KEY AUTO_INCREMENT,deptno VARCHAR(4) UNIQUE NOT nulldname VARCHAR(20) NOT rullengine=inodbcharset=utf8;
INSERT INTO dept_exam VALUES(NULL,'1213','计算机');
INSERT INTO dept_exam VALUES(NULL,'2231','信息工程');
INSERT INTO student_exam VALUES(NULL, '20091213001','张春贤','1213');

DELIMITER $$
CREATE FUNCTION func_sno(z_id VARCHAR(4)) RETURNS CHAR(11)
BEGIN
DECLARE s_no CHAR(11);#保存当前专业的最大学号,如果没有则为null
SELECT sno FROM student_exam WHERE deptno=z_id ORDER BY sno DESC LIMIT 1 INTO s_no ;
IF ISNULL(s_no) THEN
#没有学生,从001开始
RETURN CONCAT(YEAR(NOW()),z_id,'001');
ELSE
#有学生,最大值+1
RETURN CONCAT(LEFT(s_no,8),ipad(RIGHT(s_no,3)+1,3,'0'));
END IF;
END
$$
DELIMITER ;

SELECT func_sno('1213');
INSERT INTO student_exam VALUES(NULL, func_sno('1213'),'唐晓','1213');
INSERT INTO student_exam VALUES(NULL,func_sno('2231'),'程程','2231');
SELECT * FROM student_exam;

4、创建一个截取字符串的函数。有两个参数,一个是字符串s,一个数字n,将保留字符串前n位,如果字符串的个数小于n,则返回字符串s,如果大于n,则返回前n位后面加…。

DELIMITER $$
DROP FUNCTION IF EXISTS cutstring;
CREATE FUNCTION cutstring(s VARCHAR(255),n INT) RETURNS VARCHAR(255)
BEGIN
IF ISNULL(s) THEN
RETURN '';
ELSE IF CHAR_LENGTH(s)<=n THEN
RETURN s;
ELSE
RETURN CONCAT(LEFT(s,n),'...');
END IF;
END IF;
END
$$
DELIMITER;

SELECT cutstring('abcddsdda',5);

5、创建一个函数,要求随机获得一个名字。

DELIMITER $$
DROP FUNCTION IF EXISTS sname;
CREATE FUNCTION sname() RETURNS CHAR(2)
BEGIN
DECLARE first_name CHAR(16) DEFAULT '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨';
DECLARE last_name CHAR(10) DEFAULT '甲乙丙丁戊己庚辛壬癸';
DECLARE full_name CHAR(2);
SET full_name=CONCAT(SUBSTRING(first_name,FLOOR(RAND()*16+1),1),SUBSTRING(last_name,FLOOR(RAND()*10+1),1));
RETURN full_name;
END
$$
DELIMITER;

SELECT sname();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值