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


目录
相关文章
|
2天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
【Oracle】玩转Oracle数据库(七):RMAN恢复管理器
23 4
|
2天前
|
存储 SQL Oracle
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数
30 7
|
2天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
34 7
|
10天前
|
SQL 数据可视化 关系型数据库
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
轻松入门MySQL:深入探究MySQL的ER模型,数据库设计的利器与挑战(22)
|
10天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
10天前
|
关系型数据库 MySQL 数据库
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
轻松入门MySQL:精准查询,巧用WHERE与HAVING,数据库查询如虎添翼(7)
|
12天前
|
存储 关系型数据库 MySQL
数据库字符编码MySQL中使用UTF-8还是UTFB4
数据库字符编码MySQL中使用UTF-8还是UTFB4
18 0
|
15天前
|
缓存 NoSQL 关系型数据库
在Python Web开发过程中:数据库与缓存,MySQL和NoSQL数据库的主要差异是什么?
MySQL是关系型DB,依赖预定义的表格结构,适合结构化数据和复杂查询,但扩展性有限。NoSQL提供灵活的非结构化数据存储(如JSON),无统一查询语言,但能横向扩展,适用于大规模、高并发场景。选择取决于应用需求和扩展策略。
110 1
|
15天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
82 0
|
21天前
|
SQL 关系型数据库 MySQL
阿里云MySQL数据库价格、购买、创建账号密码和连接数据库教程
阿里云数据库使用指南:购买MySQL、SQL Server等RDS实例,选择配置和地区,完成支付。创建数据库和账号,设置权限。通过DMS登录数据库,使用账号密码访问。同地域VPC内的ECS需将IP加入白名单以实现内网连接。参考链接提供详细步骤。
363 3

推荐镜像

更多