当前位置:文档之家› oracle笔记完整版

oracle笔记完整版

oracle笔记完整版
oracle笔记完整版

一、客户端

1. Sql Plus(客户端),命令行直接输入:sqlplus,然后按提示输入用户名,密码。

2. 从开始程序运行:sqlplus,是图形版的sqlplus.

3. http://localhost:端口号/数据库实例

二、更改用户

1. sqlplus sys/密码as sysdba

2. alter user scott account unlock;(解锁账号)

三、table structure

(系统自带的表有emp、salgrade、dept、bonus、dual)

1. 描述某一张表:desc 表名

2. select * from 表名

四、select 语句:

1.计算数据可以用空表:比如:.select 2*3 from dual

2.select ename,sal*12 annual_sal from emp;与select ename,sal*12 "annual sal" from emp;

区别:加双引号保持原大小写,不加全变大写。

任何含有空值的数学表达式结果都为空值。

3. select ename || ‘abcd’

|| 用来连接两个字符串

如果连接字符串中含有单引号,用两个单引号代替一个单引号。

第五课:distinct

select deptno from emp;

select distinct deptno from emp;

select distinct deptno ,job from emp

去掉deptno,job两者组合的重复。更多的项,就是这么多项的组合的不重复组合。第六课:Where

select * from emp where deptno =10;

select * from emp where deptno <>10;不等于10

select * from emp where ename ='bike';

select ename,sal from emp where sal between 800 and 1500 (>=800 and <=1500)

空值处理:

select ename,sal,comm from emp where comm is (not) null;

select ename,sal,comm from emp where ename ( not)in ('smith','king','abc');

模糊查询like :

%代表任意数量的任意字符

_代表一个任意字符

select ename from emp where ename like '_A%';

如果要查询含有%的,要用转义字符\

转义字符可以自定义:escape '自定义的转义字符' 比如:

select ename from emp where ename like '%$a%' escape '$';

第七课: order by

select * from dept;

默认按升序(asc)排列,要按降序(desc)用如下语句:

select * from dept order by dept desc;

select ename,sal,deptno from emp order by deptno asc,ename desc;

第八课: sql function1:

select ename,sal*12 annual_sal from emp

where ename not like '_A%' and sal>800

order by sal desc;

select lower(ename) from emp;

select ename from emp

where lower(ename) like '_a%';等同于

select ename from emp where ename like '_a%' or ename like '_A%';

select substr(ename,2,3) from emp;从第二个字符开始截,一共截三个字符.

select chr(65) from dual 结果为:A

select ascii('a') from dual 结果为:65

select round(23.652,1) from dual; 结果为: 23.7(第二个参数为指定四舍五入到哪位数)select round(23.652,-1) from dual; 20

select to_char(sal,'$99,999,999') from emp;(用9就可以在没有数字的地方不显示,如果用0的话一定会用0填充满)

select to_char(sal,'L99_999_999') from emp; L:代表本地符号

这个需要掌握牢:

select hiredate from emp;

显示为:

BIRTHDATE

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

17-12月-80

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

改为:

select to_char(hiredate,'YYYY-MM-DD HH:MI:SS') from emp;

显示:

BIRTHDATE

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

1980-12-17 12:00:00

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

select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; //也可以改为:HH12

TO_CHAR(SYSDATE,'YY

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

2007-02-25 14:46:14

to_date函数:

select ename,hiredate from emp where hiredate > to_date('1981-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');

如果直接写birthdate>'1981-2-20 12:34:56'会出现格式不匹配,因为表中的格式为: DD-MM月-YY.

select sal from emp where sal>888.88 无错.但

select sal from emp where sal>$1,250,00;

会出现无效字符错误.

改为:

select sal from emp where sal>to_number('$1.250.00','$9,999,99');

把空值改为0

select ename,sal*12+nvl(comm,0) from emp;

作用:把comm为空的地方用0代替,这样可以防止comm为空时,sal*12相加也为空的情况.

第九课: Group function 组函数(即从多行中得到一个输出)

牢记组函数:max(), min(), avg(), sum(), count()

select to_char(avg(sal),'99999999,99') from emp;

select round(avg(sal),2) from emp;

结果:2073.21

select count(*) from emp where deptno=10;

select count(ename) from emp where deptno=10; count某个字段,如果这个字段不为空就算一个.

select count(distinct deptno) from emp;

select sum(sal) from emp;

第十课: Group by语句

注意:count() 是计数不是空值的数量

需求:现在想求每个部门的平均薪水.

select avg(sal) from emp group by deptno;

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

select deptno,job,max(sal) from emp group by deptno,job;

求薪水值最高的人的名字.

select ename,max(sal) from emp;出错,因为max只有一个值,但等于max值的人可能好几个,不能匹配.

应如下求:

select ename from emp where sal=(select max(sal) from emp);

Group by语句应注意,

出现在select中的字段,如果没出现在组函数中,必须出现在Group by语句中.

第十一课: Having 对分组结果筛选

Where是对单条纪录进行筛选,Having是对分组结果进行筛选.

select avg(sal),deptno from emp

group by deptno

having avg(sal)>2000;

查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.

select avg(sal) from emp

where sal>1200

group by deptno

having avg(sal)>1500

order by avg(sal) desc;

第十二课:子查询

谁挣的钱最多(谁:这个人的名字, 钱最多)

select 语句中嵌套select 语句,可以在where,from后.

问那些人工资,在平均工资之上.

select ename,sal from emp where sal>(select avg(sal) from emp);

查找每个部门挣钱最多的那个人的名字.

select ename ,deptno from emp where sal in (select max(sal) from ename group by deptno) 查询会多值.

应该如下:

把select max(sal),deptno from emp group by deptno;当成一个表.语句如下:

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

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

每个部门的平均薪水的等级.

分析:首先求平均薪水(当成表),把平均薪水和另外一张表连接.

第十四课:self_table_connection

把某个人的名字以及他的经理人的名字求出来(经理人及这个人在表中同处一行)

分析:首先求出这个人的名字,取他的编号,然后从另一张表与其相对应编号,然后找到经理的名字.

select e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr= e2.empno.

empno编号和MGR都是编号.

第十15课: SQL1999_table_connections

select ename, dname,grade from emp e,dept d, salgrade s

where e.deptno = d.deptno and e.sal between s.losal and s.hisal and

job <> 'CLERK'

有没有办法把过滤条件和连接条件分开来? 出于这样考虑,Sql1999标准推出来了.有许多人用的还是

旧的语法,所以得看懂这种语句.

select ename,dname from emp,dept;(旧标准).

select ename,dname from emp cross join dept;(1999标准)

select ename,dname from emp,dept where emp.deptno=dept.deptno (旧)

select ename,dname from emp join dept on(emp.deptno = dept.deptno); 1999标准.没有Where语句.

select ename,dname from emp join dept using(deptno);等同上句,但不推荐使用.

select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal);

join 连接语句, on过滤条件。连接,条件一眼分开。如果用Where语句较长时,连接语句和过滤语句混在一起。

三张表连接:

slect ename,dname, grade from

emp e join dept d on(e.deptno=d.deptno)

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

where ename not like '_A%';

把每张表连接条件不混在一起,然后数据过滤条件全部区分开来。读起来更清晰,更容易懂一点。

select e1.ename,e2.ename from emp e1 join emp e2 on(e1.mgr = e2.emptno);

左外连接:会把左边这张表多余数据显示出来。

select e1.ename,e2,ename from emp e1 left join emp e2 on(e1.mgr =e2.empno);left 后可加outer

右外连接:把右边这张表多余数据显示出来。

select ename,dname from emp e right outer join dept d on(e.deptno =d.deptno); outer可以取掉。

全外连接:即把左边多余数据,也把右边多余数据拿出来,

select ename,dname from emp e full join dept d on(e.deptno =d.deptno);

PS:所谓的“外”连接,即把多余的数据显示出来。Outer关键字可以省略

16-23

求部门中哪些人的薪水最高:

select ename, sal from emp

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

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

A.求部门平均薪水的等级。

select deptno,avg_sal,grade 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)

B. 求部门平均薪水的等级

select deptno, avg(grade) from

(select deptno, ename, grade from emp join salgrade s on

(emp.sal between s.losal and s.hisal)) t

group by deptno

C.那些人是经理

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

更高效率的写法:select ename from emp where empno in(select distinct mgr from emp);

D.不准用组函数,求薪水的最高值(面试题)

select distinct sal from emp where sal not in(

select distinct e1.sal from emp e1 join emp e2 on (e1.sal

E.平均薪水最高的部门编号

select deptno,avg_sal 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)

)

F.平均薪水最高的部门名称

select dname 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 deptno,avg_sal from

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

where avg_sal =

(select max(avg(sal)) from emp group by deptno)

组函数最多嵌套两层

G.求平均薪水的等级最低的部门的部门名称

分析:

首先求

1.平均薪水:select avg(sal) from group by deptno;

2.平均薪水等级:把平均薪水当做一张表,需要和另外一张表连接salgrade 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)

上面结果又可当成一张表。

DEPTNO GRADE A VG_SAL

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

30 3 1566.66667

20 4 2175

10 4 2916.66667

3.求上表平均等级最低值

select min(grade) from

(

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.hisa)

)

4.把最低值对应的2结果的那张表的对应那张表的deptno, 然后把2对应的表和另外一张表做连接。

select dname ,t1.deptno,grade,avg_sal from

(

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)

) t1

join dept on (t1.deptno = dept.deptno)

where t1.grade =

(

select min(grade) from

( 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))

)

结果如下:

DNAME DEPTNO GRADE A VG_SAL

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

SALES 30 3 1566.6667

H: 视图(视图就是一张表,一个子查询)

G中语句有重复,可以用视图来简化。

【默认scott账户没有创建视图的权限,可通过如下语句授权:

首先登陆超级管理员:conn sys/bjsxt as sysdba;

授权:grant create table,create view to scott;

再以scott账户登陆:conn scott/tiger

创建视图:

create view v$_dept_avg-sal_info as

select deptno,grade,avg_sal from

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

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

然后G中查询可以简化成:

select dname,t1.deptno,grade,avg_sal from

v$_dept_avg-sal_info t1

join dept on (t1.deptno =dept.deptno)

where t1.grade =

(select min(grade) from v$_dept_avg-sal_info t1)

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

select ename, sal from emp where empno in

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

and sal >

(

select max(sal) from emp where empno not in

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

)

25、---面试题:比较效率(理论上前一句效率高,但实际上可能Oracle可能会自动对代码优化,所以不见得后一句就会慢)

select * from emp where deptno = 10 and ename like '%A%'; //效率高,因为将过滤

力度大的放在前面select * from emp where ename like '%A% and deptno = 10;

-------------------------------------------以上为select 语句的内容-----------------------------------------

----------------创建新用户---------------

1、backup scott//备份

exp//导出

2、create user

create user guohailong identified(认证) by guohailong default tablespace users quota(配额) 10M on users

grant create session(给它登录到服务器的权限),create table, create view to guohailong

3、import data

Imp

25、----------取消操作--------

rollback

-----------事务确认语句--------

commit;//此时再执行rollback无效

当正常断开连接的时候例如exit,事务自动提交。当非正常断开连接,例如直接关闭dos窗口或关机,事务自动提交

-----表的备份

create table dept2 as select * from dept;

-----插入数据

insert into dept2 values(50,'game','beijing');

----只对某个字段插入数据

insert into dept2(deptno,dname) values(60,'game2');

-----将一个表中的数据完全插入另一个表中(表结构必须一样)

insert into dept2 select * from dept;

-----求前五名员工的编号和名称(使用伪字段rownum 只能使用< 或= 要使用> 必须使用子查询)

select empno,ename from emp where rownum <= 5;

----求10名雇员以后的雇员名称--------

select ename from (select rownum r,ename from emp) where r > 10;

----求薪水最高的前5个人的薪水和名字---------

select ename, sal from (select ename, sal from emp order by sal desc) where rownum <=5;

----求按薪水倒序排列后的第6名到第10名的员工的名字和薪水--------

select ename, sal from

(select ename, sal, rownum r from

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

)

where r>=6 and r<=10

-----面试题:有3个表S,C,SC

S(SNO,SNAME)代表(学号,姓名)

C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)

SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)

问题:

1,找出没选过“黎明”老师的所有学生姓名。

2,列出2门以上(含2门)不及格学生姓名及平均成绩。

3,即学过1号课程有学过2号课所有学生的姓名。

答案:

1、

select sname from s join sc on(s.sno = sc.sno) join c on (https://www.doczj.com/doc/d112210005.html,o = https://www.doczj.com/doc/d112210005.html,o) where cteacher

<> '黎明';

2、

select sname where sno in (select sno from sc where scgrade < 60 group by sno having count(*) >=2);

3、

select sname from s where sno in (select sno, from sc where cno=1 and cno in

(select distinct sno from sc where cno = 2);

)

27、--------------创建表--------------

create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50) unique

);

28、五种约束条件:非空约束、唯一约束、主键约束、外键约束、检查约束(check)

--------------给name字段加入非空约束,并给约束一个名字,若不取,系统默认取一个-------------

create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50)

);

--------------给nameemail字段加入唯一约束两个null值不为重复------------- create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50) unique

);

--------------两个字段的组合不能重复约束:表级约束------------- create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50),

constraint stu_name_email_uni unique(email, name)

);

29、--------------主键约束-------------

create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar2(50),

constraint stu_id_pk primary key (id),

constraint stu_name_email_uni unique(email, name)

);

--------------外键约束被参考字段必须是主键------------- create table stu

(

id number(6),

name varchar2(20) constraint stu_name_mm not null,

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4) references class(id),

email varchar2(50),

constraint stu_class_fk foreign key (class) references class(id),

constraint stu_id_pk primary key (id),

constraint stu_name_email_uni unique(email, name)

);

红色为字段约束的写法,蓝色为表级约束的写法

create table class

(

id number(4) primary key,

name varchar2(20) not null

);

31、修改表结构:

---------------添加字段--------------------------

alter table stu add(addr varchar2(29));

---------------删除字段--------------------------

alter table stu drop (addr);

---------------修改表字段的长度------------------

alter table stu modify (addr varchar2(50));//更改后的长度必须要能容纳原先的数据

----------------删除约束条件----------------

alter table stu drop constraint 约束名

-----------修改表结构添加约束条件---------------

alter table stu add constraint stu_class_fk foreign key (class) references class (id);

32、---------------数据字典表(有user_tables、user_views、user_constraints等等)----------------

---------------查看当前用户下面所有的表、视图、约束-----数据字典表user_tables---

select table_name from user_tables;

select view_name from user_views;

select constraint_name from user_constraints;

存储数据字典表的信息的表:dictionary;

//该表共有两个字段table_name comments

//table_name主要存放数据字典表的名字

//comments主要是对这张数据字典表的描述

33、-------------索引(能优化查询效率)------------------

create index idx_stu_email on stu (email);// 在stu这张表的email字段上建立一个索引:idx_stu_email

---------- 删除索引------------------

drop index index_stu_email;

---------查看所有的索引----------------

select index_name from user_indexes;

---------创建视图-------------------

create view v$stu as selesct id,name,age from stu;

视图的作用: 简化查询,保护我们的一些隐私数据,通过视图也可以用来更新数据,但

是我们一般不这么用

缺点:要对视图进行维护

34、-----------创建序列(sequence,oracle特有的东西,一般用来做主键)------------

create sequence seq;//创建序列

select seq.nextval from dual;// 查看seq序列的下一个值

drop sequence seq;//删除序列

35、------------数据库的三范式--------------

(1)、要有主键,列不可分

(2)、不能存在部分依赖:当有多个字段联合起来作为主键的时候,不是主键的字段不能部分依赖于主键中的某个字段

(3)、不能存在传递依赖

=======================PL_SQL(过程化SQL语言)==========================

38、-------------------在客户端输出helloworld-------------------------------

set serveroutput on;//默认是off,设成on是让Oracle可以在客户端输出数据

begin

dbms_output.put_line('helloworld');

end;

/

----------------pl/sql变量的赋值与输出----

declare

v_name varchar2(20);//声明变量v_name变量的声明以v_开头

begin

v_name := 'myname';

dbms_output.put_line(v_name);

end;

/

39、-----------pl/sql对于异常的处理(除数为0)-------------

declare

v_num number := 0;

begin

v_num := 2/v_num;

dbms_output.put_line(v_num);

exception

when others then

dbms_output.put_line('error');

end;

/

40、----------变量的声明----------

binary_integer:整数,主要用来计数而不是用来表示字段类型比number效率高

number:数字类型

char:定长字符串

varchar2:变长字符串

date:日期

long:字符串,最长2GB

boolean:布尔类型,可以取值true,false,null//最好给一初值

----------变量的声明,使用'%type'属性---------

declare

v_empno number(4);

v_empno2 emp.empno%type;

v_empno3 v_empno2%type;

begin

dbms_output.put_line('Test');

end;

/

//使用%type属性,可以使变量的声明根据表字段的类型自动变换,省去了维护的麻烦,而且%type属性,可以用于变量身上

41、组合变量:

---------------Table变量类型(相当于java里面的数组)------------------------------------------- declare

type type_table_emp_empno is table of emp.empno%type index by binary_integer;

v_empnos type_table type_table_empno;

begin

v_empnos(0) := 7345;

v_empnos(-1) :=9999;

dbms_output.put_line(v_empnos(-1));

end;

42、-----------------Record变量类型(相当于Java里面的类)--------------------------------------------

declare

type type_record_dept is record

(

deptno dept.deptno%type,

dname dept.dname%type,

loc dept.loc%type

);

v_temp type_record_dept;

begin

v_temp.deptno:=50;

v_temp.dname:='aaaa';

v_temp.loc:='bj';

dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname);

end;

-----------使用%rowtype声明record变量,直接参照表来声明record-------------------

declare

v_temp dept%rowtype;

begin

v_temp.deptno:=50;

v_temp.dname:='aaaa';

v_temp.loc:='bj';

dbms_output.put_line(v temp.deptno || '' || v temp.dname)

end;

43、--------------select语句的运用(必须保证select语句有相应的返回记录)-------------------

declare

v_ename emp.ename%type;

v_sal emp.sal%type;

begin

select ename,sal into v_ename,v_sal from emp where empno = 7369;

dbms_output.put_line(v_ename || '' || v_sal);

end;

---------------------------select语句的应用(record)----------------------------------------

declare

v_emp emp%rowtype;

begin

select * into v_emp from emp where empno=7369;

dbms_output_line(v_emp.ename);

end;

------------- insert语句的应用-----------------------------

declare

v_deptno dept.deptno%type := 50;

v_dname dept.dname%type :='aaa';

v_loc dept.loc%type := 'bj';

begin

insert into dept2 values(v_deptno,v_dname,v_loc);

commit;

end;

------------- update 语句的应用------------------------------

declare

v_deptno emp2.deptno%type := 50;

v_count number;

begin

update emp2 set sal = sal/2 where deptno = v_deptno;

dbms_output.put_line(sql%rowcount || ‘条记录被影响’);

commit;

end;

注:sql%rowcount 统计上一条sql语句更新的记录条数

44、-----------------ddl语言,数据定义语言-----------------------

begin

execute immediate 'create table T (nnn varchar(30) default ''a'')';

end;

------------------if else语句--------------------------------------

declare

v_sal emp.sal%type;

begin

select sal into v_sal from emp where empno = 7369;

if(v_sal < 2000) then

dbms_output.put_line('low');

elsif(v_sal > 2000) then

dbms_output.put_line('middle');

else

dbms_output.put_line('height');

end if;

end;

45、-------------------do while循环---------------------------

declare

i binary_integer := 1;

begin

loop

dbms_output.put_line(i);

i := i + 1;

exit when (i>=11);

end loop;

end;

---------------------while 循环---------------------------

declare

j binary_integer := 1;

begin

while j < 11 loop

dbms_output.put_line(j);

j:=j+1;

end loop;

end;

---------------------for 循环---------------------------

begin

for k in 1..10 loop

dbms_output.put_line(k);

end loop;

for k in reverse 1..10 loop

dbms_output.put_line(k);

end loop;

end;

46、-----------------------异常(1) ---------------------------

declare

v_temp number(4);

begin

select empno into v_temp from emp where deptno = 10;

exception

when too_many_rows then

dbms_output.put_line('太多记录了');

when others then

dbms_output.put_line('error');

end;

-----------------------异常(2) ---------------------------

declare

v_temp number(4);

begin

select empno into v_temp from emp where empno = 2222;

exception

when no_data_found then

dbms_output.put_line('没有该项数据');

end;

----------------错误记录日志(用表记录:将系统日志存到数据库便于以后查看) -----------

创建序列(用来处理递增的ID):

create sequence seq_errorlog_id start with 1 increment by 1;

创建日志表: 记录异常

create table errorlog

(

id number primary key, --id自动递增的,创建一个sequence

errcode number,

errmsg varchar2(1024),

errdate date

);

示例程序:

declare

v_deptno dept.deptno%type := 10;

v_errcode number; --出错代码

v_errmsg varchar2(1024); --出错信息

begin

delete from dept where deptno = v_deptno;

commit;

exception

when others then

rollback;

v_errcode := SQLCODE;

v_errmsg := SQLERRM; -- 关键字

insert into errorlog values (seq_errorlog_id.nextval, v_errcode,v_errmsg, sysdate);

commit;

end;

47、---------------------PL/SQL中的重点cursor(游标)和指针的概念差不多----------------------

declare

cursor c is

select * from emp; //此处的语句不会立刻执行,而是当下面的open c的时候,才会真正去数据库中取数据

v_emp c%rowtype;

begin

open c;

fetch c into v_emp;

dbms_output.put_line(v_emp.ename); //这样会只输出一条数据134将使用循环的方法输出每一条记录

close c;

end;

----------------------使用do while 循环遍历游标中的每一个数据---------------------

declare

cursor c is

select * from emp;

v_emp c%rowtype;

begin

open c;

loop

fetch c into v_emp;

(1) exit when (c%notfound); //notfound是oracle中的关键字,作用是判断是

否还有下一条数据

(2) dbms_output.put_line(v_emp.ename); //(1)(2)的顺序不能颠倒,否则会把

最后一条结果再多打印一次。

end loop;

close c;

end;

------------------------使用while循环,遍历游标---------------------

declare

cursor c is

select * from emp;

v_emp emp%rowtype;

begin

open c;

fetch c into v_emp;

while(c%found) loop

dbms_output.put_line(v_emp.ename);

fetch c into v_emp;

end loop;

close c;

end;

--------------------------使用for 循环,遍历游标(最方便快捷的方法!)--------------------- declare

cursor c is

select * from emp;

begin

for v_emp in c loop

dbms_output.put_line(v_emp.ename);

end loop;

end;

---------------------------带参数的游标(相当于函数)---------------------

declare

cursor c(v_deptno emp.deptno%type, v_job emp.job%type)

is

select ename, sal from emp where deptno=v_deptno and job=v_job;

begin

for v_temp in c(30, 'CLERK') loop

dbms_output.put_line(v_temp.ename);

end loop;

end;

-------------------------可更新的游标-----------------------------

declare

cursor c

is

select * from emp2 for update;

begin

for v_temp in c loop

if(v_temp.sal < 2000) then

update emp2 set sal = sal * 2 where current of c;

elsif (v_temp.sal =5000) then

delete from emp2 where current of c;

end if;

end loop;

commit;

(Oracle数据库管理)玩转实战教程学习笔记最全版

(O管理)玩转实战教程(韩顺平)学习笔记

韩顺平—玩转oracle视频教程笔记 一:Oracle认证,与其它数据库比较,安装 oracle的卸载 1.停止所有与ORACLE相关的服务。 2. 使用OUI(Oracle Universal Installer)卸载Oracle软件。 “开始”->“程序”->“Oracle-OraDb110g_home1|Oracle installation product|Universal installer. 3.删除注册表内容。运行regedit命令,删除下面内容:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE注册表键,删除此键。 HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services,删除Services键下所有以oracle为首的键。 HKEY_LOCAL_MACHINE|SYSTEM|CurrentControlSet|Services|Eventlog|Application,删除此键下所有以oracle为首的键。 HKEY_CLASSES_ROOT,删除此键下所有以Ora,Oracle,Orcl,EnumOra 为前缀的键。 HKEY_CURRENT_USER|Software| Microsoft|Windows|CurrentVersion|Explorer|MenuOrder|Start Menu|Programs,删除此键下所有以oracle为首的键。 HKEY_LOCAL_MACHINE|SOFTWARE|ODBC|ODBCINST.INI注册表键,删除了

oracle数据库笔记001

如果出现协议器出错,我们就用这样的命令: 先用exit跳出sqlplus,再用net start(stop) oracleserviceORCL, 我们在启动oracleserviceORCL 分配的空间我们称之为实例服务,监听服务的启动:命令LSNRCTL START Oracle服务器:oracle实例(内存sid)oracle数据库(物理数据库)多个实例对应一个数据库:ops 和ras(多个sga) 一个实例对应一个数据库:单点数据库(通常情况) 一个实例只能访问一个数据库 Oracle的 Show parameter instance name 查询实例服务 Show parameter db_name 查询查询数据库名字 Select name from v$database 查询数据库名字 Show sga 查询sga 大小 Desc v$tablespace 查询表空间 Spool D:/oracel317.txt 指定文件存放位置执行完之后就要执行spool off Spool off 输出结束 Oracle数据库存储的结构 数据库逻辑结构:实例

数据库物理存储结构:数据文件(data file)控制文件(control file)日志文件(log file)归档文件() 查询数据文件:select name,bytes from v$datafile; 启动一个数据库步骤: (1)申请一个实例 (2)读取控制文件 (3)根据控制文件提供的信息找,关联物理数据库,就能连接数据库 查询各类数据文件夹desc v$datafile ; 数据的操作: 一个表(tablespace)有多个Segment 数据段 一个段(Segment)有多个区(extent) 一个区(extent)有多个块(data block) 数据块(data block)是有多个系统块组成(OS block) 单个表对应单个数据文件 查询select file_name,tablespace 创建表空间:create tablespace testtp datafile ‘d:/testtp01.dbf’size 1m autoextend on next 1m maxsize 10m; 但表空间已存在的时候,会报表空间已存在我们需要增加一个 Alter tablespace testtp add datafile ‘h:/testtp02.dbf’size 10m

oracle笔记(3)

1.用insert语句进行行数据的迁移 Insert into 表名(列,列) select 列,列from emp where 条件 2.用update更新数据(使用子查询):希望员工scott的岗位,工资,补助与smith员工一样? update emp set (job,sal,comm)=(select job,sal,comm. From emp where ename=?SMITH?) where ename=?SCOTT?; 3.事务 (1)锁 (2)提交事务 (3)回退事务(一开始就做保存点(savepoint)) (4)事务的几个重要操作 1)设置保存点:savepoint a 2)取消部分事务:rollback to a 3)取消全部事务:rollback (5)只读事务:set transaction read only(当前用户能看到之前的操作,若其他用户进行更 新,该用户之后的操作都不能看到更新) (6)字符函数 (1)lower(char):将字符串转化为小写的格式 (2)upper(char): 将字符串转化为大写的格式 (3)length(char):返回字符串的长度 (4)substr(char,m,n):取字符串的子串,从m开始取,取n个 (5)例:以首字符大写的方式显示所有的员工的姓名: (1)完成首字母大写:select upper(substr(ename,1,1)) from emp; (2)完成后面字母小写:select lower(substr(ename,2,length(ename)-1)) from emp; (3)合并:select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) from emp; (6)replace(char1,search_string,replace_string) (7)instr(char1,char2,[,n[,m]])—取子串在字符串的位置 (8)例:显示所有员工的姓名,用”我是A”替换所有”A”:select replace(ename,?A?,? 我是A?) from emp; (7)数学函数 (1)round(n,[m]):用于四舍五入 (2)trunc(n,[m]):用于截取数字 (3)mod(m,n):取模 (4)floor(n):返回<=n的最大整数 (5)ceil(n):返回>=n的最小整数 (6)例:显示在一个月为30天的情况所有员工的日薪金,忽略余数:select floor(sal/30),ename from emp; (8)日期函数 (1)sysdate (2)add_months(d,n) (3)last_day(d):返回指定日期所在月份的最后一天 例:返回在八个月前雇佣的员工(已经入职8个月多的员工):select * from emp where sysdate>add_months(hiredate,300); 例:对于每个员工,显示其加入公司的天数:select trunk(sysdate-hiredate) “入职天

ORACLE笔记

1.Oracle 工具:sqlplus Sqlplus / as sysdba Shutdown immediate(关闭数据库) Startup(启动数据库) 注意:数据库开启才可以进行操作 Select username,account_status from dba_users;(查询数据库中所有的用户名称与用户状态) Alter user scott identified by tiger account unlock;(scott用户解锁) Sqlplus scott/tiger(使用SCOTT 密码为tiger登陆ORACLE数据库) Connect scott/tiger (在SQL>中直接使用SCOTT用户连接数据库) Show all;(看所有变量) Set sqlprompt “_user>”(设置sqlplus环境下面的提示符用自身用户显示) 注意:如要变量下次重启生效必须把变量写入 /u01/app/oracle/product/10.2.0/db_1/sqlplus/admin/glogin.sql中 Host(回到系统) Help index(查看所有命令) Help+命令(类似于LINUX中的MAN,查看命令的格式与用法) Disconnect(关闭SQLPLUS工具但是不离开数据库) Describe emp(查看EMP表) Define(定义变量,常用与写脚本用) 如:DEFINE _EDITOR =”vi” (CHAR) (定义VI编辑器用于保存最后一条执行的SQL语句) Save /u01/app/oracle/aa.sql (保存SQL语句) Get /u01/app/oracle/aa.sql (调用保存的SQL语句) 2.select(select 查询语句是ORACLE中最常用的语句) DML语句包括(insert 写入,update改变,delect删除,merge两张表同步) 注意:merge常用在ETL(数据仓库)底下 DDL数据定义语句包括(create创建对象,alter修改,drop删除对象,rename改名,truncate 删除整个表) TCL事务处理语句(commit提交立刻生效,rollback回滚,savepoint保存点,savepoint(保存点) DCL权限语句(grant赋予权限,revoke(收回权限) ORACLE的表称之为堆表(keep table) SELECT (1) writing basic SQL select statemanes 1. selecting all columns SCOTT>select * from dept; SCOTT>select dname,deptno,loc from dept; Basic SELECT Statement SELECT *|{[DISTINCT] column|expression [alias],...} FROM table;

学习oracle数据库的总结(图文整理)

1、在开发环境中连接到数据库,进行基本的select查询操作; 2、熟悉plsql的使用; 3、熟悉sqlplus相关命令(登录、查询、导入导出等) 登录sqlplus: 第一:使用dos窗口登录sqlplus Sqlplus 用户名/密码@数据库实例名 Sqlplus system/密码@数据库实例名as sysdba 第二:使用oracle自带的一个sqlplus登录,提供界面,显得更简单一些。 显示当前用户名:show user; 创建一个用户:create user 用户名identified by 密码; 给用户赋予登录的权限:grant connect to 用户名;(此时才可以使用这个用户来登录这个数据库。)给其赋予dba的权限。 修改用户的密码:alter user 用户名identified by 新密码; 查询: Select * from t_user; Select id from t_user; Select name from t_user; Select birthday from t_user; Select id,name from t_user; 导入导出: 导出表: (注意,导出表的exp命令不是在sqlplus下使用的,是在dos窗口下使用的命令。) exp userid=test/sa@test tables=(qx) file=d:\e1223.dmp exp userid=test/sa@test tables=(t_user,qx) file=f:\test.dmp 导出方案: Exp userid=test/sa@test owner=test file=f:\test2.dmp 导出数据库: Exp userid=test/sa@test full=y inctype=complete file=f:\all.dmp 导入表: 下面以一个例子来说明: 看下面的图,我的用户名test,密码sa,数据库实例名test,所有的表都在这里 现在我执行导出表JD的操作:exp userid=test/sa@test tables=(jd) file=f:\jd.dmp 在我的f盘下就出现了这么一个.dmp文件

oracle学习笔记

●PLSQL控制台输出语句 SET serveroutput ON; --打开控制台输出服务 dbms_output.put_line('values2='||var_val); --输出语句 ●PLSQL动态变量 var_str := '&input'; ●创建表空间和用户 --创建表空间 CREATE TABLESPACE "BCPBS" LOGGING DATAFILE 'D:\app\E430\oradata\orcl\BCPBS_01.ora' SIZE 2048M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED, 'D:\app\E430\oradata\orcl\BCPBS_02.ora' SIZE 2048M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO ; --建立用户 CREATE USER "BCPBS" PROFILE "DEFAULT" IDENTIFIED BY "bcpbs123" DEFAULT TABLESPACE "BCPBS" TEMPORARY TABLESPACE "TEMP" ACCOUNT UNLOCK; GRANT "CONNECT" TO "BCPBS"; GRANT "DBA" TO "BCPBS"; GRANT "RESOURCE" TO "BCPBS"; ●删除表空间和用户 drop user bcpbs cascade ; drop tablespace BCPBS including contents and datafiles cascade constraints ; ●自定义函数 CREATE OR REPLACE FUNCTION fun_level_value(level_value number) RETURN number IS return_value number:=null; BEGIN CASE level_value WHEN 0 THEN return_value:='0'; WHEN 1 THEN return_value:='1'; WHEN 2 THEN return_value:='2'; WHEN 3 THEN return_value:='3'; WHEN 6 THEN return_value:='8'; ELSE

oracle学习心得体会

oracle学习心得 一、sqlserver的理解 sqlserver服务器就像一栋大楼,大楼里的机房就像服务器的数据库,机房里的电脑如同数据库里的表 1、登录用户可以登录服务器——可以进大楼 2、登录用户成为数据库用户才能进指定的数据库——进入大楼的人给了某个机房的钥匙 才能进入机房 3、登录用户有权限使用表——进入机房的人有电脑的密码才能使用电脑 二、oracle的理解 oracle服务器(全局数据库)就像一个商场,商场的每一家公司是表空间,公司的业务是表 1、数据库由多个表空间组成——商场里有多家公司组成 2、表空间由段组成——公司要有自己的经营业务,可以只有一个业务,就是一个表空 间中只有一个段,可以有多个业务,就是一个表空间有多个段 3、段由区组成——单个业务的细分类别。例如有家公司经营三个业务,卖书,卖家电,

卖衣服,则每个业务就是一个段。而每个业务又有细分,比如卖书的话要进行分类了。计算机区,人文区,小说区等,每一区都要放上书架存放书籍,则书架就是oracle块,存放数据的 三、数据库,表空间,用户(指定默认表空间),表统统由管理员管理 四、在oem中管理数据库的步骤 1、创建 1)存储——表空间——创建表空间(tomspace)(类似于在sql中创建数据库, 通常可以省略,使用默认表空间为users,,临时表空间为temp) 2)首先展开安全性——创建新用户(tom,指定表空间)(类似于在sql中指定 数据库用户) 3)创建表——指定方案(用户)和表空间(列名不要带<>) 4)设置约束 5)输入信息:方案——用户名——表——右击——查看/编辑目录… 2、修改 1)方案——用户名——表 2)修改表结构,添加约束

Oracle学习笔记

Oracle的四个主要用户 1.超级管理员sys/change_on_install 2.普通管理员system/manager 3.普通用户scott/tiger 4.大数据用户sh/sh 简单查询 1.查询表结构 DESC 表名 2.简单查询SELECT [DISTINCT] *|[字段 [别名]] [,字段 [别名]] … FROM 表名 [别名] (1)查询时也可以使用四则运算,如:SELECT (字段*x)+y FROM 表名 (2)可以使用“||”连接字段与字符串,如: select '工作与工资:' || job || sal 工作工资 from emp 执行结果: 3.限定查询SELECT [DISTINCT] *|[字段 [别名]] [,字段 [别名]] … FROM 表名 [别名] [WHERE 条件(s)] (1)Where字句后可以增加多个条件,最常见的条件就是最基本关系运算:>、<、>=、<=、!=(<>)、BE TWEEN…AND、LIKE、IN(指定范围)、IS NULL(为空)、AND(且)、OR(或)、NOT(非)。 (2)多个条件可以使用AND与OR连接。 例如:select * from emp where sal>1300 and sal<4000 (3)范围判断BE TWEEN…AND:BETWEEN 最小值 AND 最大值(大于等于最小值,小于等于最大值),BE TWEEN…AND 对数字、日期都可以使用!!! 例如:select * from emp where sal between 1300 and 4000 例如:select * from emp where hiredate between '01-1月-1981' and '31-12月-1981' (4)判断为空IS (NOT) NULL 例如:select * from emp where comm is null 例如:select * from emp where comm is not null 例如:select * from emp where not comm is null (5)指定范围的判断(NOT) IN 例如:select * from emp where empno in(7369,7566,7799)

Oracle数据库期末复习知识点整理

基础知识 表3.2 Oracle数据类型

表3.3 XSB的表结构

操作表 创建表 CREATE TABLE [schema.] table_name ( column_namedatatype [DEFAULT expression] [column_constraint][,…n] [,…n] ) [PCTFREE integer] [PCTUSED integer] [INITRANS integer] [MAXTRANS integer] [TABLESPACE tablespace_name] [STORGE storage_clause] [CLUSTER cluster_name(cluster_column,…n)] [ENABLE | DISABLE ] [AS subquery] 【例】使用CRETE TABLE命令为XSCJ数据库建立表XSB,表结构参照表3.3。 打开SQL*Plus工具,以system方案连接数据库,输入以下语句: CREATE TABLE XSB ( XH char(6) NOT NULL PRIMARY KEY, XM char(8) NOT NULL, XB char(2) DEFAULT '1' NOT NULL, CSSJ date NOT NULL, ZY char(12) NULL, ZXF number(2) NULL, BZ varchar2(200) NULL ); 修改表 ALTER TABLE [schema.] table_name [ ADD(column_namedatatype [DEFAULT expression][column_constraint],…n) ] /*增加新列*/ [ MODIFY([ datatype ] [ DEFAULT expression ] [column_constraint],…n) ] /*修改已有列的属性*/ [ STORAGE storage_clause ] *修改存储特征*/ [ DROP drop_clause ] /*删除列或约束条件*/ 【例】使用ALTER TABLE语句修改XSCJ数据库中的表。

Oracle数据库学习笔记

Oracle数据库学习笔记 作者:高达 第一天: DBMS--数据库管理系统: Date base Manage System 数据模型: (1)层次模型类似于“倒树”型的结构 (2)网状模型 (3)关系模型RDBMS--Relation Date base System 记录和记录之间通过属性之间的关系来进行连接,保证数据独立性,并形成数据集之间的关系。 主键:关键词--PRIMARY KEY 用于行的区分,不会重复。主键可以由两列组成,叫做组合键。主键非空。如果为空则失去实体完整性。 外键:关键词--FOREIGN KEY 外键表示两个表之间的相关联系。外键的范围不能超过主键的范围,如果超过则失去引用完整性。 完整性: 是为保证数据库中数据的正确性和一致性。 (1).实体完整性: 数据行不能存在重复,也不能为空。即PK不重复不为空。

(2).引用完整性: 指建立两个关系建立联系的主外键的约束 1.要求子表中的相关项必须在主表中存在。 2.如果建立了主表和子表的关系,则:a.子表中的相关项目的数据,在主表中必须存在;b.主表中相关项的数据更改了,则子表对应的数据项也应当随之更改;c.在删除子表之前,不能够删除主表。 (3).域完整性: 保证表中数据的合理性 check 检查 default 默认 not null 不为空 unique 唯一约束 (4).自定义完整性: 根据用户需要自己定义。除了上述关键字,可以使用触发器来编写约束。 约束:关键词--CONSTRAINT 在创建表的时候添加约束。 目的: 确保表中数据的完整型 常用约束类型: 主键约束(Primary Key Constraint):要求主键列数据唯一,并且不允许为空。 唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。 检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束。 默认约束(Default Constraint):某列的默认值,如我们的男性学员较多,性别默认为“男”。外键约束(Foreign Key Constraint):用于两表间建立关系,需要指定引用主表的哪列。 不为空(not null):不可以为空。

oracle数据库学习笔记心得

select* |字段表名 from 表名 where 布尔表达式【条件】 externalcandidate 职员相关信息 contractrecruiter 猎头公司 查看表里所有字段 describe[描述] contractrecruiter select cname,nperecentagecharge from contractrecruiter 不显示原来名字,显示现在名字【用AS】 select cname as "Recruiter Name",nperecentagecharge as "Hire Fees" from contractrecruiter 不显示原来名字,显示现在名字【可不用AS】 select cname "Recruiter Name",nperecentagecharge "Hire Fees" from contractrecruiter 【双引号是否写】 双引号是为了区分大小写 职位表 position select *from position 缺额运算:[想减] select VDESCRIPTION , nbudgetedstrength, NBUDGETEDSTRENGTH -NCURRENTSTRENGTH , NYEAR from position

select VDESCRIPTION "Potion", nbudgetedstrength "Budgeted Strength" , NBUDGETEDSTRENGTH -NCURRENTSTRENGTH "Vacancies", NYEAR "Year" from position 显示非重复运行 查询来源地的人数 describe externalcandidate 查看职员城市名字 select ccity from externalcandidate 查看职员城市名字【名字不重复,插入一个关键字:distinct】select distinct ccity,cstate from externalcandidate 运算符: 两列 select vfirstname,vlastname from externalcandidate 字段拼接 select vfirstname||vlastname from externalcandidate select vfirstname||' '||vlastname from externalcandidate 学校 describe college 查看所有学校 select *from college 查看只是加利福尼亚的学校 select * from college where cstate='California' 一个条件 select vfirstname,vlastname,dbirthdate,ntestscore from externalcandidate where dbirthdate>='01-1月-70'

oracle-database-11g-plsql-编程实战笔记

Chap1 DML语句是select 、insert、update、delete和merge DDL语句是create、alter、drop、rename、truncate、comment DCL语句是grant、revoke TCL语句是commit、rollback和savepoint sql16个基本命令——参考书《OCA认证考试指南(IZ0-051)》清华大学出版社 《oracle database sql language reference 11g》有非遵循格式字符串依赖于格式掩码 chap2 2.1.3 关于语句中有多个单引号时处理: 1、 select'It''s a bird,no plan can''t be 'as pharse from dual; 此处两个单引号即为一个单引号 2、只能用q 再加’(语句)’ select q'(It's a bird,no plan can't be)'as pharse from dual; 均输出 PHARSE ---------------------------- It's a bird,no plan can't be 2.1.4 定义变量与申明变量的区别: 定义变量即为变量分配名称并指定数据类型;申明变量首先需要定义变量,然后为其赋值。(赋值也称为初始化) 替代变量前面要加&前缀且若替代变量为字符型时要加两个单引号如’&a’ declare lv_whom varchar2(20);/*lv-whom为申明变量,a为替代变量,a没有变量类型*/ begin lv_whom := '&a'; end; 或者 declare lv_whom varchar2(20); begin lv_whom := &a; end;但是要在输入框中字符加两个单引号 替代变量用define申明,且定义时不可以指定类型,默认为char型 ①Define x=emp; Select * from &x; /*调用要用&,此处不加单引号,解析后即为emp表*/

Oracle知识点总结

Oracle知识点总结 根据阎赫老师讲义整理Zealjiang 1、Oracle数据库的安装和配置 ⑴Oracle Internet级数据库 SQLServer 中小企业级数据库 Access 桌面级数据库 ⑵Oracle的安装 注意:来源和目标的目录不允许有中文或空格 ⑶Oracle数据库启动时必需开启的后台服务 ①OracleOrahome90TNSListener 使第三方的软件或语言访问 ②OracleServiceETC Oracle的实例 CRUD 增删改查 注意:②中的ETC是你起的实例的名字 ⑷Oracle的开发工具 ①DOS界面的开发平台 -> 运行->sqlplus ②Oracle本身基于DOS的平台 ->运行-> sqlplusw ③Oracle Enterprise Manager Console ④PL/SQL Developer7.1.5 ⑸创建一个表的完整流程 ①创建一个数数库 例子:创建一个数据库 ETC , 物理文件放在F:\ ,初始化1m ,自增长开启 create tablespace etc

datafile 'f:\etc.dbf' size 1m autoextend on; 删除表空间 drop tablespace 数据库名称; ②为该数据库创建一个帐号和密码 语法: create user 用户名称 identified by 密码 default tablespace 数据库名称 注意:1、在Oracle中账号和数据库one2one绑定 2、Oracle的密码不允许为纯数字或空 3、需要在system账号完成动作 修改Oracle的账号密码 语法:alter user 用户 identified by 新密码 ③用grant 权限 to 用户为该帐户授权 语法: grant 权限名称 to 用户; 撤销权限 语法:revoke 权限名称 from 用户名; ④在该帐号下创建表

Oracle笔记

数据库基本概念: 数据库:Database ,DB (数据) 数据库管理系统:(Database Management System,DBMS)oracle ,DB2,Sql_server 等 数据库系统:(Database System ,DBS) 关系型数据库:(Relationship Database ,RDB) SQL语言:(Structured Query Language,结构化查询语言) 数据建模: 要将现实世界中客观存在的事物以数据的形式存储到计算机中并进行处理,就需要对其进行分析,抽象,进而确定数据的结构以及数据间的内在联系,这一过程称为数据建模。 数据模型应满足三个方面的要求: 1,能够比较真实地模拟现实世界 2,容易为人所理解; 3,便于计算机实现。 数据模型三要素: 数据结构---描述事物的静态特性; 数据操作---描述事物的动态特性; 完整性约束----描述事物内部和事物间的约束性关系。 现实世界-------认识抽象-------->概念世界-------转换--------->机器世界 概念数据模型(Conceptual Database Model,CDM) CDM从用户的观点出发对信息进行建模,并不依赖于具体的计算机系统或某个DBMS系统,主要用于数据库的概念设计。 CDM以实体--关系(E-R)模型为基础,将现实世界中的客观对象抽象为实体和关系。 到机器世界中,CDM将被转化为特定DBMS所支持的物理数据模型(Physical Database Model ,PDM)。 CDM相关术语: 实体(Entity):客观存在并且可以相互区分开来的事物。 实体集(Entity Set):同一类实体的集合。 属性(Attribute):描述实体的特性。 关系(Relationship):实体集之间的对应关系(现实世界事物之间的相互关联)。 E-R图三要素: 实体:用矩形框表示

Oracle数据库知识总结

AD1. 执行一个SQL脚本文件 SQL>start file_name SQL>@ file_name 我们可以将多条sql语句保存在一个文本文件中,这样当要执行这个文件中的所有的sql语句时,用上面的任一命令即可,这类似于dos中的批处理。 4. 将显示的内容输出到指定文件 SQL> SPOOL file_name 在屏幕上的所有内容都包含在该文件中,包括你输入的sql语句。 5. 关闭spool输出 SQL> SPOOL OFF 只有关闭spool输出,才会在输出文件中看到输出的内容。 7. COL命令: 主要格式化列的显示形式。 1). 改变缺省的列标题 COLUMN column_name HEADING column_heading For example: Sql>select * from dept; DEPTNO DNAME LOC ---------- ---------------------------- --------- 10 ACCOUNTING NEW YORK sql>col LOC heading location sql>select * from dept; DEPTNO DNAME location --------- ---------------------------- ----------- 10 ACCOUNTING NEW YORK 2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上: Sql>select * from emp Department name Salary ---------- ---------- ---------- 10 aaa 11 SQL> COLUMN ENAME HEADING ’Employee|Name’ Sql>select * from emp Employee Department name Salary ---------- ---------- ---------- 10 aaa 11 note: the col heading turn into two lines from one line. 3). 改变列的显示长度: FOR[MAT] format Sql>select empno,ename,job from emp; EMPNO ENAME JOB ---------- ---------- --------- 7369 SMITH CLERK

oracle常用笔记总结

1、用dba权限的用户查看数据库都有哪些锁 select https://www.doczj.com/doc/d112210005.html,ername,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$session t2 where t1.session_id=t2.sid order by t2.logon_time; 2、查看有哪些对象被锁了 select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id 3、根据sid查找进程id select pro.spid from v$session ses, v$process pro where ses.sid=129 and ses.paddr=pro.addr; select ses.sid from v$session ses, v$process pro where pro.spid=129 and ses.paddr=pro.addr; 4:根据这个spid对应linux下的进程pid linux命令: ps -ef | gre | 'ora' (找到所有ora开头的进程) kill -9 (pid) 5、解决delete后表的高水位的问题 初步判断应该是之前有大量数据,后来delete了,选成高水位,用shrink 清除高水位: alter table t_mobile_client_tp_prov enable row movement; alter table t_mobile_client_tp_prov shrink space; 重新收集统计信息: begin dbms_stats.gather_table_stats(ownname=>'traffic',tabname=>'T_MOBILE_CLIENT_TP_PR end; 6、ORA-02064 distributed operation not supported

oracle GoldenGate学习笔记

Oracle GoldenGate测试文档1.Oracle GoldenGate介绍 GoldenGate TDM(交易数据管理)软件是一种基于日志的结构化数据复制软件,它通过解析源数据库在线日志或归档日志获得数据的增删改变化,再将这些变化应用到目标数据库,实现源数据库与目标数据库同步、双活。GoldenGate TDM 软件可以在异构的IT基础结构(包括几乎所有常用操作系统平台和数据库平台)之间实现大量数据亚秒一级的实时复制,其复制过程简图如下: 如上图所示,GoldenGate TDM的数据复制过程如下: 利用捕捉进程(Capture Process)在源系统端读取Online Redo Log或Archive Log,然后进行解析,只提取其中数据的变化如增、删、改操作,并将相关信息转换为GoldenGate TDM自定义的中间格式存放在队列文件中。再利用传送进程将队列文件通过TCP/IP传送到目标系统。捕捉进程在每次读完log中的数据变化并在数据传送到目标系统后,会写检查点,记录当前完成捕捉的log位置,检查点的存在可以使捕捉进程在中止并恢复后可从检查点位置继续复制; 目标系统接受数据变化并缓存到GoldenGate TDM队列当中,队列为一系列临时存储数据变化的文件,等待投递进程读取数据; GoldenGate TDM投递进程从队列中读取数据变化并创建对应的SQL语句,通过数据库的本地接口执行,提交到数据库成功后更新自己的检查点,记录已经完成复制的位置,数据的复制过程最终完成。 由此可见,GoldenGate TDM是一种基于软件的数据复制方式,它从数据库的日志解析数据的变化(数据量只有日志的四分之一左右)。GoldenGate TDM将数据变化转化为自己的格式,直接通过TCP/IP网络传输,无需依赖于数据库自身的传递方式,而且可以通过高达9:1的压缩率对数据进行压缩,可以大大降低带宽需求。在目标端,GoldenGate TDM可以通

oracle学习总结

--在pl/sql中 --将正式库的零售单A部分数据导到测试库的零售单B中,首先要链接两个数据库 -----创建一个DATABASE LINK /*-- Drop existing database link dropdatabaselink TEST; -- Create database link createdatabaselink TEST connectto NEANDS3 using'(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.4)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = orcl)))'; */ --然后将A表中的字段插入到B表中: insertinto m_retail(ID,C_STORE_ID,RETAILBILLTYPE,ISACTIVE,DOCNO,STATUS,BILLDATE,TOT_AMT_ACTUAL,CREATION DATE,REFNO,AD_CLIENT_ID ) selectID,C_STORE_ID,RETAILBILLTYPE,ISACTIVE,DOCNO,STATUS,BILLDATE,TOT_AMT_ACTUAL,CREATIONDAT E,REFNO,AD_CLIENT_ID from neands3.m_retail@test where status='2'and billdate='20140823' neands3:用户名 m_retail:表名 @test:链接的名称(已经创建好的) ---定时任务将M_RETAIL里的内容插入到新建的表M_RETAIL_MEN的存储过程: create or replace procedure P_M_RETAIL_MENDIAN(p_pi_id IN NUMBER) AS begin DELETE FROM M_RETAIL_MEN WHERE BILLDATE =TO_CHAR(BILLDATE ,'YYYYMMDD'); commit; insert into M_RETAIL_MEN(id,C_STORE_ID,BILLDATE,AMT_ACTUAL25) select get_sequences('M_RETAIL_MEN'),c_store_id,to_char(sysdate,'yyyymmdd'),sum(TOT_AMT_ACTUAL) from M_RETAIL t where t.billdate=to_char(sysdate,'yyyymmdd') and t.status='2' group by t.C_STORE_ID,t.BILLDATE; UPDATE AD_PInstance SET STATE = 'M', RESULT = 0, ModifiedDate = SYSDATE, ERRORMSG = NULL WHERE id = p_pi_id;---pl/sql存储过程自带的 end P_M_RETAIL_MENDIAN; get_sequences(部门):id自增 正则表达式: 在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr

相关主题
相关文档 最新文档