oracle

win安装

Win10安装Oracle 19c+PLSQL 14.0

docker安装

Docker安装Oracle(超详细,清晰)_docker oracle_心 灵的博客-优快云博客

sqlplus 连接

sqlplus system/Admin123!
# 远程
sqlplus system/Admin123!@192.168.139.20:1521/orcl # orcl 实例名

配置 plsql

乱码问题处理

select userenv('language') from dual;

窗口分辨率问题

navicate连接配置

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 中查找版本一致的

版本查询

select * from v$version;

我这里选择大版本一致的

创建表空间和用户

-- 创建表空间 autoextend 设置自动增长 每次扩容 10m
create tablespace waterboss
datafile 'c:\waterboss.dbf'
size 100m
autoextend on
next 10m;

-- 创建用户
create user wateruser
identified by Admin123
default tablespace waterboss;

-- 赋予 dba 权限才可登录
grant dba to wateruser;

数据类型

  1. 字符型
    (1)CHAR : 固定长度的字符类型,最多存储 2000 个字节
    (2)VARCHAR2 :可变长度的字符类型,最多存储 4000 个字节
    北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
    (3)LONG : 大文本类型。最大可以存储 2 个 G
  2. 数值型
    NUMBER : 数值类型
    例如:NUMBER(5) 最大可以存的数为 99999
    NUMBER(5,2) 最大可以存的数为 999.99
  3. 日期型
    (1)DATE:日期时间型,精确到秒
    (2)TIMESTAMP:精确到秒的小数点后 9 位
  4. 二进制型(大数据类型)
    (1)CLOB : 存储字符,最大可以存 4 个 G
    (2)BLOB:存储图像、声音、视频等二进制数据,最多可以存 4 个

ddl

create table t_owners
(
id number primary key,
name varchar2(30),
addressid number,
housenumber varchar2(30),
watermeter varchar2(30),
adddate date,
ownertypeid number
);

insert into T_OWNERS VALUES (1,' 张三丰
',1,'2-2','5678',sysdate,1);

导出导入

# 整库
# file名称不指定的话默认是 EXPDAT.DMP
# full=y 指定整库导出
exp system/Admin123! full=y file=water.dmp
imp system/Admin123! full=y file=water.dmp

# 按用户
owner=wateruser # imp

# 按表
tables=t_account,a_area

分页实现

rownum 补充介绍

SELECT rownum r, t_owners.* from t_owners;

正式引入

select * from
(select rownum r,t.* from
(select * from T_ACCOUNT order by usenum desc) t
where rownum<=20 )
where r>10
  • <font style="color:#DF2A3F;">rownum</font> 是在查询语句扫描每条记录时产生的,所以不能使用“大于” 符号,只能使用“小于”或“小于等于” ,只用“等于”也不行。
  • 需要使用子查询保证顺序

锁行问题

问题描述:当执行update语句的时候,执行超时

原因:在 update 和 insert 操作以后,没有 commit 异常关闭连接

解决:

-- 查找加锁的行
select
    object_name,
    machine,
    s.sid,
    s.serial#
from
    v$locked_object l,
    dba_objects o ,
    v$session s
where
    l.object_id = o.object_id
and
    l.session_id=s.sid;
-- 处理锁
ALTER system KILL session 'SID,serial#';

TimeStamp时间类型读取问题

在使用jdbc结合反射去读查询到的行的时候,默认返回类型是 oracle.sql.TIMESTAMP

这个类型在 序列化以及后面的使用都会很不方便

protected <T> ArrayList<T> query(Class<T> clazz, String sql, DynamicQueryUtil query) throws Exception {
        //设置?的值
        query.setBaseSql(sql);
        sql = query.generateSql();//如果想排序,自行在sql后添加

        //        创建PreparedStatement对象,对sql预编译
        Connection connection = JDBCTools.getConnection();
        PreparedStatement ps = connection.prepareStatement(sql);

        query.fillPreparedStatement(ps);//填充pst

        ArrayList<T> list = new ArrayList<>();
        ResultSet res = ps.executeQuery();

        /*
        获取结果集的元数据对象。
        元数据对象中有该结果集一共有几列、列名称是什么等信息
         */
        ResultSetMetaData metaData = res.getMetaData();
        int columnCount = metaData.getColumnCount();//获取结果集列数

        //遍历结果集ResultSet,把查询结果中的一条一条记录,变成一个一个T 对象,放到list中。
        while (res.next()) {
            //循环一次代表有一行,代表有一个T对象
            T t = clazz.newInstance();//要求这个类型必须有公共的无参构造

            //把这条记录的每一个单元格的值取出来,设置到t对象对应的属性中。
            for (int i = 1; i <= columnCount; i++) {
                //for循环一次,代表取某一行的1个单元格的值
                Object value = res.getObject(i);

				// 对于 Timestamp 类型特殊处理
                if (value instanceof TIMESTAMP){
                    value = DateUtils.dateToTimestamp(((TIMESTAMP) value).dateValue());
                }
                
                //这个值应该是t对象的某个属性值
                //获取该属性对应的Field对象
//                String columnName = metaData.getColumnName(i);//获取第i列的字段名
                String columnName = metaData.getColumnLabel(i);//获取第i列的字段名或字段的别名
                Field field = clazz.getDeclaredField(columnName);
                field.setAccessible(true);//这么做可以操作private的属性

                field.set(t, value);
            }

            list.add(t);
        }

        res.close();
        ps.close();
        //这里检查下是否开启事务,开启不关闭连接,业务方法关闭!
        //没有开启事务的话,直接回收关闭即可!
        if (connection.getAutoCommit()) {
            //回收
            JDBCTools.free();
        }
        return list;
    }

这里我手动添加了转换

// 对于 Timestamp 类型特殊处理
if (value instanceof TIMESTAMP){
	value = DateUtils.dateToTimestamp(((TIMESTAMP) value).dateValue());
}

转换成了 java.sql.TimeStamp 类型

其实分析以后,很大一部分原因还是我这边用的工具类,如果使用 getTimestamp 方法去取的话,就没有这个问题了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值