win安装
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)CHAR : 固定长度的字符类型,最多存储 2000 个字节
(2)VARCHAR2 :可变长度的字符类型,最多存储 4000 个字节
北京市昌平区建材城西路金燕龙办公楼一层 电话:400-618-9090
(3)LONG : 大文本类型。最大可以存储 2 个 G - 数值型
NUMBER : 数值类型
例如:NUMBER(5) 最大可以存的数为 99999
NUMBER(5,2) 最大可以存的数为 999.99 - 日期型
(1)DATE:日期时间型,精确到秒
(2)TIMESTAMP:精确到秒的小数点后 9 位 - 二进制型(大数据类型)
(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 方法去取的话,就没有这个问题了