Oracle

Oracle

August 7, 2020
Oracle

内置数据类型

分类 数据类型 介绍
字符 CHAR [(size [BYTE | CHAR])] 定长字符串,占据 n 字节
NCHAR[(size)] 定长字符串,占据 2n 字节
VARCHAR2(size) 可变长度的字符串
NVARCHAR2(size) 可变长度的 UNICODE 字符串
数值 NUMBER(p,s) p 代表精度(1 - 38),s 代表 scale (-84 - 127)
FLOAT [(p)] 小数,精度不高
LONG 仅仅为了兼容
日期 DATE 大小固定占用 7 bytes
TIMESTAMP
字节 RAW(size) 定长
LONG RAW 变长,图像、声音、文档、数组,建议使用 LOB
LOB

ROWID 伪列

SELECT ROWID from your_table;

ROWID 不能被用作主键。

ROWNUM 伪列

ROWNUM 是 Oracle 对查询结果自动添加的一个伪列,编号从 1 开始,每一次查询动态生成。

非排序查询 Top N

SELECT stu_no, stu_name, score FROM student WHERE ROWNUM <= 5;

排序查询 Top N

SELECT stu_no, stu_name, score FROM
(
    SELECT stu_no, stu_name, score FROM student ORDER BY score DESC
)
WHERE ROWNUM <= 5;

分页查询

SELECT rn, stu_no, stu_name, score FROM
(
    SELECT ROWNUM rn, stu_no, stu_name, score FROM
    (
        SELECT stu_no, stu_name, score FROM student ORDER BY score DESC
    )
    t1
) t2
WHERE rn >= 4 AND rn <= 6;

参考自 ORACLE中的TOP-N查询(TOP-N分析)、分页查询

汉字占用长度

N 开头的字段类型(比如 NCHAR, NVARCHAR2)中,任何一个字符(包括一个汉字)占2个字节,统一的。不以 N 开头的字段类型(比如 CHAR, VARCHAR2)中,unicode 字符(比如汉字)占3个字节,其他字符占1个字节。

如何求一个字符串占用的字符数和字节数? length 函数求得是占用字符数,lengthb或者 vsize 函数求得是占用字节数。你说 中华12 这个字符串占用了多少字符,字节?看 sql 返回值便清楚了。

select length('中华12') from dual  --返回4,也就是占用4个字符
select lengthb('中华12') from dual  --返回8,也就是占用8个字节,其中中华儿子各占3个字节,而12两个字符各占一个字节
select lengthb(N'中华1') from dual  --返回6,这是将字符串转换成为unicode字符串后,每个字符占用2个字节,3个就是6个字节
select length(N'中华1') from dual  --返回3,因为只有3个字符嘛。

事务

oracle 数据库支持 READ COMMITTEDSERIALIZABLE这两种事务隔离级别。默认系统事务隔离级别是 READ COMMITTED,也就是读已提交

setAutoCommit(false)

如下,关闭自动 commit,对于同一个 connection,先 insert,然后 select 是可以查询到刚才 insert 的这行数据的,原因是这行数据在服务器已经执行了,只是对其它事务不可见(事务的隔离性)。比如使用 NavicatDBVisualizer 是查询不到你刚刚 insert 的这条数据的。

con.setAutoCommit(false);
insertPreparedStatement.executeUpdate();
ResultSet rs = selectPreparedStatement.executeQuery();
boolean exist = rs.next(); // 可以查询到

setAutoCommit(true)

未关闭自动 commit,那么当 executeUpdate 这句话执行结束的时候,就会自动 commit,其他事务(NavicatDBVisualizer)也就可以立即查询到了。

con.setAutoCommit(true);
insertPreparedStatement.executeUpdate(); // 会自动 commit

参考