【MySQL】《数据库系统》-实验项目9-存储过程与函数

本文详细介绍了数据库SQL实验项目,涵盖存储过程的创建、转账应用(如从账户A转至B)、自定义函数(获取账户余额)等内容,以及解决函数创建中的错误和配置问题。
摘要由CSDN通过智能技术生成

实验项目
实验1  实验环境与操作流程
实验2  数据定义、查询与更新
实验3  基本表的定义、删除与修改
实验4  数据的插入、修改和删除
实验5  数据的查询
实验6  数据的视图
实验7  完整性语言
实验8  触发器
实验9  存储过程与函数
实验10  SQL语句1(创建、插入、查询)
实验11  SQL语句2(查询)
实验12  SQL语句3(视图、完整性、关系代数查询)

实验9  存储过程与函数

一、实验目的

1. 掌握数据库SQL语言;

2. 掌握数据库存储过程的设计和使用方法。

3. 掌握自定义函数的定义和运行。

二、实验要求

1. 熟练掌握存储过程的定义与运行;

2. 规范设计存储过程;

3. 熟练掌握自定义函数的定义和运行。

三、实验内容

1.存储过程:

利用存储过程实现下面的应用:从账户1转指定数额的款项到账户2中。假设账户关系表为Account(Accountnum, Total)。参考例8.9。

  1. 创建基本表Account,并插入数据(1,10000),(2,20000),(3,30000),(4,40000)。
  2. 创建存储过程transfer(inAccount,outAccount,amount),并查看当前数据库的全部存储过程。
  3. 执行存储过程transfer(1,2,10000)(表示从账户2往账户1转账10000元),查看基本表Account中的数据。

2.函数:

通过函数来实现查询账户的余额。

  1. 创建函数get_total(AccountID),并查看当前数据库的全部函数。
  2. 执行函数语句get_total(1)、get_total(2)、get_total(accountnum)(表示分别得到账号1、账号2、所有账号的余额)。

实验指导:

  • 1.存储过程:

利用存储过程实现下面的应用:从账户1转指定数额的款项到账户2中。假设账户关系表为Account(Accountnum, Total)。参考例8.9

  • 创建基本表Account,并插入数据(1,10000),(2,20000),(3,30000),(4,40000)。

  • 创建存储过程transfer(inAccount,outAccount,amount),并查看当前数据库的全部存储过程。

  • 执行存储过程transfer1,2,10000)(表示从账户2往账户1转账10000元),查看基本表Account中的数据。

  • 2.函数:

通过函数来实现查询账户的余额。

  • 创建函数get_total(AccountID),并查看当前数据库的全部函数。

  • 执行函数语句get_total(1)get_total(2)get_total(accountnum)(表示分别得到账号1、账号2、所有账号的余额)。

实验9代码:

create table Account(
Accountnum int primary key,
Total double);

insert into Account values(1,10000),(2,20000),(3,30000),(4,40000);

show procedure status where db='acc';

create procedure transfer(inAccount int,outAccount int,amount double)
       begin
         declare totalDepositOut double;
         declare totalDepositIn double;
        declare inAccountnum int;
         select Total into totalDepositOut from Account where accountnum=outAccount;
         if totalDepositOut is null then
           rollback;
         end if;
         if totalDepositOut<amount then
           rollback;
        end if;
         select Accountnum into inAccountnum from Account where accountnum=inAccount;
         if inAccountnum is null then
           rollback;
         end if;
         update Account set total=total-amount where accountnum=outAccount;
        update Account set total=total+amount where accountnum=inAccount;
        commit;
      end //


show function status where db='acc';

create function get_total(AccountID int) returns double
	begin
		declare total_amount double default null;
		select total into total_amount from Account where Accountnum=AccountID;
		return total_amount;
	end //



错误:
执行创建函数的sql语句时,提示:This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

原因:
我们创建函数时必须指定我们的函数是否是
DETERMINISTIC 不确定的
NO SQL 没有SQl语句,当然也不会修改数据
READS SQL DATA 只是读取数据,当然也不会修改数据
MODIFIES SQL DATA 要修改数据
CONTAINS SQL 包含了SQL语句

解决方法:
1、在mysql数据库中执行以下语句 (临时生效,重启后失效)
set global log_bin_trust_function_creators=TRUE;
2、在配置文件/etc/my.cnf的[mysqld]配置log_bin_trust_function_creators=1

create procedure transfer1(inAccount int,outAccount int,amount double)
       begin
         declare totalDepositOut double;
         declare totalDepositIn double;
         declare inAccountnum int;        
         loop_label: loop
         start transaction;
         select Total into totalDepositOut from Account where accountnum=outAccount;
         if totalDepositOut is null then
           rollback;
           leave loop_label;
         end if;
         if totalDepositOut<amount then
           rollback;
           leave loop_label;
         end if;
         select Accountnum into inAccountnum from Account where accountnum=inAccount;
         if inAccountnum is null then
           rollback;
           leave loop_label;
         end if;
         update Account set total=total-amount where accountnum=outAccount;
         update Account set total=total+amount where accountnum=inAccount;
         commit;
         leave loop_label;
         end loop;
      end //

  • 22
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库是一种常用的关系型数据库管理系统。存储过程函数MySQL数据库的两个重要特性,通过存储过程函数,可以实现对数据库的高效操作。下面将详细介绍存储过程函数的构建与使用。 首先,存储过程是一组经过预编译的SQL语句集合,可以被调用执行。在MySQL中,存储过程的构建可以通过CREATE PROCEDURE语句来完成。存储过程可以带有输入参数、输出参数和返回值。通过参数的使用,可以在存储过程中实现灵活的数据处理。存储过程可以被直接调用,也可以被其他存储过程函数所调用。 其次,函数是一段可重用的SQL代码块,可以被其他SQL语句直接调用。在MySQL中,函数的构建可以通过CREATE FUNCTION语句来完成。函数可以返回一个值,也可以返回一个表。与存储过程不同的是,函数不能直接进行数据修改操作,而是在查询时返回需要的结果。 存储过程函数都可以提高数据库的性能和安全性。存储过程可以减少客户端与数据库服务器之间的通信次数,提高执行效率;函数可以封装复杂的查询逻辑,方便其他SQL语句调用,提高代码的重用性。此外,存储过程函数都可以设置权限控制,确保数据的安全性。 在使用存储过程函数时,需要注意以下几点:首先,参数的定义和使用需要按照正确的格式和规范进行;其次,在存储过程函数内部,可以使用多种语句,如SELECT、INSERT、UPDATE和DELETE,以实现不同的数据操作需求;最后,在使用存储过程函数前,需要确保已经创建了相应的数据库和表结构。 总之,通过存储过程函数的构建与使用,可以实现对MySQL数据库的高效操作。存储过程函数提供了一种灵活、可重用的方式来处理数据,提高了数据库的性能和安全性。在实际应用中,可以根据具体的需求,合理地使用存储过程函数,以提升系统的效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值