《数据库系统概论》课程之实验五流六

2023-10-31

前序

《数据库系统概论》课程之实验五
通过嵌入式SQL访问数据库
1实验目的
熟悉通过嵌入式SQL(主语言为C语言)编程访问数据库。
实验以C语言为例作说明,实作可以选择任意语言实现本实验。
2实验平台和实验工具
在KingbaseES数据库管理系统上,通过C语言编写访问数据库的应用程序来对数据库进行各种数据操作。编程工具自选。
3实验内容和要求
熟悉RDBMS的预编译程序。通过嵌入式SQL编程访问数据库的基本步骤
对学生课程数据库中的表,完成下面功能(你也可以自己给出功能要求):

  1. 查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中。
  2. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段。
    要求:提交源程序并标识必要的注释。保证程序能正确编译和运行,认真填写实验报告。
    3.1嵌入式SQL
    要求:将一段连续的SQL操作写成嵌入到C程序中的程序,调试程序,使得程序能完成一项复杂的数据处理功能,并提交程序。
    嵌入式SQL由SQL语句和C/C++代码组成。其中SQL语句由预处理器翻译成C或C++的源代码。对预处理后的源代码进行编译、链接生成可执行程序后方可运行。

《数据库系统概论》课程之实验六
使用PL/SQL编写存储过程访问数据库
对学生课程数据库,编写存储过程,完成下面功能:
1)统计离散数学的成绩分布情况,即按照各分数段统计人数;
2)统计任意一门课的平均成绩。
3)将学生选课成绩从百分制改为等级制(即A、B、C、D、E);
要求:提交源程序并标识必要的注释。保证程序能正确编译和运行,认真填写实验报告。

实验5

实验目的

熟悉通过嵌入式SQL(主语言为C语言)编程访问数据库。

实验以C语言为例作说明,实作可以选择任意语言实现本实验。

实验内容和要求

  1. 查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中。

  2. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,然后根据用户的要求修改其中某些记录的成绩字段。

要求:提交源程序并标识必要的注释。保证程序能正确编译和运行,认真填写实验报告。

实验准备

  1. 构建maven工程
  2. 导入c3p0数据库连接池和相关依赖
  3. 实现实验要求两功能
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>mchange-commons-java</artifactId>
            <version>0.2.20</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>
    </dependencies>

处理静态资源过滤问题

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

连接数据库

编写c3p0-config.xml配置文件

<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost/std</property>
        <property name="user">root</property>
        <property name="password">root</property>

        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config>

    <!-- This app is massive! -->
    <named-config name="MySQL">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/dblab?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password">123456</property>


        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">10</property>
        <property name="minPoolSize">5</property>
        <property name="maxPoolSize">20</property>
    </named-config>
</c3p0-config>

编写工具类

public class UtilsJDBC_C3P0 {
    static DataSource dataSource =null;
    static {
        try {
            //创建数据源  工厂模式
            dataSource = new ComboPooledDataSource("MySQL");//配置文件写法

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //1.获取连接
    public  static Connection getConnection() throws SQLException {
        return  dataSource.getConnection();
    }

    //2.释放连接
    public static void releaseConnection(Connection conn, Statement st, ResultSet res) {

        try {
            if(res!=null) res.close();
            if(st!=null) st.close();
            if(conn!=null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    }
}

功能一

  1. 查询某一门课程的信息。要查询的课程由用户在程序运行过程中指定,放在主变量中。
    public void print() throws SQLException {
        System.out.println("课程号\t\t\t\t课程名\t\t先行课\t\t学分");
        while (res.next()){
            String Cno=res.getObject("Cno")+"";
            String Cname=res.getObject("Cname")+"";
            String Cpno=res.getObject("Cpno")+"   ";
            String Ccredit=res.getObject("Ccredit")+"";
            System.out.println(Cno+"\t\t\t\t\t"+Cname+"\t\t\t"+Cpno+"\t\t"+Ccredit);
        }
        System.out.println("=========================================================");
    }
    public  void func01() throws SQLException {
        conn = UtilsJDBC_C3P0.getConnection();
        while (true) {
            System.out.println("请选择查询:1.课程号   2.课程名   3.退出");
            System.out.println("=========================================================");
            Scanner in = new Scanner(System.in);
            int order=in.nextInt();
            System.out.println("=========================================================");
            if(order==1){
                System.out.print("请输入课程编号:");
                String Cno=in.next();
                String sql = "SELECT * FROM `course` WHERE `Cno`=?";
                st = conn.prepareStatement(sql);//预编译sql,先写sql,不执行
                st.setString(1,Cno);
                res = st.executeQuery();
                print();

            }else if(order==2){
                System.out.print("请输入课程名:");
                String Cname=in.next();
                String sql = "SELECT * FROM `course` WHERE `Cname`=?";
                st = conn.prepareStatement(sql);//预编译sql,先写sql,不执行
                st.setString(1,Cname);
                res = st.executeQuery();
                print();
            }else if(order==3){
                break;
            }else{
                System.out.println("输入错误!");
            }
        }

        UtilsJDBC_C3P0.releaseConnection(conn, st, res);
    }
image-20210521104237583

功能二

  1. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中;
  2. 然后根据用户的要求修改其中某些记录的成绩字段。
    public void print02() throws SQLException {
        System.out.println("学号\t\t\t\t名字\t\t成绩\t\t院系");
        while (res.next()){
            String Sno=res.getObject("Sno")+"";
            String Sname=res.getObject("Sname")+"";
            String Grade=res.getObject("Grade")+"   ";
            String Sdept=res.getObject("Sdept")+"";
            System.out.println(Sno+"\t\t"+Sname+"\t\t"+Grade+"\t"+Sdept);
        }
        System.out.println("=========================================================");
    }

//        System.out.println("201215121\t\t刘晨\t\t80\t\tCS");
    //2. 查询选修某一门课程的选课信息,要查询的课程号由用户在程序运行过程中指定,放在主变量中,
    //3. 然后根据用户的要求修改其中某些记录的成绩字段。
    public void func02() throws SQLException {
        conn = UtilsJDBC_C3P0.getConnection();
        while (true) {
            System.out.println("请选择服务: 1.查询课程信息  2.退出");
            System.out.println("=========================================================");
            Scanner in = new Scanner(System.in);
            int order=in.nextInt();
            if(order==1){
                System.out.print("请输入课程编号:");
                String Cno=in.next();
                String sql = "SELECT stc.Sno , `Sname`, `Grade` ,`Sdept`\n" +
                        "FROM `sc` stc\n" +
                        "INNER JOIN `student` stu\n" +
                        "WHERE stc.Sno=stu.`Sno` AND `Cno`=?";
                st = conn.prepareStatement(sql);//预编译sql,先写sql,不执行
                st.setString(1,Cno);
                res = st.executeQuery();
                print02();

                while (true){
                    System.out.print("是否修改学生成绩 Y/N: ");
                    String modify=in.next();
                    if(modify.equals("Y")){
                        System.out.print("输入学生名字:");
                        String Sname=in.next();
                        System.out.print("输入修改成绩:");
                        float Grade=in.nextFloat();
                        String sqlM="UPDATE `sc` SET `Grade`=? WHERE `Cno`=? AND `Sno`=(\n" +
                                "    SELECT `Sno` FROM `student` WHERE `Sname`=?\n" +
                                ")";
                        st = conn.prepareStatement(sqlM);
                        st.setFloat(1,Grade);
                        st.setString(2,Cno);
                        st.setString(3,Sname);

                        int i = st.executeUpdate();
                        if(i>0) System.out.println("更新成功");
                        else System.out.println("更新失败");


                    }else if(modify.equals("N")){
                        break;
                    }else {
                        System.out.println("输入错误!");
                    }
                }


            }else if(order==2){
                break;
            }else{
                System.out.println("输入错误!");
            }
        }

        UtilsJDBC_C3P0.releaseConnection(conn, st, res);
    }
image-20210521104413450

制表符规则

/t的对齐规则为:
向/t前字符长度为n的字符串补足成8的整数倍(当然可以设置补足成其他的倍数)。比如:
n=1,补足的空格长度为7。
n=7, 补足的空格长度为1。
n=9,补足的空格长度为7。
注意:
n为8的整数倍时,补足长度为8。比如
n=8,补足长度为8。

实验6

实验目的

熟悉使用存储过程来进行数据库应用程序的设计。

实验内容及要求

对学生课程数据库,编写存储过程,完成下面功能

实验过程

1)统计离散数学的成绩分布情况,即按照各分数段统计人数;

因为存储过程执行后在客户端并没有返回值,因此需要建立一个表来存放执行后的结果,并返回客户端显示。
根据实验要求,要统计选修“离散数学”课程的学生的成绩分布,因此需要建立rank。

CREATE TABLE `rank`
(
    `division` CHAR(20),
    `number`   INT
)ENGINE=INNODB DEFAULT CHARSET=utf8;
TRUNCATE `rank`;

编写存储过程

DELIMITER $$
CREATE PROCEDURE statistic_mark(CourseName CHAR(30))
BEGIN
    DECLARE less60 INT DEFAULT 0;
    DECLARE b60a70 INT DEFAULT 0;
    DECLARE b70a80 INT DEFAULT 0;
    DECLARE b80a90  INT DEFAULT 0;
    DECLARE more90 INT DEFAULT 0;
    DECLARE currCno CHAR(4);

    SELECT `Cno` INTO currCno FROM `course` WHERE `Cname`=CourseName;

    SELECT COUNT(*) INTO less60 FROM `sc` WHERE `Cno` =currCno AND `Grade`<60;
    SELECT COUNT(*) INTO b60a70 FROM `sc` WHERE `Cno` =currCno AND `Grade`>=60 AND `Grade`<70;
    SELECT COUNT(*) INTO b70a80 FROM `sc` WHERE `Cno` =currCno AND `Grade`>=70 AND `Grade`<80;
    SELECT COUNT(*) INTO b80a90 FROM `sc` WHERE `Cno` =currCno AND `Grade`>=80 AND `Grade`<90;
    SELECT COUNT(*) INTO more90 FROM `sc` WHERE `Cno` =currCno AND `Grade`>=90 ;

    INSERT INTO `rank`(`division`,`number`) VALUES ('[0,60)',less60);
    INSERT INTO `rank`(`division`,`number`) VALUES ('[60,70)',b60a70);
    INSERT INTO `rank`(`division`,`number`) VALUES ('[70,80)',b70a80);
    INSERT INTO `rank`(`division`,`number`) VALUES ('[80,90)',b80a90);
    INSERT INTO `rank`(`division`,`number`) VALUES ('[90,100)',more90);

END $$
DROP PROCEDURE statistic_mark;
CALL statistic_mark('离散数学');

执行结果:

image-20210521155459778

2)统计任意一门课的平均成绩。

创建需要的表结构:

DROP TABLE IF EXISTS `avgGrade`;
CREATE TABLE `avgGrade`
(
    `Cname` CHAR(20),
    `CAvg`   NUMERIC(10,6)
)ENGINE =INNODB DEFAULT CHARSET =utf8;

创建存储过程

DELIMITER $$
CREATE PROCEDURE statistic_avg()
BEGIN
    DECLARE currName CHAR(20);
    DECLARE currCno CHAR(9);
    DECLARE currAvg NUMERIC(10,6);
    DECLARE done INT DEFAULT 0;
    -- 声明不带参数的游标myCursor查询课程号和课程名称
    DECLARE  myCursor CURSOR FOR SELECT `Cno`,`Cname` FROM `course`;
    -- 捕获系统抛出的 not found 错误,如果捕获到,将 done 设置为 1  相当于try异常
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
    OPEN myCursor;
        www:LOOP
            -- 游标推进一行取结果赋值给变量
            FETCH myCursor INTO currCno,currName;
            -- 如果没有返回值,则退出循环
            IF done=1 THEN
                LEAVE www;
            END IF;

            SELECT AVG(`Grade`) INTO currAvg FROM `sc` WHERE `Cno`=currCno;
            INSERT INTO `avgGrade`(`Cname`,`CAvg`) VALUES (currName,currAvg);

        END LOOP;
    CLOSE myCursor;
END $$
DELETE FROM `avgGrade`;
CALL statistic_avg();
DROP PROCEDURE statistic_avg;

执行结果:

image-20210521180859109

3)将学生选课成绩从百分制改为等级制(即A、B、C、D、E);

创建所需表:由于代码赋值时报错所以采取该种方式进行赋值。

DROP TABLE IF EXISTS `changeGrade`;
CREATE TABLE `changeGrade`
(
    num INT,
    cGrade CHAR(2)
)ENGINE =INNODB DEFAULT CHARSET =utf8;
ALTER TABLE `sc` ADD newGrade CHAR(2);
image-20210521180957700

创建存储过程

DROP PROCEDURE IF EXISTS statistic_change;
DELIMITER $$
CREATE PROCEDURE statistic_change()
BEGIN
    DECLARE chGrade CHAR(2);
    DECLARE currSno CHAR(9);
    DECLARE currCno CHAR(9);
    DECLARE currGrade FLOAT;
    DECLARE done INT DEFAULT 0;
    -- 声明不带参数的游标myCursor查询课程号和课程名称
    DECLARE  myCursor CURSOR FOR SELECT `Sno`,`Cno`,`Grade` FROM `sc`;
    -- 捕获系统抛出的 not found 错误,如果捕获到,将 done 设置为 1  相当于try异常
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
    OPEN myCursor;
         www:LOOP
             -- 游标推进一行取结果赋值给变量
             FETCH myCursor INTO currSno,currCno,currGrade;
             -- 如果没有返回值,则退出循环
             IF done=1 THEN
                 LEAVE www;
             END IF;
             IF currGrade<60 THEN
                 SELECT `cGrade` INTO chGrade FROM `changeGrade` WHERE `num`=1;
             END IF;
             IF currGrade>=60 AND currGrade<70 THEN
                 SELECT `cGrade` INTO chGrade FROM `changeGrade` WHERE `num`=2;
             END IF;
             IF currGrade>=70 AND currGrade<80 THEN
                 SELECT `cGrade` INTO chGrade FROM `changeGrade` WHERE `num`=3;
             END IF;
             IF currGrade>=80 AND currGrade<90 THEN
                 SELECT `cGrade` INTO chGrade FROM `changeGrade` WHERE `num`=4;
             END IF;
             IF currGrade>=90 AND currGrade<101 THEN
                 SELECT `cGrade` INTO chGrade FROM `changeGrade` WHERE `num`=5;
             END IF;
             
             UPDATE `sc` SET sc.`newGrade`=chGrade WHERE `Sno`=currSno AND `Cno`=currCno;
         END LOOP;
    CLOSE myCursor;
END $$
CALL statistic_change();
image-20210521180829988
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《数据库系统概论》课程之实验五流六 的相关文章

随机推荐

  • 关于LBP特征等价模式的解释

    为了解决二进制模式过多的问题 提高统计性 Ojala提出了采用一种 等价模式 Uniform Pattern 来对LBP算子的模式种类进行降维 Ojala等认为 在实际图像中 绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变 因此
  • C#操作MSSQL数据库 -增删改查

    要在C 中连接到Microsoft SQL Server数据库 MSSQL 你可以使用 NET Framework提供的System Data SqlClient命名空间中的类 以下是一个简单的示例代码 展示了如何在C 中使用MSSQL数据
  • 二叉查找树特性,优点,缺点

    概述 二叉排序树 Binary Sort Tree 又称二叉查找树 Binary Search Tree 亦称二叉搜索树 是数据结构中的一类 在一般情况下 查询效率比链表结构要高 定义 一棵二叉查找树是一棵二叉树 每个节点都含有一个Comp
  • Snap年度AR生态大会Lens Studio资讯:AR应用状况、制作工具Lens Studio和内容生态

    这两天我阅读了一些公众号关于Snap公司召开的AR生态大会Lens Fest 2021报道 并在官网观看了相关视频 这些资讯让我对AR增强现实目前的应用状况和制作技术有了一个全新的了解 结论 整场大会看完之后 我的感觉主要有三点 过去 人们
  • 封装与解封装

    封装与解封装 封装 将数据变为比特流的过程中 在参考模型的每一层需要添加上特定的协议报头动作 动作 从高层往低层依次封装 在每一层使用特定的协议 对数据进行处理 在数据前添加特定的协议报头 封装原则 1 每一层在上一层数据前添加协议报头 2
  • Tangram 2.0——猫客页面内组件的动态化方案

    Tangram 2 0 库 Android Tangram Android Virtualview Android iOS Tangram iOS Virtualview iOS 背景 技术背景 一直以来 无线应用都在不断寻求动态化页面的解
  • 华为OD机试 - 寻找最大价值的矿堆(Java)

    题目描述 给你一个由 0 空地 1 银矿 2 金矿 组成的的地图 矿堆只能由上下左右相邻的金矿或银矿连接形成 超出地图范围可以认为是空地 假设银矿价值1 金矿价值2 请你找出地图中最大价值的矿堆并输出该矿堆的价值 输入描述 地图元素信息如
  • 台阶--Nim游戏(博弈论)

    问题 现在 有一个 nn 级台阶的楼梯 每级台阶上都有若干个石子 其中第 ii 级台阶上有 aiai 个石子 i 1i 1 两位玩家轮流操作 每次操作可以从任意一级台阶上拿若干个石子放到下一级台阶中 不能不拿 已经拿到地面上的石子不能再拿
  • 子网掩码是什么,IP段的24是什么写法

    背景 关于设置 IP 网段 我们常见到的 192 168 1 0 24 是什么意思 24是什么意思 这里的 192 168 1 0 的末尾0是 一定是0吗 跟 192 168 1 5 24 所表示的网段是一样的吗 解答 24 这种写法 24
  • QGC调试px4飞控问题总结

    注 本文主要讨论本人遇到的问题 由于各操作步骤已有不少文章说明具体操作方法 本文不再赘述 1 如果使用碳纤维机架 要在电源板背面增加绝缘层以防短路 如果自行焊接导线 应当检查是否短路 2 传感器校准时尽量不要放到桌子上调 这是因为桌子可能不
  • pytorch 初始化

    初始化权值
  • 蓝桥杯:试题F:青蛙过河问题

    试题描述 小青蛙住在一条河边 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头跳到对岸 河里的石头排成了一条直线 小青蛙每次跳跃必须落在一块石头或者岸上 不过 每块石头有一个高度 每次小青蛙从一块石头起跳 这块石头的高度就 会下降 1
  • vue项目 设置scrollTop不起作用 总结

    今天在开发中 遇到这样一个情景 一个页面中有三个模块 每个模块对应一个标题 每个模块内容都很长 所以需要点击当前模块对应的标题滚动到模块所在位置 我想的方案是获取到每个模块距离文档顶部的距离 然后将值赋给对应要滚动的元素 步骤如下 首先给每
  • 【每日运维】RockyLinux8.6升级OpenSSH9.4p1

    为什么需要升级openssh呢 因为很多项目进行漏扫结果都会涉及到这个服务器核心组件 一想到以前升级openssh带来的各种依赖性问题就头疼 不管是什么发行版 升级这个东西真的很烦 这次发现可能还会有好一点的通用一点的升级方法 所以有个这个
  • angular调用接口方式_如何在Angular优雅编写HTTP请求

    引言 基本上当下的应用都会分为前端与后端 当然这种前端定义不在限于桌面浏览器 手机 APP等设备 一个良好的后端会通过一套所有前端都通用的 RESTful API 序列接口作为前后端之间的通信 这其中对于身份认证都不可能再依赖传统的Sess
  • 微信小程序面试题

    1 请谈谈wxml与标准的html的异同 标签名字有点不一样 多了一些 wx if 这样的属性以及 这样的表达式 开发工具限制 WXML仅能在微信小程序开发工具中预览 而HTML可以在浏览器内预览 组件封装不同 WXML对组件进行了重新封装
  • 今年做什么副业好?2021年做什么副业挣钱?2021年适合做的副业

    这两年我明白了一个道理 就是人无远虑必有近忧 所以2021我建议大家最好有一个副业 因为有了副业 即使我们没了工作也会有一定的生活保障 2021年适合做的副业有哪些 2021年做什么副业挣钱呢 第一类 体力类 1 餐饮兼职 虽然收入比较低
  • JAVA数据脱敏

    为了保护用户隐私 需要对敏感信息进行脱敏处理 如 姓名 电话号码 身份证 基于jackson 通过自定义注解的方式实现数据脱敏 添加依赖 spring web spring boot starter web已经集成了jackson相关包 不
  • Windows 环境下,nginx 配置文件上传大小

    问题描述 今天将刚刚和前端对接的文件上传功能 部署到公司的测试环境 提示如下错误信息 413 Request Entity Too Large 解决方法如下 1 打开nginx配置文件 nginx conf 路径一般是 E nginx 1
  • 《数据库系统概论》课程之实验五流六

    前序 数据库系统概论 课程之实验五 通过嵌入式SQL访问数据库 1实验目的 熟悉通过嵌入式SQL 主语言为C语言 编程访问数据库 实验以C语言为例作说明 实作可以选择任意语言实现本实验 2实验平台和实验工具 在KingbaseES数据库管理