oracle 11xe版使用体会

其实xe版限制挺多的。

1、固定一个实例
2、4G表空间限制
3、不支持位图索引

11xe版创建位图索引报错

ORA-00439: feature not enabled: Bit-mapped indexes


select * from sys.v_$option where parameter='Bit-mapped indexes';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
Bit-mapped indexes
FALSE

查了官方文档确实如此:
http://docs.oracle.com/cd/E17781_01/license.112/e18068/toc.htm#BABHACFJ

Bitmapped index, bitmapped join index No

参考资料:
http://www.oracle.com/pls/xe112/portal.all_books

oracle配置sqlplus环境和autotrace执行计划

一、sqlplus环境配置
创建一个sql脚本,sqlplus.sql:

vim /root/sqlplus.sql

输入以下内容:

set serveroutput on size 1000000
set trimspool on
set long 5000
set linesize 100
set pagesize 9999
column plan_plus_exp format a80
set timing on

以后每次登录sqlplus时执行下sqlplus.sql脚本。

其实oracle在$ORACLE_HOME/sqlplus/admin目录有glogin.sql,是sqlplus登录时自动调用的。可以加在这里面。

二、配置autotrace
1、sys用户
使用:

set autotrace on;

打开即可。
继续阅读oracle配置sqlplus环境和autotrace执行计划

oracle数据库对象-视图(2)

创建/修改视图语句:

create or replace view 视图名(列1, 列2, ... , 列n) as (select 列1, 列2, ... ,列n from 表名 where 筛选条件);

删除视图语句:

drop view 视图名;

1、视图就是一个虚表,一个子查询,会写sql语句就会写视图,难一点的就是把几个select结果union或union all连接到一块儿。

2、视图的列和子查询里select后的列,要一一对应关系。

oracle rowid和ora_rowscn

rowid、ora_rowscn都是oracle表中的伪列。

一、rowid

rowid记录的是该行的物理位置,所以查询速度上比索引还要快。它的值绝对不会重复。

rowid的组成:

数据对象编号        文件编号        块编号            行编号
OOOOOO                FFF           BBBBBB             RRR 


详细情况:
http://blog.csdn.net/haiross/article/details/15338061
http://blog.chinaunix.net/uid-23622436-id-3204694.html

二、ora_rowscn

表示每条记录所在块的最后一次修改时间。在同一块中,所有记录的ora_rowscn值是一样的,而且只要有一条记录修改后,该块内所有记录的ora_rowscn都会改变。
继续阅读oracle rowid和ora_rowscn

oracle group by和窗口函数

一、group by

1、分组的实质就是一行(或多行)中的某一列(或多列)具有相同值。

2、组是非空的,如果分组成功,组至少包含一个成员(或行)。

3、组是独特的,意味着,当查询中使用group by时,select列表中就不必使用distinct关键字。

4、当针对非空表的查询(包含group by)中使用聚集函数count时,它绝对不会返回0。至少会返回一个非0值。

二、count(*)和count(列名)

create table fruits (name varchar2(10));

insert into fruits values ('Oranges');
insert into fruits values ('Oranges');
insert into fruits values ('Oranges');
insert into fruits values ('Apple');
insert into fruits values ('Peach');
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);
insert into fruits values (null);

select name, count(name) from fruits group by name;
select name, count(*) from fruits group by name;

从例子可以看出,count(name)会忽略列的空值行,count(*)不会忽略空值行。

当使用count时,需要考虑是否希望包含NULL。使用count(column),不会计算NULL。

如果希望包含NULL,则使用count(*)对行计数。
继续阅读oracle group by和窗口函数

oracle常用字符串函数

字符串是由两个引号来定义的,而在两个引号中没有任何字符时,表示NULL值。

一、字符串替换
replace和translate函数
replace和translate都是拥有字符替换的功能,replace是以字符串为单位,translate是以单个字符为单位。

语法:replace(‘目标字符串’, ‘待搜索字符串’, ‘替换字符串’)

select replace('123456abcdefg', 'abc', '00') from dual;

结果:12345600defg

语法:translate(‘目标字符串’, ‘待搜索字符’, ‘替换字符’)

select translate('123456abcdefg', 'a1f', '!@#') from dual;

结果:@23456!bcde#g
字符的对应关系:a -> !,1 -> @,f -> #

如果替换字符对应为空,则在目标字符串中去除搜索字符:

select translate('123456abcdefgZ', '#0123456789abcdefg', '#') from dual;

结果为Z。

可以用这个特点来检测一个字符串的字符是否在某个范围内,如果返回空,则字符串在目标字符范围内。
translate函数第三个参数不能为空,否则结果是NULL。replace函数第三个参数为空表示将待搜索的字符串去除。
继续阅读oracle常用字符串函数

oracle单引号

oracle单引号
一般是第一个单引号和最后一个单引号组成一个字符串,中间再遇到单引号就是转义字符

select '''' from dual;

///输出一个单引号


select '||' from dual;

///输出||


select 'name||' from dual;

///输出name||


select 'name'||'''' from dual;

///输出name’,||作为连接符,把name和一个单引号连接在一起

oracle数据库对象-表(2)

对表插入、更新、删除数据

一、insert

insert into 表名 (字段1, 字段2, ... ,字段n) values (值1, 值2, ... ,值n);

1、写字段列表,可以只写部分字段(主键和非空),其它字段默认为空(null)。

insert into emp (empno, ename) values (99, 'APPLE');

也可以把所有字段都写出来。

insert into emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) values (98, 'JACK', NULL, NULL, NULL, NULL, NULL, NULL);

2、不写字段列表,值必须按照表中字段的默认顺序排列,并且必须为每个列提供一个值。

insert into emp values (100, 'TOM', 'SALESMAN', 7698, to_date('19860101000000', 'yyyymmddhh24miss'), 3000, 100, 30);

字符和日期值应放在单引号中;
数字值不应放在单引号中,因为对于指定为number数据类型的字段,如果使用了单引号,可能会发生数字值的隐式转换。
继续阅读oracle数据库对象-表(2)

oracle中order by学习

一、
order by子句是对select语句查询后的结果集进行排序。按照desc降序,asc升序,默认为升序。

二、
order by子句后面可以跟列名、数字、随机函数。

1、列名
表示按照某个列来排序。

select ename, job from emp order by ename;

2、数字
数字作用和列名一样,指明了按照select列表中相应位置的列来排序。

select ename, job from emp order by 2;

如果数字超出了select后面列的数量,会报错:

ORA-01785: ORDER BY item must be the number of a SELECT-list expression

继续阅读oracle中order by学习

[转]oracle表空间的高水位线

oracle表段中的高水位线HWM

oracle在逻辑存储上分4个粒度:表空间,段,区和块。

块:是粒度最小的存储单位,oracle的块大小可以是8K~32K不等,包含标准磁盘上的一个或多个块。oracle每一次I/O操作也是按块来操作的,也就是说当oracle从数据文件读数据时,是读取多少个块,而不是多少行。每一个Block里可以包含多个row。

区:由一系列相邻的块而组成,这也是oracle空间分配的基本单位,举个例子来说,当我们创建一个表Dave时,首先oracle会分配一个区的空间给这个表,随着不断的insert数据到Dave,原来的这个区容不下插入的数据时,oracle是以区为单位进行扩展的,也就是说再分配多少个区给Dave,而不是多少个块。

段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象。所以从某种意义上来说,段就是某种特定的数据。如:create table Dave,这个段就是数据段,而create index on Dave(NAME),oracle同样会分配一个段给这个索引,但这是一个索引段了。查询段的信息可以通过数据字典USER_SEGMENTS来获得。

表空间:包含段、区及块。表空间的数据物理上储存在其所在的数据文件中。一个数据库至少要有一个表空间。

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
继续阅读[转]oracle表空间的高水位线

软件及互联网爱好者