JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)

简介: JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数

JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)https://developer.aliyun.com/article/1432877


四、存储过程*

4.1 什么是存储过程

存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:

1、存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
2、存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
3、存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码

4.2 存储过程语法结构

CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
(参数名 类型, 参数名 类型, 参数名 类型)
IS|AS
 变量声明部分;-- 注意这里结束
BEGIN
 逻辑部分
[EXCEPTION 
 异常处理部分]
END;

参数只指定类型,不指定长度

过程参数的三种模式:

  • IN 传入参数(默认)
  • OUT 传出参数 ,主要用于返回程序运行结果
  • IN OUT 传入传出参数

4.3 案例

4.3.1 创建不带传出参数的存储过程

添加部门信息

-- 创建序列
create sequence seq_dept_id start with 60 increment by 10;
-- 创建存储过程
create or replace procedure pro_dept_addinfo
(
       p_dname varchar2, -- 部门名称
       p_loc varchar2 -- 部门位置
)
is
begin
  insert into dept values(seq_dept_id.nextval,p_dname,p_loc);
  commit;
end;

PL/SQL 中调用不带传出参数的存储过程

call pro_dept_addinfo('软件测试','武汉');
or
begin
   pro_dept_addinfo('软件质量','郑州');
end;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p6lMT4R8-1666020355061)(assets/image-20210326111257015.png)]

4.3.2 创建带传出参数的存储过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LtqUi7x0-1666020355062)(asseits/image-20221015234841374.png)]

一般用来创建比较灵活输出的存储过程实用场景;

Create or replace procedure getRax(xsal in number,fee out number)
as
   r number:=xsal-5000;
begin
  case 
    when  r<0 then fee:=0;
    when r<=3000 then fee:=r*0.03;
    when r<=12000 then fee:=r*0.1-210;
    when r<=25000 then fee:=r*0.2-1410;
    when r<=35000 then fee:=r*0.25-2660;
    when r<=55000 then fee:=r*0.3-4410;
    when r<=80000 then fee:=r*0.35-7160;
    else
      fee:=r*0.45-15160;
   end case;      
end;

PL/SQL 中调用传出参数的存储过程

对于有数据返回的,在PL/SQL中只能使用begin end,不能使用call方式

-- 调用传出参数存储过程
declare
   fee number;
  begin
    getRax(&xsal,fee);
    dbms_output.put_line('应交税额:'||fee);
  end;

如果是命令窗口就用exec 存储过程名,举个栗子:

1.如果是命令窗口就用exec 存储过程名,举个栗子:

EXEC` `procedure ``;``--procedure是存储过程名

2.如果是PL/SQL窗口就用 begin 存储过程名 end; 举个栗子:

begin
 ``procedure``;``--procedure是存储过程名
end``;

3.如果是程序中调用就用 call 存储过程名 ,举个栗子:

hibernateDao.excuteSqlUpdate("{Call proc_stuInfo()}");//存储过程proc_stuInfo

五、JDBC连接Oracle

5.1 创建工程,导入jar包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vghGW1HS-1666020355063)(assets/image-20210326120911482.png)]

5.2 编写JDBC工具类

  • properties配置文件
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=oracletest
password=root
  • JDBCUtil
public class JDBCUtil {
    private static String driver;
    private static String url;
    private static String username;
    private static String password;
    private static Connection conn;
    static {
        try {
            // 读取加载配置文件
            InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
            Properties pro = new Properties();
            pro.load(is);
            driver = pro.getProperty("driver");
            url = pro.getProperty("url");
            username = pro.getProperty("username");
            password = pro.getProperty("password");
            // 加载驱动
            Class.forName(driver);
      // 连接oracle
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    // 获取数据库连接
    public static Connection getConnection() {
    conn = DriverManager.getConnection(url, username, password);
        return conn;
    }
    /**
     * 关闭资源
     *
     * @param rs
     * @param stmt
     * @param conn
     */
    public static void close(ResultSet rs, Statement stmt, Connection conn) {
        //关闭结果集
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭执行对象
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        //关闭执行对象
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

5.3 JDBC工具类测试

public class JDBCTest {
    public static void main(String[] args) {
        Connection conn = JDBCUtil.getConnection();
        System.out.println(conn);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EC0JN8kG-1666020355064)(assets/image-20210326121455494.png)]

六、Oracle增删改查

以dept表为例,演示增删改查

6.1 编写实体类

public class Dept {
    private Integer id;
    private String dname;
    private String loc;
    // 省略有参和无参  getter和setter  toString
}

6.2 DeptDao

public class DeptDao {
    public void addDept(Dept dept) throws SQLException {
        Connection conn = JDBCUtil.getConnection();
        String sql = "insert into dept (id,dname,loc) values (?,?,?)";
        PreparedStatement pstmt = conn.prepareStatement(sql);
        pstmt.setInt(1, dept.getId());
        pstmt.setString(2,dept.getDname());
        pstmt.setString(3,dept.getLoc());
        pstmt.execute();
        JDBCUtil.close(null,pstmt,conn);
    }
}

6.3 DeptTest

public class DeptTest {
    public static void main(String[] args) throws SQLException {
        DeptDao dao = new DeptDao();
        Dept dept = new Dept(80,"总裁委员会","北京");
        dao.addDept(dept);
    }
}

七、数据导出与导入

当我们使用一个数据库时,总希望数据库的内容是可靠的、正确的,但由于计算机系统的故障(硬件故障、软件故障、网络故障、进程故障和系统故障)影响数据库系统的操作,影响数据库中数据的正确性,甚至破坏数据库,使数据库中全部或部分数据丢失。因此当发生上述故障后,希望能重构这个完整的数据库该处理称为数据库恢复,而要进行数据库的恢复必须要有数据库的备份工作。

7.1 整库导出与导入

  • 整库导出命令
exp 用户名/密码@实例名 file=导出的dmp文件存放路径 log=导出日志存放路径
  • 添加参数 full=y 就是整库导出
    执行命令后会在当前目录下生成一个叫 EXPDAT.DMP,此文件为备份文件。
    如果想指定备份文件的名称,则添加 file 参数即可,命令如下
exp 用户名/密码@实例名 file=文件名 full=y
  • 案例:将u1用户下导出到d盘中,文件叫做u1.dmp
exp u1/123456 file='u1.dmp'
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vYtXOqRq-1666020355065)(\assets\image-20211202114900529.png)]
  • 整库导入命令
imp 用户名/密码 file='文件'
  • 案例:
imp u1/123456 file='u1.dmp'

7.2 按用户导出与导入

  • 按用户导出
exp system/oracletest owner=oracletest file=oracletest.dmp
  • 按用户导入
imp system/oracletest file=oracletest.dmp fromuser=oracletest

7.3 按表导出与导入

  • 按表导出
exp oracletest/root file=a.dmp tables=dept
  • 用 tables 参数指定需要导出的表,如果有多个表用逗号分割即可
  • 按表导入
imp oracletest/root file=a.dmp tables=dept

出日志存放路径

###### ==添加参数 full=y 就是整库导出==
执行命令后会在当前目录下生成一个叫 EXPDAT.DMP,此文件为备份文件。
如果想指定备份文件的名称,则添加 file 参数即可,命令如下
```sql
exp 用户名/密码@实例名 file=文件名 full=y

案例:将u1用户下导出到d盘中,文件叫做u1.dmp

exp u1/123456 file='u1.dmp'

[外链图片转存中…(img-vYtXOqRq-1666020355065)]

  • 整库导入命令
imp 用户名/密码 file='文件'
  • 案例:
imp u1/123456 file='u1.dmp'

7.2 按用户导出与导入

  • 按用户导出
exp system/oracletest owner=oracletest file=oracletest.dmp
  • 按用户导入
imp system/oracletest file=oracletest.dmp fromuser=oracletest

7.3 按表导出与导入

  • 按表导出
exp oracletest/root file=a.dmp tables=dept
  • 用 tables 参数指定需要导出的表,如果有多个表用逗号分割即可
  • 按表导入
imp oracletest/root file=a.dmp tables=dept


目录
相关文章
|
11天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
23 7
|
11天前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
15 6
|
11天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
15 5
|
18天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
2天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
13 4
|
25天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
58 3
Mysql(4)—数据库索引
|
11天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
49 2
|
14天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
57 4
|
19天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
|
23天前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
97 4

推荐镜像

更多
下一篇
无影云桌面