当前位置:文档之家› oracle学习笔记

oracle学习笔记

578102148

Mysql笔记

-1:丢失更新,悲观锁定、乐观锁定。

0、专有名词:archivelog mode 归档模式;noarchivelog 非归档模式;

OLTP:On-Line Transaction Processing联机事务处理系统

OLAP:On-Line Analytical Processing联机分析处理

IOT:索引组织表索引组织表(IOT)不仅可以存储数据,还可以存储为表建立的索引。索引组织表的数据是根据主键排序后的顺序进行排列的,这样就提高了访问的速度。但是这是由牺牲插入和更新性能为代价的(每次写入和更新后都要重新进行重新排序)。

Init.ora:

db_name:一个数据库标识符,应与create database中的名称相同。

Instance_name:在多个例程使用相同服务名的情况下,用来唯一地标识一个数据库例程。它实际上是对在一台主机上共享内存的各个例程的唯一标识。应该与sid分开。

open_cursors = 320 库高速缓存指定一个会话一次可以打开的游标(环境区域) 的最大数量,并且限制PL/SQL 使用的PL/SQL 游标高速缓存的大小,以避免用户再次执行语句时重新进行语法分析。请将该值设置得足够高,这样才能防止应用程序耗尽打开的游标

max_enabled_roles = 32 允许创建的最多角色数,

db_block_buffers = 5120 高速缓存与I/O 缓冲区高速缓存中Oracle 块的数量。该参数会显著影响一个例程的SGA总大小。

shard_pool_size = 75497472 共享池大小

large_pool_size = 15728640池--指定大存储池的分配堆,它可被多线程服务器(MTS) 用作会话内存、用作并行执行的消息缓冲区以及用作RMAN备份和恢复的磁盘I/O 缓冲区。

java_pool_size = 65536

以字节为单位,指定Java 存储池的大小,它用于存储Java 的方法和类定义在共享内存中的表示法,以及在调用结束时移植到Java 会话空间的Java 对象。

log_checkpoint_interval = 10000

指定在出现检查点之前,必须写入重做日志文件中的OS 块(而不是数据库块) 的数量。无论该值如何,在切换日志时都会出现检查点。较低的值可以缩短例程恢复所需的时间,但可能导致磁盘操作过量。

log_checkpoint_timeout = 1800

指定距下一个检查点出现的最大时间间隔(秒数)。将该时间值指定为0,将禁用以时间为基础的检查点。较低的值可以缩短例程恢复的时间,但可能导致磁盘操作过量

processes = 220

log_buffer = 8388608

以字节为单位,指定在LGWR 将重做日志条目写入重做日志文件之前,用于缓存这些条目的内存量。重做条目保留对数据库块所作更改的一份记录。如果该值大于65536,就能减少重做日志文件I/O,特别是在有长时间事务处理或大量事务处理的系统上**最大值为500K 或128K * CPU_COUNT,两者之中取较大者

oracle_trace_enable = true

启动一个默认的Oracle Trace 集合,直到该值再次设置为NULL。

sql_trace=false

这些信息对改善性能很有用。由于使用SQL 跟踪设备将引发系统开销,只应在需要优化信息的情况下使用TRUE。

timed_statistics=true

收集操作系统的计时信息,这些信息可被用来优化数据库和SQL

语句。要防止因从操作系统请求时间而引起的开销,请将该值设置为零。将该值设置为TRUE 对于查看长时间操作的进度也很有用。

background_dump_dest = /opt/apps/oracle/admin/51cto/bdump

指定在Oracle 操作过程中为后台进程(LGWR,DBW n 等等) 写入跟踪文件的路径名(目录或磁盘)。它还定义记录着重要事件和消息的数据库预警文件的位置。

core_dump_dest = /opt/apps/oracle/admin/51cto/cdump

指定核心转储位置的目录名(用于UNIX)。

resource_manager_plan = system_plan

如果指定该值,资源管理器将激活计划和例程的所有子项(子计划、指令和使用者组)。如果不指定,资源管理器将被禁用,但使用ALTER SYSTEM 命令还可以启用。

user_dump_dest = /opt/apps/oracle/admin/51cto/udump

为服务器将以一个用户进程身份在其中写入调试跟踪文件的目录指定路径名。例如,该目录可这样设置: NT 操作系统上的C:/

ORACLE/UTRC;UNIX 操作系统上的/oracle/utrc;或VMS 操作系统上的DISK$UR3:[ORACLE.UTRC]。

db_block_size = 8192

一个Oracle 数据库块的大小(以字节计)。该值在创建数据库时设置,而且此后无法更改。1024 - 65536 (根据操作系统而定)。

remote_login_passwordfile = exclusive

指定操作系统或一个文件是否检查具有权限的用户的口令。如果设置为NONE,Oracle 将忽略口令文件。如果设置为EXCLUSIVE,将使用数据库的口令文件对每个具有权限的用户进行验证。如果设置为SHARED,多个数据库将共享SYS 和INTERNAL 口令文件用户

os_authent_prefix = ""

使用用户的操作系统帐户名和口令来验证连接到服务器的用户。该参数的值与各用户的操作系统帐户连接在一

起。要去除OS

帐户前缀,请指定空值。

job_queue_processes = 4

只用于复制环境。它指定每个例程的SNP作业队列进程的数量(SNP0, ... SNP9, SNPA, ... SNPZ)。要自动更新表快照或执行由DBMS_JOB 创建的请求,请将该参数设置为 1 或更大的值。0 到36

job_queue_interval = 60

作业队列只用于复制环境。它以秒为单位指定该例程的每个SNPn 后台进程的唤醒频率。 1 到3600

distributed_transactions = 10

一个数据库一次可参与的分布式事务处理的最大数量。如果由于网络故障异常频繁而减少该值,将造成大量未决事务处理。

open_links = 4

指定在一次会话中同时打开的与远程数据库的连接的最大数量。该值应等于或超过一个引用多个数据库的单个SQL 语句中引用的数据库的数量,这样才能打开所有数据库以便执行该语句。

mts_dispatchers = "(protocol=TCP)(mul=ON)(tick=15)(pool=(in=2)(out=2))"

为设置使用多线程服务器的共享环境而设置调度程序的数量和类型。可以为该参数指定几种选项。这是字符串值的一个示例:“(PROTOCOL=TCP)(DISPA TCHERS=3)”。

compatible = "8.1.0"

允许使用一个新的发行版,同时保证与先前版本的向后兼容性。

sort_area_size = 524288

以字节为单位,指定排序所使用的最大内存量。排序完成后,各行将返回,并且内存将释放。增大该值可以提高大型排序的效率。如果超过了该内存量,将使用临时磁盘段。相当于 6 个数据库块的值(最小值) 到操作系统确定的值(最大值)。

sort_area_retained_size = 131072

以字节为单位,指定在一个排序运行完毕后保留的用户全局区(UGA) 内存量的最大值。最后一行从排序空间中被提取后,该内存将被释放回UGA,而不是释放给操作系统。

remote_os_authent

REMOTE_LOGIN_PASSWORDFILE

RMAN: (recovery manager) 备份管理用于备份、还原和恢复oracle数据库

Backup sets:备份集。备份集顾名思义就是一次备份的集合,它包含本次备份的所有备份片,以oracle专有的格式保存。一个备份集根据备份的类型不同,可能构成一个完全备份或增量备份。

Backup pieces:备份片一个备份集由若干个备份片组成。每个备份片是一个单独的输出文件。一个备份片的大小是有限制的;如果没有大小的限制,备份集就只由一个备份片构成。备份片的大小不能大于你的文件系统所支持的文件长度的最大值。

Image copies 映像备份不压缩、不打包、直接COPY 独立文件(数据文件、归档日志、控

制文件),类似操作系统级的文件备份。而且只能COPY 到磁盘,不能到磁带。可以作为增量备份的0级,一般用来备份控制文件。

Full backup 全备份是指对数据文件中使用过的数据块进行备份,没有使用过的数据块是不做备份的,也就是说,RMAN 进行备份是进行压缩的。

Recovery catalog 恢复目录

恢复目录用于记录RMAN 使用过程中的控制信息,恢复目录应该经常被同步(这在后面会讲到)。尽管我们可以使用nocatalog 方式来使用RMAN,此时控制信息记录在目标数据库的控制文件中,但这样毕竟不安全,因为一旦目标数据库的控制文件损坏就意味着所有的RMAN 备份失效。同样的道理恢复目录应该建立在另外一个数据库中,在下面的例子中我们称作“目录数据库”。

SQL_TRACE概述:

SQL_TRACE是Oracle数据库提供的用于进行SQL跟踪的手段,在某种意义上讲,可以说是Oracle最强有力的辅助诊断工具。

归档日志

Resetlogs

IMP,EXP, IMPDP,EXPDP等理解:EXP和IMP是客户段工具程序,它们既可以在客户端使用,也可以在服务器段使用。EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用

IMP只适用于EXP导出文件,不适用于EXPDP导出文件;IMPDP只适用于EXPDP导出文件,而不适用于EXP导出文件。数据泵导出包括导出表,导出方案,导出表空间,导出数据库4种方式。

IPC 机制建立。。Linux支持大量进程间通讯(IPC)机制。除了信号和管道外,Linux 还支持Unix 系统V中的IPC机制。

连接管理器(Connection Manager ,CMAN),

1、创建第一个数据库create database mydata; 。。接下来在这个数据库工作:use mydata ; 。。

2、Mysql的数据类型需要网上查,包括:int

3、查看mysql内有几个数据库show databases;

4、插入数据:insert into dept values(10,'A','A');

sql server 2005 用户名:sa 密码:ssaa

用户名:orac 密码:liu199001

超级用户名:sys 密码:liu199001

创建的第一个数据库oracle1 用户口令为:liu1990

1.进入:sqlplus 以超级管理员的身份进入:sqlplus sys/liu199001 as sysdba 。

查询所有用户的信息:select * from dba_users; 。。或者:select * from all_users;

只查询用户名和密码:select username ,password from dba_users ;。。

2、以图形界面的方式创建一个数据库:

2.创建新用户:create user orac identified by liu199001; 。把dba赋权给orac:grant dba to

orac; 。一般的赋权:grant delete any table to orac; 。grant update any table to orac;

3. 修改用户名的密码:alter user orac identified by liu199002; 。

4.给用户解锁:alter user orac account unlock; 。

5.描述一个表:desc emp (emp是表的名字) 。查询一个用户内的所有表名:select table_name from user_tables;查看当前用户谁:show user;

6.用oracle创建一个表,

1、先创建一个用户,我创建的是orac用户,密码liu199001 。

2、赋权:grant connect,resource to orac(identified by liu199001);。

3、连接:connect orac/liu199001 。

4、创建表:

--创建雇员表emp

create table emp

(

empno number(4) not null ,--员工号

ename varchar(10),--员工姓名

job varchar(9),--工种

mgr number(4),--所属经理编号

hiredate date,--入职日期

sal number(7,2),--薪水

comm number(7,2),--奖金

deptno number(2),--部门号

primary key(empno)

);

--创建部门表dept

create table dept

(

deptno number(2) not null ,--部门号

dname varchar(14),--部门名称

loc varchar(13),--部门位置

primary key(deptno)

);

--创建工资等级表salgrade

create table salgrade

(

grade number not null ,--等级

losal number,--最低薪水

hisal number,--最高薪水

primary key(grade)

);

7. 描述表:desc emp 。查询一个表的主键:select column_name from user_cons_columns wherE CONSTRAINT_NAME in (select CONSTRAINT_NAME from user_constraints where table_name =upper('&tab') and CONSTRAINT_TYPE='P');

8.向表中插入数据:insert into salgrade values(1,700,1200); 。

如果插入的是字符串,不是数字记得加单引号:insert into dept values(10,'ACCOUNTING','NOW

YORK'); 。

这个例子包含前面的描述,用于不完全插入,最主要的是要学会这个插入时间函数:to_date();

insert into emp(EMPNO,ENAME,JOB,MGR,HIREDA TE,SAL,DEPTNO)values

(7369,'SMITH','CLERK',7902,to_date('1980-12-17','yyyy-mm-dd'),800,20); 。

最后一点:插入数据后一定commit;一下,否则啥也没了。。。。

(补充一个时间的插入函数:

ORACLE插入日期类型数据

2010-11-24 14:24

oracle数据库插入日期型数据

往Oracle数据库中插入日期型数据(to_date的用法)

今天碰到了需要往Oracle数据库中插入日期型数据,要使用TO_DA TE函数,在网上发现一篇写的不错的

文章,摘来一起分享。

INSERT INTO FLOOR V ALUES ( to_date ( '2007-12-20 18:31:34' , 'YYYY-MM-DD HH24:MI:SS' ) ) ;

查询显示:2007-12-20 18:31:34.0

-------------------

INSERT INTO FLOOR V ALUES ( to_date ( '2007-12-14 14:10' , 'YYYY-MM-DD HH24:MI' ) );

查询显示:2007-12-14 14:10:00.0

-------------------

INSERT INTO FLOOR V ALUES ( to_date ( '2007-12-14 14' , 'YYYY-MM-DD HH24' ) );

查询显示:2007-12-14 14:00:00.0

-------------------

INSERT INTO FLOOR V ALUES ( to_date ( '2007-11-15' , 'YYYY-MM-DD' ) );

查询显示:2007-11-15 00:00:00.0

-------------------

INSERT INTO FLOOR V ALUES ( to_date ( '2007-09' , 'YYYY-MM' ) );

查询显示:2007-09-01 00:00:00.0

-------------------

INSERT INTO FLOOR V ALUES ( to_date ( '2007' , 'YYYY' ) );

查询显示:2007-05-01 00:00:00.0

-------------------

当省略HH、MI和SS对应的输入参数时,Oracle使用0作为DEFAULT值。

如果输入的日期数据忽略时间部分,Oracle会将时、分、秒部分都置为0,也就是说会取整到日。

同样,忽略了DD参数,Oracle会采用1作为日的默认值,也就是说会取整到月。

但是,不要被这种“惯性”所迷惑,如果忽略MM参数,Oracle并不会取整到年,而是取整到当前月)

9.从dual表中计算数学表达式,dual是一个虚表,只有一个字段,一个记录,如:desc dual;命令显示表的内容,计算:select 5*9 from dual;。输出结果45。

10. 查询系统时间的语句:select sysdate from dual;。

11.查询时若要取别名,有两种格式1、不用空格:select ename ,sal *12 annulsalary from emp;2、若有空格加双引号:select ename ,sal *12 “annul salary” from emp;

12. 任何含有空值的数学查询表达式其结果都是空值。。。

13. 在查询结果上连接字符串:select ename||sal from emp;select ename ||?adfdasfdasfjkd? from emp;

14. distinct 关键字用来去掉重复的部分:select distinct deptno from emp;。

15. where,between and ,还有空值的处理, 比如本题中comm 有一部分是空的,那就这样输入:select ename , sal, comm. from emp where comm. is null( is not null); 千万不要输如comm = null 这样不识别。

16. in 关键字,对于一次性查询多条记录可用,如:select ename , sal, comm. from emp where sal in (800,1500,3000); 。对于字符串要加单引号如:where ename in (?SIMTH?,?CLARK?,?KING?); 。可以对in 加not 表示除了这个之外的。。

17.日期处理,查询日期大于1981年2月22日的人,目前我们学会的查询方法为:select ename, sal , hiredate from emp where hiredate > …22-2月-81?; 。

18. like关键词,用于模糊匹配,select ename from emp where ename like …%ALL%?; 常见的通配符:* 0个或多个;?0个或一个;+ 1个或多个;_一个字符。如果要是需要查询出来有特殊字符的字符串,记得用转义字符\ ,也可以自己定义转义字符select ename from emp where ename like …%$%%?escape …$? ; 。默认的转义字符是\ , 自己定义也行。。。。

19.升序降序排列,select * from dept order by deptno asc;。(ascend的缩写) 降序desc (descend的缩写)。。。如果有两个排序,是先排好第一个,然后再在第一个条件相同的时候第二个条件内部排序,如:select ename ,sal ,deptno from emp order by deptno desc , ename desc; 。

20. sql函数,第一个:lower(),取小写,如:select lower(ename) from emp;。还有一个upper函数取大写。Substr(aaaaaa ,2 , 3)函数,截取aaaaaa字符串,从第2个开始截取,一共截取3个。。取字符和ascii码的函数如select chr(65)from dual;。select ascii(’a’)from dual; 。round 四舍五入函数可以有两个参数,round(23.56,2)第二个参数表示取到第几位可以是负值,默认为0.。

21. select to_char( sal , ?$99.999.9999?) from sal; 。把$ 转成L 即可查询出本地货币单位。。。to_char() 还可以对日期的格式进行控制,如:select to_char ( hiredate ,’yyyy-mm-dd hh : mi : ss ’) from emp ;。

22.查询大于某一时刻的所有记录:select hiredate from emp where hiredate > to_date(‘1981-2-20 0:00:00’ , ‘yyyy-mm-dd hh24 : mi : ss ’ );。

查询大于某一数字的所有记录:select sal from emp where sal > to_number(‘$1,300.00’ , ‘$99,999.99’ );。

计算总工资,注意comm有空值的处理,select sal*12 + nvl(comm. ,0 ) from emp ; 。

23. 五个必须记住的组函数:max() , min() , avg() , sum(), count()。。。。如:count(ename)count (comm)。。。。。求一共有几个部门:select count ( distinct deptno ) from emp; 。

24. group by 关键字,求每一个部门的平均工资:select deptno , avg(sal) from emp group by deptno;。按照工作和部门号分组查询:select deptno , job max(sal ) from emp group by deptno , job;。

24 .having语句,对分组后的语句进行过滤,(where 只能对单条语句过滤)求出平均工资大于2000的部门恨平均工资:select depeno ,avg(sal) from emp group by deptno having avg(sal) > 2000;。

25.单条select 语句总结:select avg(sal)from emp

where sal> 1200

group by deptno

having avg(sal) > 1500

order by desc ;。

26. 子查询:查出谁的薪水最高,注意一点:如果用max(sal) 只能得到一个结果,而如果有两个人都是最高的怎么办呢?这就需要下面的查询:select ename,sal from emp where sal=(select max(sal) from emp);求出分组之后各个组的最高薪水,分析一下,如果这样写:select ename, sal from emp where sal in (select max(sal) from emp group by deptno); 我测试了,能查出数据,但是逻辑不对,查询结果中只要在子查询中就会被选出来;所以正确的查询如下:select ename , sal from emp join (select max(sal) as max_sal deptno from emp group by deptno) as t on (emp.sal = t.max_sal and emp.deptno = t.deptno);

27.求出每个人的经理人的名字,已经知道在emp表中只有每个人的名字对应的经理人的编号,不可能只从emp 表中就能取出。所以用到“自连接”即建立两张同样的表:select e1.ename , e2.ename from emp e1 , emp e2 where e1.mgtr = e2.empno ; 。

28.sql 1999 的几个语法,cross 表示求交叉积,select ename ,dname from emp,.dept; = select ename, dnaem from emp cross join dept; 。。对于where语句的连接中,在1999标准里放到了新的位置:如:select ename ,dname from emp join dept on(emp.deptno = dept.deptno) ; 。

30. 一个综合查询的例子:select ename , dname ,grade from emp e join dname d on (e.deptno = d.peptno) join salgrade s on ( e.sal between s.losal and hisall) where ename not like …_A%? ; 。

31.左外连接,右外连接:left outer join ;right join ;全外连接,full join 。。。

32. -----求部门中哪些人的薪水最高:select ename ,sal from emp

join(select deptno , max(sal ) max_sal from emp group by deptno) t

on(emp.deptno = t.deptno and emp.sal = t.max_sal); 。。。

-----求各个部门平均薪水的等级:select deptno ,grade , avg_sal from

(select deptno ,avg(sal) avg_sal from emp group by deptno ) t

join salgrade s on (t.avg_sal between s.losal and s.hisal ); 。

----- 求各个部门平均的薪水等级:

select deptno,avg(grade) from

(select deptno ,ename ,sal, grade from emp

join salgrade s on(emp.sal between s.losal and s.hisal))

group by deptno; 。。

-----求哪些人是经理人:

select ename from emp where empno in (select distinct mgr from emp); 。。

不用组函数求出最高薪水:

select distinct sal from emp where sal not in (select distinct e1.sal from emp e1 join emp e2 on(e1.sal< e2.sal)); 。。

-----求平均薪水最高的部门的部门编号和平均薪水值:

select deptno ,avg_sal from

(select deptno,avg(sal) avg_sal from emp group by deptno)

where avg_sal = (select max( avg_sal )from (select deptno ,avg(sal) avg_sal from emp

group by deptno) ); 。。。

------求平均薪水最高的部门的部门名称和部门编号:

select dname ,deptno from dept where( deptno =

(select deptno from

(select avg(sal) avg_sal ,deptno from emp group by deptno)

where ( avg_sal = (select max(avg_sal) from

(select avg(sal) avg_sal ,deptno from emp group by deptno))))); 。

-----求平均薪水的等级最高的部门的部门名称和部门编号:

select dname ,deptno from dept where deptno =

(

select deptno from

(select avg_sal ,grade , deptno from

(select avg(sal) avg_sal ,deptno from emp group by deptno) t

join salgrade s on (t.avg_sal between s.losal and s.hisal)

)

where

grade = (select max(grade) from

(select avg_sal ,grade , deptno from

(select avg(sal) avg_sal ,deptno from emp group by deptno) t

join salgrade s on (t.avg_sal between s.losal and s.hisal)))

)

-----部门经理人中平均薪水最低的部门名称:(自己思考题)

-----比普通员工的最高薪水还要高的经理人名称:

select ename from emp join (

empno ,sal from emp where

sal >(select max(sal) from emp where empno not in

(select distinct mgr from emp where mgr is not null))

and empno in (select mgr from emp where mgr is not null )) t

on(emp.empno = t.empno)

-----求薪水最高的前5名雇员:(有个隐藏的行,rownum 但是只能用< = 不能用大于等于之类的,如果非要用,那就只能用一个子查询。)

select ename,sal from

(select ename,sal from emp order by sal desc )

where rownum < 5

33. 创建新的视图(一般用v$开头,不过不用也一样,我试了):create view v$_dept_avg_sal_info as

select deptno,grade,avg_sal from

(select avg(sal) avg_sal ,deptno from emp group by deptno) t

join salgrade s on (t.avg_sal between s.losal and s.hisal);

34.在当前用户下备份表:create table salgrade2 as select * from salgrade;。。

35、约束条件是一个对象,可以为其取名字constraint(英文缩放的意思)后面加约束名字。有非空约束,唯一约束(unique)

总的来说有五种:唯一性和主键约束、外键约束、检查约束、空值约束、默认值约束,

有五大关键词,UNIQUE和Primary Key, Foreign Key, CHECK, NOT NULL, DEFAULT

36、修改表结构:alter table emp drop (empno);

alter table emp add (empno number(4));

alter table emp modify (empno number(8));

也可以添加和删除约束条件。

37、当前用户下有哪些表名:select table_name from user_tables;哪些视图:select view_name from user_views 约束名:select constraint_name from user_constraints

38、oracle 中有一张存储数据字典表的表,叫dictiionary 里面就只有两个列:分别是table_name 数据字典表的名字;另一个是commons

39、创建索引:create index idx_emp_name on emp(name)

40、第一范式:1、第一条要有主键

第二范式:

41、oracle 中的循环语句。找出来。。。1、游标的定义:cursor cursor_name is select_statement; 2、为查询打开游标:open cursor_name; 3、取得结果放入pl/sql变量中:fetch cursor_name into pl/sql_record; 4、关闭游标:close cursor_name;

42、oracle 的后台进程包括pmon,smon ,dbwr ,lgwr,ckpt,arc0,cjq0.。。

43、 oracle通过数据字典表dba_sys_privs这个表来记录user被赋予的系统权限,比如我们现在执行SQL>grant select any table to test1; -- 把select any table的权限赋予test1这个用户Grant succeeded SQL>

select * from dba_sys_privs where grantee = 'TEST1'; GRANTEE PRIVILEGE ADMIN_OPTION ------------------------------ ---------------------------------------- ------------ TEST1 SELECT ANY TABLE NO 这里就可以查询到这个记录了。

44、dba_users数据字典,包含如下内容。

username

User_id

Password

Account_status

Lock_date

Expiry_date

Default_tablespace

Created

Profile

Initial_rsrc_consumer_group

Exiernal_name

45、oracle用户的锁定与解锁,锁定用户的方法:

SQL> alter user test account lock;

用户已更改。

-------test用户登陆数据库,失败了。

C:\>sqlplus test/test

ERROR:

ORA-28000: the account is locked

解锁的方法:

SQL> conn /as sysdba

SQL> alter user test account unlock;

用户已更改。

给用户加锁就是不让被加锁的用户连接数据库。

46、修改用户的默认表空间:alter user user_name default tablespace tbs_name;

设置数据库默认的临时表空间:alter database default temporary tablespace temp_tbs-name;

47、查看用户用户的系统权限:授予用户权限,收回权限。。。

48、对象权限:用户对其他用户的数据对象的操作权限。如select、update、insert、delete、all........

系统权限:用户对数据库的权限,如create tables、create databases、create index、create plsql、登陆数据库,修改密码....

权限的传递:

对象权限传递:grant select on emp(tableName) to zhangsan(userName) grant with option;此时zhangsan 可以将select权限传递给其他user。

系统权限传递:grant connect to zhangsan with admin option;

系统权限和对象权限传递的区别是:回收权限时系统权限回收会株连。对象权限不会。

为用户授予对象权限:收回对象权限:

49、pl/sql语言学习:begin

dbms_output.put_line('HelloWord');

end;

/

这样还不能输出,因为默认情况下serveroutput 是off状态的,需要执行下列语句:set serveroutput on;在执行begin dbms_output.put_line('HelloWord');

end;

/

其结果就可以打印出HelloWord。

50、绑定变量:1)定义变量:variable x number;

2)执行变量赋值:exec :x :=7790;

3)条件等于:x 例句:select ename from emp where empno = :x;

51、创建存储过程:

create or replace procedure proc

as

begin

for i in 1..1000

loop

execute immediate

'insert into t values (:x)' using i;

end loop;

end;

/

52、pl/sql 中的循环语句:while i< 10 loop

Dbms_output.put_line(i)

i := j + 1 ;

end loop;

for k in 1.. 100

loop

dbms_output.put_line(k)

end loop;

53、最近因为学习需要安装了Oracle10g装好后,在服务哪里找不到一个服务!

于是经本人多次试验终于把那5个服务弄出来了:假如一个服务都没有的话,那就是再装Or a c l e 时没装数据库,这个原因很奇怪,同一个安装源,在某些机子里就能完全装好,我的在虚拟机装就全部装好了,在外部机子装就没有服务!

1、这时你就在开始菜单找到Da t a ba s e C on f i g u r a t i o n A s s i st a n t这个选项,新建一个数据库这样的话就会增加3个服务,

--O r a c l eJ o b Sc h e du l er O R C L--O r a c l e D BC o n s o l e or c l--O r a c l eS er v i c e O R C L

2、在开始菜单中找到附件--命令提示符--打上l s n r c t l s t a r t按回车,再打上n et st a r t

o r a c l e s er v i c e or c l按回车,又可以增加一个监听服务--O r a c l e Or a Db10g_h om e1T N S L i st en er

3、在打上i s q l p l u sc t l st a r t可以增加这个Or a c l e Or a D b10g_h om e1i S Q L*P l u s

这样5个服务就都有了!!

oem打不开,需要做如下操作:set oracle_sid=oracle

Emctl start dbconsole

启动:管理工具--> 服务中OracleOraDb10g_home1TNSListener (如果不启动,ie 会很慢,且无法连接到数据库)

54、创建一个带有各项参数的表:create table kcb

( kch char(3) not null primary key,

kcm char(16) not null,

kkxq number(1) null,

xs number(2) null,

xf number(1) not null

)

pctfree 10 pctused 40 initrans 1 maxtrans 255

storage( initial 64k minextents 1 pctincrease 40

freelists 1 freelist groups 1);

55、oracle中的merge语句:如果已存在的列,则执行一个update操作,如果未存在,则执行一个insert 操作。

56、回顾一下最基本的几个语句:取别名:select xm as 姓名,xh as 学号

From xsb;

消除重复行:select distinct zy as 专业

From xsb;默认值是all 也就是全部显示,可以写成select all zy as 。。。。也可以不写。

57、例:查找课程号206的成绩不低于课程号101的最低成绩的学生学号:

Select xh from cjb

Where kch = 206 and cj > any (

Select cj from cjb

Where kch = ‘101’);

不低于最低,不高于最高分别用> any ; < any

低于最低,高于最高分别用< all ; > all 记住这类的。

58、相关子查询与不相关子查询,不相关子查询一看就懂,不说了。相关子查询比较重要,也比较难学,举个

例子加深印象。注意:相关子查询中的子查询不能是完整的语句,否则逻辑上是错误的如:(select * from T1 where not exists(select T2.TestID from T2 , T1 where T2.TestID=T1.TestID)

语法正确,逻辑错误。

红色部分是单独的语句,执行总是有结果,所以not exists总是False,所以结果是空。)

select * from T1 where not exists (select TestID from T2 where T2.TestID=T1.TestID)

正确,但是单独的子查询如下:

5)

select TestID from T2 where T2TestID=T1.TestID

语法错误。是相关子查询,子查询部分不能作为单独语句执行。

59、参数文件:init.ora文件,服务器参数文件spfile.ora 站点标识符SID

Sql_trace timed_statistiics tkprof

A、推导参数(derived parameters):select name,value from v$parameter where name

in('processes','sessions');解释:processes参数代表oracle并发连接的数目,合理设置很重要,

超过了最大进程数,连dba自己也进不去了,我自己的默认是150个。哈哈。。不过可以改:alter

system set processes= 500 scope = spfile;重启后即可看到修改的值。

B、操作系统的依赖参数如:db_cache_size

C、可变参数:包含绝大多数影响数据库性能的可调整的参数,一般包括设置限制条件如:open

cursos 和设置大小两类

59、跟踪文件:查询跟踪文件的位置:show parameter dump_dest 或者查询视图:select

name ,value from v$parameter where name like '%dump_dest%'

bdump中有alert文件,和一些后台进程的trace file

udump中一般放置sql trace之后session的trace文件

cdump一般放置一些核心的trace文件

adump一般是audit dump(转储)

bdump是background dump

udump是user dump

cdump是core dump

bdump文件下放着的是数据库的预警文件,如果数据库出问题,该文件是DBA要查看的

首选文件。pfile文件下放着的自然是数据库的初始化参数文件。udump文件下放着的是用

户进程跟踪文件,用于收集客户应用的SQL语句的统计信息。

应该可以删除。

不过记得你的初始化参数文件是用另一个文件SPFILE,要不然就不行咯。

60、Oracle中,一个Delete操作的流程

删除(DELETE)

1.Oracle读Block到Buffer Cache(如果该Block在Buffer中不存在)

2.在redo log buffer中记录delete操作的细节

3.在相应回滚段段头的事务表中创建一个undo条目

4.把将要删除的记录创建前镜像,存放到Undo Block中

5.在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty

提交(COMMIT)

1.Oracle产生一个SCN

2.在回滚段事务表中标记该事务状态为commited

3.LGWR Flush Log Buffer到日志文件

3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)

4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。

61、set verify off

关于变量是否显示改变时的新旧状态

当在sqlplus中运行的sql语句中有替代变量(以&或&&打头)的时候,

set verify(或ver) on/off可以设置是否显示替代变量被替代前后的语句。

如:

SQL> set ver on;

SQL> select * from dual where 1=&var;

Enter value for var: 1

old 1: select * from dual where 1=&var

new 1: select * from dual where 1=1

DU

--

X

而如果设为off,则显示如下:

SQL> set ver off;

SQL> select * from dual where 1=&var;

Enter value for var: 1

DU

--

X

使用以&和&&开头的替代变量的前提是set define on;(这是缺省状态)。

set echo on:显示文件中的每条命令及其执行结果;

set echo off:不显示文件中的命令,只显示其执行结果。

term命令:

当和SPOOL命令联合使用时,可以取消SQLPLUS输出,查询结果仅仅存在于假脱机文件中

set term on:查询结果既显示于假脱机文件中,又在SQLPLUS中显示;

set term off:查询结果仅仅显示于假脱机文件中。

62、analyze index **** validate structure ——分析是否要重建索引,或者索引块有没有坏。分析完后index_stats 就有结果了,你可以根据index_stats中的结果来分析是否要rebuild索引

Analyze index **** compute statistics ——收集统计数据。

在analyze index 的时候需要两个命令,分别是analyze index index_name validate structure. 和analyze index index_name compute statistics

Analyze index validate structure 命令, analyze index index1 validate structure:是用来分析索引的数据块是否有坏块,以及根据分析得到的数据(存放在index_stats)來判断索引是否需要重新建立。

什么样的index需要rebuild?

当一个table经常进行DML操作时,它的索引会存在许多block空间的浪费,这是因为index block中的记录只有在全部表示为不可用时,block 才能被加入到freelist中去被重新利用。所以我们需要寻找那些浪费空间很严重的index。

方法是: 1) analyze index index_name validate structure;

2) select del_lf_blk_len/lf_blk_len from index_stats where name = :index_name;

3) 如果结果大于20%,那你的Index就可以被rebuild了。

validate structure有二中模式:online, offline,默认是offline模式。以offline模式分析时,会對表加一个4级別的锁(表共享),对run系統可能造成一定的影响。

而online模式则没有表lock的影响,但当以online模式分析时,在视图index_stats没有统计信息。

analyze index index1 compute statistics:是用来统计index的分析信息,来为CBO服务的。从9i开始,Oracle 以建议使用dbms_stats package代替analyze 了。

相关主题
文本预览
相关文档 最新文档