Oracle基础知识

oracle数据库(关系型数据库)
    数据库的组件
         (1)客户端(client)
         (2)数据库(datebase)
         (3)服务器(server)
   全局数据库名(sid)
   完成安装后的主要用户
         (1)SYS (超级管理员)
         (2)system(普通管理员)
         (3)Scott(普通用户)
   启动数据库
        注意 (1)service (服务器):Oracle service orcl
                (2)listener(监听):OracleoraDb11g_home1TNSListener
   数据库的登录:常规登录 在SQL窗口直接登录
                            快捷登录  conn  user_name/password@orcl

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

解锁   Alter user scott account unlock;
创建新用户Lisa  Create user lisa identified by 123;
修改用户Lisa的密码  Alter user lisa identified by 465;
授予Lisa用户登录的权限  Grant create session to lisa;
授予Lisa用户使用表空间的权限  Grant unlimited tablespace to lisa;
授予Lisa用户创建表的权限  Grant create any table to lisa;
授予Lisa用户删除表的权限  Grant drop any table to lisa;
授予Lisa用户修改表的权限  Grant insert any table to lisa;
授予Lisa用户更改表的权限  Grant update any table to lisa;
撤销Lisa用户创建表的权限  Revoke create any table from lisa;
查看当前用户的所有权限    Select * from user_sys_privs;
查看所有用户使用表的权限  Select * from user_tab_privs;
查询tab表中的所有信息     Select * from tab;
将当前用户创建表的权限授予另一用户  Grant create any table to user with grant/admin option;  授予的用户可继续传递此权限
可查询创建过的所有用户    Select username from dba_users;  

创建角色myrole   Create role myrole;
授予角色myrole登录的权限  Grant create session to myrole;
授予Lisa用户myrole的角色  Grant myrole to lisa;
删除角色myrole             Drop role myrole;
将所有权限授予用户         Grant connect,resource,dba to user;

Connect 登录的权限,不可创建实体,不可创建数据库
Resource 创建实体的权限,不可创建数据库
Dba 创建数据库的权限,最高权限

DQL数据查询  select 
DDL数据定义  create,alter,drop,truncate
DML数据操纵  insert,update,delete
DCL数据控制  grant,revoke

基础命令select
SELECT后面指定要选择的列
FROM后面指定从哪些表(table)或视图(view)中获取数据
Where 后面指定筛选的查询条件

SQL命令是大小写不敏感;
SQL命令可写成一行或多行,以分号作为依据SQL的结束;
一个关键字不能跨多行或缩写;
子句通常位于独立行,以便编辑,并易读;
空格和缩进使程序易读;
关键字大写,其他小写;

使用算数计算
运算的先后顺序是先乘除,后加减,括号优先。
select ename,sal,12*sal+100 from emp where sal+300>2000;
空值
Select * from emp where comm is null;
查询 where 列名 is null 为空,列名 is not null 不为空
别名
查询emp表中Smith的工资,并且将字段名ename改为name,sal改为salary  
Select ename as name,sal salary from emp t1 where t1.ename='SMITH';
Where 后面不可以直接使用列的别名
双引号的使用:列名区分大小写
                         列名为纯数字
                         列明中含有特殊字符,例如$,# 等等
                         
Select ename "Name",sal*12 "Annual Salary" from emp;
列连接  双竖条"||"操作符
Select ename ||'''s salsry is'||sal "Employee's Salary" from emp;
去重  
Select distinct deptno from emp;
创建表
Char()  varchar2()  number()  date  
default设置默认值
Create table infos(
Stuid varchar2(7) not null,
Stuname varchar2(10) not null,
Gender varchar2(2) not null,
Age number(2) not null,
Seat number(2) not null,
Enroll date,
Stuaddress varchar2(4) not null);

将stuid设置为主键约束  Alter table infos add constraint pk_infos primary key(stuid);
将gender设置验证约束  Alter table infos add constraint ck_infos_gender check(gender='男' or gender='女');
将seat设置验证约束   Alter table infos add constraint ck_infos_seat check(seat>=0 and seat<=50);
将classno设置验证约束   Alter table infos add constraint ck_infos_classno check((classno>=1001 and classno<=1999)or(classno>=2001 and classno<=2999));
将stuname设置为唯一约束   Alter table infos add constraint un_stuname unique(stuname);
将infos表中classno与class表中ID 设置外键约束   Alter table infos[子表] add constraint fk_gender_id foreign key(classno) references class(id)[父表,父表中建立外键的列必须符合主键约束];

删除外键约束Alter table infos drop constraint fk_gender_id;
删除唯一约束Alter table infos drop constraint un_stuname;
删除验证约束Alter table infos drop constraint ck_infos_age;

添加备注
将表名t1备注为个人信息    Comment on table t1 is '个人信息';
将t1表中ID字段名备注为ID  Comment on column t1.id is 'ID';

修改表(alter  table)
修改dpe01数据类型  Alter table tablename modify(dpe01 varchar2(10));
Alter table tablename modify(字段名 not null);
新增列dpe00  Alter table tablename add(dpe00 varchar2(10));
删除列dpe03  Alter table tablename drop(dpe03);
将列column1字段名改为column2    Alter table tablename rename column column1 to column2;
将表tablename1表名改为tablename2   Alter table tablename1 rename to tablename2;

根据结果集创建表
复制所有信息    Create table tablename1 as select * from tablename;
只复制表结构    Create table emp10 as select * from emp where 1=2;
复制符合条件的行信息  Create table emp10 as select * from emp where deptno=20;
复制符合条件的列信息  Create table emp10 as select ename,empno from emp;

数据插入(insert  into)
Insert into infos values('s100102','林冲','男',22,2,to_date('2009-8-9 06:30:10','yyyy/mm/dd hh24:mi:ss'),'西安',1001);
Insert into infos values ('s100104','阮小二','男',26,3,sysdate,default,1001);
Insert into infos2 select * from infos;

数据更新(update  set)
Update infos set classno=1002,stuaddress='山东莱芜' where stuname='阮小二';
Update emp set comm=100 where deptno=10;

删除数据(detele  from)
Delete from infos where stuid='s100103';                                          
Truncate table tablename;保留表结构,但是数据信息全部删除并且不留痕迹
Drop table tablename; 删除整张表,数据信息会形成备份

数据去重
Create table T1 as select * from T where 1=2;
Insert into T1 select distinct * from T;
Truncate table T;
Insert into T select * from T1;
Drop table T1;

高级查询
(1)in操作
Where job='SALESMAN' or job='PRESIDENT' or job='ANALYST'   ===   where job in ('SALESMAN','PRESIDENT','ANALYST')
(2)Between...and...
Where sal>=1000 and sal<=2000    ===    where sal between 1000 and 2000

关系运算:= ,<> 或 != ,< ,> ,<= ,>= 
逻辑运算符:AND、OR、NOT
算术运算符:+ , - , * , /  
求余运算: Select mod(x:y) from dual;
字符串的连接用双竖线(||)表示 
空值:空值 is null   非空 is not null 

模糊查询  like
%  表示零个或者多个任意字符。
_  代表一个任意字符。占位 
Update emp set ename='SMI%TH' where ename='SMITH';
Select * from emp where ename like  '%/%%' [查询含有%的名字,需查询的%可以在字符串的任何位置] escape’/’;

集合运算
INTERSECT(交集)  共有记录
UNION ALL(并集)  包括重复
UNION(并集)     不包括重复
MINUS(减去)     列数及类型必须匹配

集合运算的优先级别:
1.intersect > union = minus
2.首先计算intersect,然后从左到右的出现顺序依次处理优先级的相同的运算。
3.可以使用圆括号控制集合运算的优先级,它具有最高的优先级。

连接查询
内连接有可能漏掉数据,使用左连接居多
等值连接
Select * from emp s,dept c where s.deptno=c.deptno;
Select * from emp s inner join dept c on s.deptno=c.deptno;
不等连接
Select s.ename,s.sal,c.grade from emp s,salgrade c where s.sal>=c.losal and s.sal<=c.hisal;
Select s.ename,s.sal,c.grade from emp s inner join salgrade c on s.sal>=c.losal and s.sal<=c.hisal;
Select s.ename,s.sal,c grade from emp s.salgrade c where s.sal between c.losal and c.hisal;
左连接
Select * from T_student s left join T_class c on s.classid=c.classid;
Select * from T_student s,T_class c where s.classid=c.classid(+);
右链接
Select * from T_student s right join T_class c on s.classid=c.classid;
Select * from T_student s,T_class c where s.classid(+)=c.classid;
全连接
Select * from T_student s full join T_class c on s.classid=c.classid;
全外连接select * from emp e full join dept d on e.deptno=d.deptno;
内连接select * from emp e inner join dept d on e.deptno=d.deptno;
交叉连接:笛卡尔积
Select * from T_student cross join T_class;
Select * from T_student,T_class;

Select * from emp e left join dept d on e.deptno=d.deptno where d.deptno=20;
where作用于from中所有行,限定查询行数
Select * from emp e left join dept d on e.deptno=d.deptno and d.deptno=20;
and作用于dept表,只限定dept表的查询行数

创建保存点与回滚
create table t(
id number,
name varchar2(10));
insert into t values (1,'Tough1');
savepoint t1;

insert into t values (2,'Tough2');
savepoint t2;

update t set name='Tough' where id=2;
savepoint t3;

rollback to savepoint t1;
rollback;

commit;
delete from t where id=1;
savepoint t4;

子查询
select ename ,job,sal from emp e where e.deptno =(
select d.deptno from dept d where d.dname='SALES');

select e.ename,e.sal,
(select dname from dept d where e.deptno=d.deptno) dname from emp e;

Select * from emp e right join 
(select d.deptno from dept d where d.dname='SALES') s on  s.deptno=e.deptno;

1、查询出销售部(SALES)下面的员工姓名,工作,工资。
Select ename,job,sal from emp where deptno=(select deptno from dept where dname='SALES');
Select ename,job,sal from emp e,dept d where e.deptno=d.deptno and d.dname='SALES';

2、查询出 Emp 表中比任意一个销售员(“SALESMAN”)工资低的员工姓名、工作、 工资。
Select ename,job,sal from emp where sal<any (select sal from emp where job='SALESMAN');

3、查询出比所有销售员的工资都高的员工姓名,工作,工资。
Select ename,job,sal from emp where sal>all (select sal from emp where job='SALESMAN');

4、查询在部门的loc为NEW YORK或者DALLAS的部门工作的员工的员工姓名 ename和岗位名称job
Select ename,job from emp where deptno in (select deptno from dept where loc='NEW YORK' or 'DALLAS');
select t.ename,t.job from emp t where t.deptno in (select deptno from dept where loc ='NEW YORK' or loc ='DALLAS');

In 与 exists 的联系与区别
联系:查询结果一致  not in 与 not exists 同理,查询相反
区别:查询效率不同(exits效率更高)
外多内少 选择in
外少内多 选择exists
Select * from dept e where not exists (select * from emp d where d.deptno = e.deptno );

子查询和更新语句的结合
update emp e set dname=(select dname from dept d where e.deptno=d.deptno) where e.deptno in (select deptno from dept d);
或者
update emp e set dname=(select dname from dept d where e.deptno=d.deptno) where exists (select dname from dept d where e.deptno=d.deptno); 

伪列
rowid
Select rowid,ename from emp where sal>2000; 

根据rowid删除表中的重复记录:
delete from 表 t1 where t1.rowid < (select max(rowid) from 表 t2 where t1.id = t2.id);

Rownum
查询出员工表中前 5 名员工的姓名,工作,工资。
Select rownum,ename,job,sal from emp where rownum<=5; 
查询出表 EMP 中第 5 条到第 10 条之间的记录。 
select * from (select ename,job,sal,rownum as rum from emp) t where t.rum between 5 and 10; 

--查询30部门中薪资位于第三位和第四位的员工信息;
select * from (select s1.*,rownum r from (select ename,job,sal from emp where deptno=30 order by sal desc) s1) where r in (3,4);

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

字符函数
  函数                                说明 
ASCII(x)            返回字符x的ASCII码。仅能返回第一个字符的ASCII码 
CONCAT(x,y)        连接字符串x和y。只能有两个参数
INSTR(x,str,[start],[n])    在x中查找str,可以指定从start开始,也可以指定从第n次开始。返回出现的位置信息(查找一个字符串在另一个字符串中首次出现的位置)
LENGTH(x)                     返回x的长度。
LOWER(x)                     x转换为小写。仅对英文字母有效
UPPER(x)                     x转换为大写。仅对英文字母有效
LTRIM(x,[trim_str])         把x的左边截去trim_str字符串,缺省截去空格。 
RTRIM(x,[trim_str])         把x的右边截去trim_str字符串,缺省截去空格。 
TRIM([trim_str FROM] x)     把x的两边截去trim_str字符串,缺省截去空格。trim_str只能一个字符
REPLACE(x,old,new)         在x中查找old,并替换为new。 
SUBSTR(x,start,[length])   返回x的字串,从start处开始,截取length个字符,缺省length,默认到结尾。 

lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节
length(string)计算string所占的字符长度:返回字符串的长度,单位是字符
 
              示例                           示例结果
select ascii('a') from dual;                      97 
select concat('hello',' world') from dual;  hello world 
select instr('hello world','or') from dual;      8 
select length('hello') from dual                  5 
select lower('hello') from dual;              hello 
select upper('hello') from dual;                HELLO 
select ltrim('===hello===','=') from dual;    hello=== 
select '=='||ltrim('hello===') from dual;      ==hello=== 
select rtrim('===hello===','=') from dual;  ===hello 
select '='||trim('hello')||'=' from dual;       =hello= 
select trim('='from'===hello===') from dual;  hello 
select replace('abcde','cd','aaa') from dual; abaaae 
select substr('abcde',2) from dual;             bcde 
select substr('abcde',2,3) from dual;             bcd 

数字函数

 函数                  说明                        示例 
ABS(x)                x绝对值                 ABS(-3)=3 
ACOS(x)          x的反余弦                 ACOS(1)=0 
COS(x)                  余弦                     COS(1)=1.57079633 
CEIL(x)         大于或等于x的最小值     CEIL(5.4)=6   向上取整(上入整数)
FLOOR(x)     小于或等于x的最大值     FLOOR(5.8)=5  向下取整(下舍整数)
LOG(x,y)         x为底y的对数          LOG(2,4)=2 
MOD(x,y)         x除以y的余数          MOD(8,2)=0 用来判断奇偶数 
POWER(x,y)       x的y次幂              POWER(2,3)=8 
ROUND(x,[y])   x在第y位四舍五入     ROUND(3.456,2)=3.46 
SQRT(x)           x的平方根              SQRT(4)=2 
TRUNC(x,[y])     x在第y位截断          TRUNC(3.456,2)=3.45 

1. ROUND(X[,Y]),四舍五入。
在缺省 y 时,默认 y=0。比如:ROUND(3.56)=4。
y 是正整数,就是四舍五入到小数点后y位。ROUND(5.654,2)=5.65。
y 是负整数,四舍五入到小数点左边|y|位。ROUND(351.654,-2)=400。
2. TRUNC(x[,y]),直接截取,不四舍五入。
在缺省 y 时,默认 y=0。比如:TRUNC (3.56)=3。
y 是正整数,就是截取到小数点后y位。TRUNC(5.657,2)=5.65。 
y 是负整数,截取到小数点左边|y|位。TRUNC (351.654,-2)=300。
3.select substr('Hello world',instr('Hello world','or'),3) from dual;

日期函数
1、ADD_MONTHS(d,n),在某一个日期 d 上,加上指定的月数 n ,返回计算后的新日期。 d 表示日期, n 表示要加的月数。
select ADD_MONTHS(to_date('1999-01-01','YYYY-MM-DD'),12) from dual;

2、LAST_DAY(d),返回指定日期当月的最后一天。

获取本月有多少天
select to_char(last_day(sysdate),'dd') from dual;

得到指定月的最后一天
select add_months(trunc(sysdate,'mm'),1)-1 from dual;

截取对应日期,显示为加1个月之后的日期再减去一天
select add_months(trunc(sysdate,'dd'),1)-1 from dual;

3、ROUND(d,[fmt]),返回一个以 fmt 为格式的四舍五入日期值,d 是日期,fmt 是格式模型。默认 fmt 为DDD,即月中的某一天。

Select sysdate ,
round(sysdate),
round(sysdate,'day'),
round(sysdate,'month'),
round(sysdate,'year') from dual;

4、TRUNC (d[,fmt]) 直接截取到对应格式的第一天。 

5、EXTRACT (fmt FROM d), 取日期中的特定部分。 
fmt 为:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND

Select sysdate,EXTRACT (YEAR from sysdate) from dual;

6、months_between(x,y) 计算两个日期之间的月数; 

select s-to_char(s,'dd') from 
(select add_months(to_date('20120331','yyyymmdd'),1) s from dual) ;

转换函数 
1、 TO_CHAR(d|n,[fmt]) 日期和数字转换为字符串
Select to_char(sysdate,'YYYY"年"MM"月"DD"日"HH24:MI:SS') "date" from dual;  
Select to_char(-123123.45,'L9.9EEEEPR') "char" from dual;

2、TO_DATE (x ,fmt) 

3、TO_NUMBER(x,fmt) 
Select to_number('-$12,345.67','$99,999.99') "NUM" from dual;

其他单行函数
1、NVL(x,value)  数字类型的转换函数
Select ename,job,sal,nvl(comm,100) from emp where sal<2000;

2、 NVL2(x,value1,value2)
Select ename,job,sal,nvl2(comm,comm+100,200) “comm” from emp where sal<2000; 

3、decode (x,value,value1,value2) 值的转换  当x的列值为value时,查询结果值为value1,否则值为value2。

4、Case具有两种格式。简单Case函数和Case搜索函数。

--简单Case函数h
case sex when '1' then '男'
when '2' then '女'
else '其他'  
end 
--Case搜索函数
case  when sex = '1' then '男'
when sex = '2' then '女'
else '其他' 
end

聚合函数  avg  sum  min  max  count

执行顺序:from    where   group by   having    select    order by
语法顺序:select   from    where    group by  having   order by 
使用group by 函数时,查询的列要么出现在聚合函数中,要么出现在分组中
order by 默认是升序排列 asc升序, desc降序
Nulls first则表示null值的记录将排在最前
Nulls last则表示null值的记录将排在最后 

分析函数
select ename,deptno,sal,
sum(e.sal) over(partition by e.deptno) sum_salary_department   --该部门薪水总额
from emp e; 

select ename,deptno,sal,
row_number() over(partition by e.deptno order by e.sal desc) rownum_sal_dept,   --该人员的部门薪水排行
dense_rank() over(partition by e.deptno order by e.sal desc) dense_sal_dept,      不跳号
rank() over(partition by e.deptno order by e.sal desc) rank_sal_dept              跳号
from emp e;

select ename,deptno,sal,
  min(e.sal) over(partition by e.deptno)  min_sal_dept_first   --部门的最低薪水
from emp e;

select ename,deptno,sal,
first_value(e.sal) over(partition by e.deptno order by e.sal) min_sal_dept_firstv,    --部门的最低薪水
last_value(e.sal) over(partition by e.deptno order by e.sal desc rows between unbounded preceding and unbounded following) min_sal_dept_firstv    --部门的最低薪水
from emp e;

select ename,deptno,sal,
lag(e.ename, 1, '00') over (order by e.sal desc) lag_persion    --薪水排在自己前一位的员工名字
from emp e;

分页函数
select * from (select ename,sal,deptno,ceil(rownum/3) page from emp) where page=5; 

将数据平均分成n类
select ename,sal,deptno,
ntile(2)over(order by emp.sal desc) ntile_number_nt from emp where deptno=20;

行转列
查询公司的人数,以及在1980-1987年之间,每年雇用的人数,结果类似下面的格式
total  1980  1981  1982  1987
20     3     4     6     7  
1)select 
count(*) total,
sum(decode(extract(year from hiredate),1980,1,0)) "1980",
sum(decode(extract(year from hiredate),1981,1,0)) "1981",
sum(decode(extract(year from hiredate),1982,1,0)) "1982",
sum(decode(extract(year from hiredate),1987,1,0)) "1987"
from emp;

2)select 
count(*) total,
sum(case extract(year from hiredate) when 1980 then 1 else 0 end) "1980",
sum(case extract(year from hiredate) when 1981 then 1 else 0 end) "1981",
sum(case extract(year from hiredate) when 1982 then 1 else 0 end) "1982",
sum(case extract(year from hiredate) when 1987 then 1 else 0 end) "1987"
from emp;

3)select 
count(*) total,
sum (decode (to_char (hiredate,'yyyy'),1980,1,0)) "1980" ,  
sum (decode (to_char (hiredate,'yyyy'),1981,1,0)) "1981",
sum (decode (to_char (hiredate,'yyyy'),1982,1,0)) "1982",
sum (decode (to_char (hiredate,'yyyy'),1987,1,0)) "1987"
from emp;

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

同义词(synonym)
同义词(Synonym)是数据库对象的一个别名,Oracle 可以为表、视图、序列、过程、函数、程序包等指定一个别名。
1、私有同义词:拥有 CREATE SYNONYM 权限的用户(包括非管理员用户)即可创建私有同义词,只能由当前用户使用。
2、公有同义词:系统管理员可以创建公有同义词,公有同义词可以被所有用户访问。
system用户
Create user xiaomei identified by xiaomei;
Grant connect,resource to xiaomei;
Scott用户
Grant all on EMP to xiaomei;
新用户xiaomei
Create synonym MyEmp for SCOTT.EMP;
Select ename,job,sal from MyEmp where sal>2000;
Drop synonym MyEmp;

序列(sequence)
序列(Sequence)是用来生成连续的整数数据的对象。当做主键使用

Create sequence seq
Start with (num)
Increment by (num)
Maxvalue 10
Minvalue 1
cycle
Cache;

注:
1、创建序列时,如果指定了cycle,则升序的序列必须要指定最大值,降序的序列必须要指定最小值
2、序列在创建时,默认cache值为20,其中20表示的是可以缓存循环20次的数值
Catch数 <=(最大值-最小值)/ 步长  否则会报cache的数量必须小于cycle值
3、当指定cycle时,序列为升序,若没有设置最小值,达到最大值时,会再次从默认的最小值1开始进行数据的生成。

查看序列下一个值  Select myseq.nextval from dual;
查看序列当前值    Select myseq.currval from dual;
查询当前用户都有哪些序列  select * from user_sequences;
序列在添加数据时的使用方法:
Insert into emp (empno,ename) values(MYSEQ.nextval,'xiaomie');
ALTER SEQUENCE 修改序列
注:不能修改序列的初始值。如果要修改序列的初始值,需要重新创建。
    最小值不能大于当前值。
    最大值不能小于当前值。
Alter sequence myseq increment by 2;
Alter sequence myseq
Maxvalue 10000
Minvalue -300;

删除序列   drop sequence myseq;

视图(View)
视图(View)实际上是一张或者多张表上的预定义查询,这些表称为基表。
视图优点:
1、限制用户只能通过视图检索数据。对最终用户屏蔽建表时底层的基表。
2、将复杂的查询保存为视图。对最终用户屏蔽一定的复杂性。    ---简单化
3、限制某个视图只能访问基表中的部分列或者部分行的特定数据。---安全性。
4、从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。

create [OR REPLACE] [{force|noforce}] VIEW view_name

AS SELECT查询
[WITH READ ONLY] (只读,拒绝所有DML操作)

WITH CHECK OPTION CONSTRAINT view_name (违反约束的请求都会失败)

注:
1、视图中不可出现重复的列名,修改字段名即可
2、函数列需添加别名
3、并不是所有人都有创建视图的权限,防止有些用户编写视图不规范,造成资源占用。

索引总结
Oracle 数据库会为表的主键和包含唯一约束的列自动创建索引。
索引可以提高查询的效率,但是在数据增删改时需要更新索引,因此索引对增删改时会有负面影响。
索引对用户是透明的,无论表上是否有索引,sql语句的用法不变。

创建索引
create [unique] index index_name on
table_name(column_name[,column_name...]);
eg:
为emp表中ename创建唯一索引
Create unique index uq_ename_idx on emp(ename);
为emp表中sal创建普通索引
Create index idx_sal on emp(sal);
把emp表中job列先变为小写再创建索引
Create index idx_job_lower on emp(lower(job));

修改索引
1、重命名索引 alter index index_sno rename to bitmap_index;
2、合并索引   alter index index_sno coalesce;
3、重建索引
  方式一:删除原来的索引,重新建立索引
       方式二:alter index index_sno rebuild;
删除索引
drop index index_sno;
查看索引
create index index_sno on student('name');
Select  *  from user_indexes where table_name='表名'; 
Select  *  from all_indexes where table_name='student';
索引特点:
第一 ,唯一性索引可以确保数据的唯一性
第二 ,加快数据检索速度
第三 ,加速表和表之间的连接
第四 ,使用分组和排序子句进行查询时,可以减少查询分组和排序的时间
第五 ,使用优化隐藏器,提高系统的性能

索引不足:
第一 ,创建索引和维护要耗费时间,时间随着数据量的增加而增加
第二 ,占用物理空间
第三 ,对表中的数据进行增删改时,索引也要维护,降低数据的维护速度

应该建索引列的特点:
1)在经常需要搜索的或者排序的列上
2)作为主键的列,强制该列的唯一性和组织表中数据的排列结构
3)在经常用在连接的列上,这些列主要是一些外键
4)在经常需要根据范围进行搜索的列上创建索引
5)在经常使用在WHERE子句中的列上面创建索引
6)对于基数高的列适合建立B树索引,对于基数低的列适合简历位图索引

使用索引需注意:
1、如果有两个或者以上的索引,其中有一个唯一性索引,而其他是非唯一,这种情况下oracle将使用唯一性索引而完全忽略非唯一性索引
2、至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引)
3、列中有很多空值,但经常查询该列上非空记录时应该建立索引
4、使用create index时要将最常查询的列放在最前面
5、LONG(可变长字符串数据,最长2G)和LONG RAW(可变长二进制数据,最长2G)列不能创建索引

不应该建索引列的特点:
1)在查询中很少使用或者参考的列不应该创建索引 
2)只有很少数据值的列不应该增加索引
3)定义为 blob 数据类型的列不应该增加索引
4)修改性能远远大于检索性能时,不应该创建索引
5)限制表中索引的数量

限制索引
1、使用不等于操作符(<> 、!=)
通过把不等于操作符改成 or 条件,可以使用索引,避免全表扫描
2、使用 IS NULL 或 IS NOT NULL
NULL 值没有被定义,把需要索引的列设成 NOT NULL 即可使用索引
3、使用函数
 如果不使用基于函数的索引,那么在SQL语句的 WHERE 子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
下面的查询不会使用索引(只要它不是基于函数的索引)
select empno,ename,deptno from emp where trunc(hiredate)='01-MAY-81';    
把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptno from emp where hiredate<(to_date('01-MAY-81')+0.9999);
4、比较不匹配的数据类型
eg:
account_number是一个VARCHAR2类型,在account_number字段上有索引。
select bank_name,address,city,state,zip from banks where account_number=990354;    ----不使用索引
select bank_name,address,city,state,zip from banks where account_number='990354';   ----使用索引
5、通配符在搜索词首出现时,oracle不能使用索引
eg:
--我们在name上创建索引;
create index index_name on student('name');
--下面的方式oracle不适用name索引
select * from student where name like '%wish%';
--如果通配符出现在字符串的其他位置时,优化器能够利用索引;如下:
select * from student where name like 'wish%';

索引分类
B树索引(默认索引)
特点:
1、适合于大量的增、删、改
2、不能用包含 OR 操作符的查询;
3、适合高基数的列(唯一值多)

位图索引
使用限制:
1、基于规则的优化器不会考虑位图索引。
2、当执行ALTER TABLE 语句并修改包含有位图索引的列时,会使位图索引失效。
3、位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。
4、位图索引不能被声明为唯一索引。
5、位图索引的最大长度为30。

优点:
1、位图所使用的存储空间比B树小得多
2、通常情况下,Oracle将位图索引段装入到内存中,内存的速度远大于磁盘空间操作速度
3、进行And与Or等逻辑操作时,Oracle使用的是位操作,所以执行效率也很快

基于函数的索引
如果没有基于函数的索引,任何在列上执行了函数的查询都不能使用这个列的索引。
例如,下面的查询就不能使用JOB列上的索引,除非它是基于函数的索引:
select  *  from emp where UPPER(job) = 'MGR';
下面的查询使用JOB 列上的索引,但是它将不会返回 JOB 列具有 Mgr 或 mgr 值的行:
select  *  from emp where job = 'MGR';
可以创建这样的索引,允许索引访问支持基于函数的列或数据。可以对列表达式UPPER(job) 创建索引,而不是直接在 JOB 列上建立索引,如:
create index EMP$UPPER_JOB on emp(UPPER(job));

分区索引
分区索引是把一个索引分成多个片断。通过把一个索引分成多个片断,可以访问更小的片断(也更快),并且可以把这些片断分别存放在不同的磁盘驱动器上(避免 I/O 问题)。
企业版的数据库可以创建分区索引,标准版的数据库中不能创建。
B树和位图索引都可以被分区,HASH 索引不可以被分区。
索引的三种分区方法:
1、表被分区而索引未被分区; --分区表
2、表未被分区而索引被分区; --分区索引
3、表和索引都被分区
分区索引分为本地分区索引(local索引)、全局分区索引(global索引)

表分区优点:
1、数据查询:数据被存储到多个文件上,减少了I/O负载,查询速度提高。
2、数据修剪:保存历史数据非常的理想。
3、备份:将大表的数据分成多个文件,方便备份和恢复。
4、并行性:可以同时向表中进行DML操作,并行性性能提高。

对表的分区方法(表分区)(数据量过大)
1)范围分区(range)
2)列表分区(list)
3)散列分区(hash分区)
4)复合分区(子分区)

查询数据文件信息表   select * from dba_data_files;
查询当前用户下有哪些是分区表  select * from user_part_tables;
查询当前用户下有哪些分区索引  select * from user_part_indexes;
查询当前用户下分区索引的分区信息 
select * from user_ind_partitions t where t.index_name= ;
查询当前用户下分区表的分区信息:
Select * from user_tab_partitions t where t.table_name= ;
查询某分区下的数据量
Select count(*) from table_partition partition(tab_partition_01);
查询索引、表上在那些列上创建了分区
Select * from user_part_key_columns;
查询某用户下二级分区的信息(只有创建了二级分区才有数据)
Select * from user_tab_subpartitions;

创建4个测试用的表空间,每个表空间作为一个独立分区
create tablespace partition1 datafile '/home/oracle/app/oradata/orcl/partition1.dbf' size 20m;
create tablespace partition2 datafile '/home/oracle/app/oradata/orcl/partition2.dbf' size 20m;
create tablespace partition3 datafile '/home/oracle/app/oradata/orcl/partition3.dbf' size 20m;
create tablespace partition4 datafile '/home/oracle/app/oradata/orcl/partition4.dbf' size 20m;

范围分区
分区建表:
Create table dinya_test(
Transaction_id number primary key,
Item_id number(8) not null,
Item_description varchar2(300),
Transaction_date date not null)
Partition by range(transaction_id)(
Partition part_01 values less than(2) tablespace partition1,
Partition part_02 values less than(4) tablespace partition2,
Partition part_03 values less than(6) tablespace partition3,
Partition part_04 values less than(maxvalue) tablespace partition4);

插入数据:
Insert into dinya_test values(1,1001,youqi,to_date('2014','yyyy'));
Insert into dinya_test values(2,1002,youqi,to_date('2013','yyyy'));
Insert into dinya_test values(3,1003,muliao,to_date('2013','yyyy'));
Insert into dinya_test values(4,1004,muliao,to_date('2012','yyyy'));
Insert into dinya_test values(5,1005,gangcai,to_date('2015','yyyy'));
Insert into dinya_test values(8,1008,gangcai,to_date('2015','yyyy'));

查询数据
不指定分区:select * from dinya_test;
指定分区:  select * from dinya_test partition(part_01);

更新数据
不指定分区:update dinya_test t set t.item_description='KSDE' where t.transaction_id=1;
指定分区:update dinya_test partition(part_01) t set t.item_description='KSDE' where t.transaction_id=1;

删除数据
Delete from dinya_test partition(part_01);

表空间
表空间是一个逻辑概念,若干操作系统文件组成一个表空间,若干个表空间组成数据库空间。
表空间统一管理空间中的数据文件,一个数据文件只能属于一个表空间。
      数据库空间---表空间---数据库文件---表
常见的表空间:系统表空间,temp表空间(临时表空间),自定义表空间(create tablespace)
创建表空间语法:
create tablespace am datafile 'D:/A.ORA' size 10m,'D:/B.ORA' size 5m
extent management local uniform size 1m;

LOCAL 指明表空间类型是:本地管理表空间。本地管理表空间要求 Oracle 中的数据分区(Extent)大小统一。
DATAFILE 数据文件存储位置
UNIFORM SIZE:指定每个分区的统一大小

select * from dba_data_files; 查看表空间的物理位置
select * from user_tablespaces; 查看表空间的相关信息
select * from dba_tables where tablespace_name ='USERS'; 查看表空间中数据表的信息
select * from user_users; 查看当前用户的相关信息
drop tablespace am including contents and datafiles;    删除表空间am中的所有内容及文件

1、添加文件
alter tablespace am add datafile 'D:/C.ORA' size 20m;
2、修改原有文件大小(建议扩大不减小)
alter database datafile 'D:/C.ORA' resize 30m;
3、表空间可以在不使用时删除,使用 DROP TABLESPACE 命令。
drop tablespace am;
4、数据库的所有数据全部在某一表空间中存放,在创建用户时,可以为用户指定某一表空间,那么该用户下的所有数据库对象(比如表)默认都存储在该空间中。
create user mujin identified by mujin default tablespace am;
5、在创建表时,表中数据存放在用户的默认表空间中,也可以通过 tablespace 子句为表指定表中数据存放在其他表空间中
create table student(sno number,sname varchar2(10) not null) tablespace am;
6、创建索引时也可以为索引指定表空间。
create index mm on student(sno) tablespace am;
表和索引一旦创建,表空间无法修改。
-----------------------------------------------------------------------------------------------------------
PLSQL与SQL的不同之处:   
    SQL是访问数据库的标准语言,通过SQL命令,用户可以操作数据库中的数据    
    PL/SQL支持所有的SQL数据操作命令,游标控制命令,事务控制命令,SQL函数,运算符和伪列    
    PL/SQL和SQL语言紧密集成,支持所有的SQL数据类型和null值
    SQL 是非过程语言,只能一条一条执行,而PL/SQL是块结构语言,是统一执行的,同时可以把块进行永久存储,以备重用,减少通信时间

与SQL的联系:
    PL/SQL是Oracle数据库对SQL语句的扩展
    过程控制结构与SQL数据处理能力无缝的结合形成了强大的编程语言,可以创建过程和函数以及程序包
    PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,PL/SQL引擎分析收到PL/SQL语句块中的内容,
    把其中的过程控制语句由 PL/SQL 引擎自身去执行, 把 PL/SQL 块中的 SQL 语句交给服务器的 SQL 语句执行器执行
    
PLSQL概念
PL/SQL是一种块结构的语言,它将一组语句放在一个块中,一次性发送给服务器,PL/SQL引擎分析收到PL/SQL语句块中的内容,把其中的过程控制语句由 PL/SQL 引擎自身去执行, 把 PL/SQL 块中的 SQL 语句交给服务器的 SQL 语句执行器执行。

PL/SQL的优点:
1、支持SQL
2、支持面向对象编程
3、更好的性能
4、可移植性
5、可以通过存储过程对客户机和服务器之间的应用程序逻辑进行分隔,这样可以限制对 Oracle 数据库的访问,数据库还可以授权和撤销其他用户访问的能力。

语法结构:
  declare
  begin
  exception
  end;

变量赋值  (赋值只能是一行赋值,不可多行同时使用一个赋值语句)
 1) :=
 2) default
 3) select…into…

声明常量  constant   常量必须赋值,并且只赋一次,不可再次对常量进行赋值
        
宿主变量  使用var进行声明   变量前加 :(不加也可执行)

数据类型
1) %ROWTYPE    取原表的一行数据类型,随原表变动而变动
2) %TYPE       取原表的一列数据类型,随原表变动而变动
3) record      (声明记录类型,属于自定义数据类型)

PL/SQL 提供了丰富的流程控制语句,有三种控制结构:
1、顺序结构  goto 和 null 
2、条件结构
1) if-then

   if 条件 then --条件结构体
   end if;

   if 条件 1 then
   --条件 1 成立结构体
   elsif 条件 2 then –0对至多对
   --条件 2 成立结构体
   else –0个或者一个
   --以上条件都不成立结构体
   end if;

2) case

  简单case
  case…when…then…;
  end case;

  搜索case
  case when…then…end;

3、循环结构(exit强制结束循环)
(1)无条件循环loop    先循环,符合条件时退出

     loop
      循环体;
      exit when <条件语句>;                      条件满足,退出循环语句
     end loop;
     
(2)while 循环语句    先设定条件,再进行循环
     
     while 条件 loop 
      循环体;
     end loop;
     
(3)for 循环语句
     
     for 循环变量 in[reverse] 下限..上限 loop
      循环体;
     end loop;

动态 SQL 的语法是: 
execute immediate ‘DDL 语句’
[into 变量列表]       将查询结果保存到一个变量中,结果只能是单行
[using 参数列表]      传值(传递参数值)

returning into  将DML查询储存到变量中,返回参数
returning into  是将进行dml操作之后的行,使用 returning 变量 into 参数进行数据的保存,(通过 using 变量 returning into 来接收数据)。

异常处理

1、预定义异常(系统自身存在的异常)

语法格式:异常处理
begin --可执行部分
exception -- 异常处理开始
when 异常名 1 then --对应异常处理
when 异常名 2 then --对应异常处理
 ...... 
when others then --其他异常处理
end;

2、自定义异常
关键点: 
异常定义:myexception exception; 
异常引发:raise myexception; 

3、引发应用程序异常 
自定义异常码,其范围介于-20000 到-20999 之间的负整数
引发应用程序异常的语法是: raise_application_error(异常码,异常信息) 
   
   如果要处理未命名的内部异常,必须使用 others 异常处理器。
   可以利用 pragma exception_init 把一个异常码与异常名绑定。
   语法:pragma exception_init(异常名,异常码)    
   异常码可自定义,也可预定义
-----------------------------------------------------------------------------------------------------------
游标

游标用于指向一个查询结果集。也可以指向数据插入、修改、删除的记录集。可以认为是指向某个结果集的指针。
通过游标访问结果集中的数据,一定要使用循环。
显性游标:使用关键字CURSOR明确申明的游标。游标名%游标属性名
隐性游标:没有使用关键字cursor明确申明的游标。SQL%游标属性名
游标的三个属性(用在loop循环和while循环中,for循环中不需要)
(1) %notfound 属性。当最近一次读记录(fetch),成功取到值,此数据为 false;当最近一次读记录(fetch),没有取到值,此数据为true
(2) %found 属性,与 %notfound 相反;
(3) %rowcount 属性
          对于显性游标,%rowcount 表示 fetch 成功的数据条数。如果open游标,但没有进行fetch,则rowcount值为0。
          对于隐性游标,%rowcount 表示 insert、update或delete 所影响的行数。

显性游标工作过程:
(1) 定义游标:CURSOR cursor_name IS select_statement;
(2) 打开游标:OPEN cursor_name;
(3) 提取游标数据:FETCH cursor_name INTO {variable_list | record_variable };
                      FETCH 语句的作用:取出游标指针所指向的那一行数据,放入变量中。然后下移指针到下一行。
(4) 对该记录进行处理,直到活动集合中没有记录。
(5) 关闭游标:CLOSE cursor_name;
--注意:在fetch指针移动之后,直接编辑退出操作,否则会导致游标最后一行的数据执行两次

使用loop(直接提取,开始循环,符合条件结束)

declare
  v_empno emp.empno%type;
  v_ename emp.ename%type;
  cursor c_emp is select empno,ename from emp;
begin
  open c_emp;
    loop
      fetch c_emp into v_empno,v_ename;
      exit when c_emp%notfound;
      dbms_output.put_line(v_empno ||' '||v_ename );
    end loop;
  close c_emp;
end;

使用while(fetch 两次)

declare
  v_empno number(4);
  v_ename varchar2(20);
  cursor c_emp is select empno,ename from emp;
begin
  open c_emp;
    fetch c_emp into v_empno,v_ename;                 --先让指针指向结果集中的第一行,并将值保存到指定的列中;
    while c_emp%found loop
    dbms_output.put_line(v_empno ||' '||v_ename );
    fetch c_emp into v_empno,v_ename;                 --让指针指向结果集中的下一行,并保存值;
    end loop;
  close c_emp;
end;

使用for

declare
  v_emprecord emp%rowtype;
  cursor c_emp is select empno,ename from emp;
begin
  for v_emprecord in c_emp loop
    dbms_output.put_line(v_emprecord.empno||' '||v_emprecord.ename);
    end loop;
end;

begin
  for v_emp in (select empno,ename from emp)
    loop 
      dbms_output.put_line(v_emp.empno||' '||v_emp.ename);
      end loop;
end;

触发器

概念:触发器在数据库里以独立的对象存储,触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。
事件:指的是对数据库的表或者视图进行的INSERT、UPDATE及DELETE操作
功能/作用:用来完成由数据库的完整性约束难以完成的复杂业务规则的约束
                  监视对数据库的各种操作,实现审计的功能
                  数据的一致性和完整性

1、DML触发器(重点)
ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
2、替代触发器
在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。
3、系统触发器
在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

创建触发器的一般语法是:
create or replace trigger 触发器名称
{before/after}                  --在同一个触发器中只能出现一次
{insert or delete/update of 列 on 表}
[referencing {old [as] old | new [as] new| parent as parent}]
[for each row]                 --行触发器,省略则为语句触发器
[when condition]              --只能用在before和after行触发器中,when子句中old和new不加冒号
pl/sql_block | call procedure_name;        --PL/SQL块  /  存储过程
begin
执行部分;                      --PL/SQL块中必须在新旧列值之前加冒号
end;

行触发器和语句触发器的区别表现在:
  行触发器要求当一个dml语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;
  语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。instead of 触发器则只能为行触发器。

每张表最多可建立12 种类型的触发器:before/after   insert/update/delete   [for each row]  

DML触发器的限制:
1、create trigger语句文本的字符长度不能超过32KB;
2、触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句;
3、触发器中不能使用数据库事务控制语句 COMMIT,ROLLBACK,SAVEPOINT 语句;
4、由触发器所调用的过程或函数也不能使用数据库事务控制语句;
5、触发器中不能使用LONG, LONG RAW 类型;
6、触发器内可以参照BLOB 类型列的列值,但不能通过 :NEW 修改BLOB列中的数据;

DML触发器基本要点
1、触发时机:指定触发器的触发时间。
                       before,表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;
                       after,   表示在执行DML操作之后触发,以便记录该操作或做某些事后处理。
2、触发事件:引起触发器被触发的事件,即DML操作(INSERT、UPDATE、DELETE)
3、条件谓词:当在触发器中包含多个触发事件的组合时,为了分别针对不同的事件进行不同的处理
      1)inserting
      2)updating('字段名')
      3)deleting
4、触发对象:指定触发器是创建的表、视图
5、触发类型:语句 / 行触发器
6、触发条件:when子句,只允许在行级触发器上指定触发条件,指定updating后面的列的列表。

存储过程

PL/SQL是Oracle在标准SQL语言上的过程性扩展。存储过程是Oracle数据库的一种对象,是一种带名的PL/SQL过程程序块,是能完成一定操作的一组SQL语句,它在创建后,以编译了的形式存储在数据库中,可以被有权用户在任何需要的地方调用。
不仅允许嵌入SQL语句,而且允许定义变量和常量,允许过程语言结构(条件分支语句和循环语句),允许使用处理Oracle异常。
PL/SQL最主要的功能是提供了一种服务器端的存储过程语言,安全、强健、易于使用。
存储过程的优点:
第一,大大提高效率。存储过程本身的执行速度很快,而且,调用存储过程可以大大减少同数据库的交互次数,减少网络开销。
第二,提高安全性。假如将SQL语句混合在JSP代码中,一旦代码失密,同时也就意味着数据库结构失密。
第三,有利于SQL语句的重用。

存储过程的基本语法
CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数 [IN|OUT|IN OUT] 数据类型...)]
{ AS | IS } 
[说明部分]
BEGIN
可执行部分
[EXCEPTION 异常处理部分]
END [过程名];

注:参数部分用于定义多个参数(没有参数可省略)。参数有三种形式:IN、OUT和IN OUT。
       没有指明参数的形式,默认为IN。IN表示向存储过程传递参数,OUT表示从存储过程返回参数。而IN OUT 表示传递参数和返回参数;
        IN       定义一个输入参数变量,用于传递参数给存储过程 
        OUT   定义一个输出参数变量,用于从存储过程获取数据 
        IN OUT 定义一个输入、输出参数变量,兼有以上两者的功能 
        
存储过程执行:
execute 存储过程名字        -SQL*PLUS窗口  在命令窗口执行
call 存储过程名字(参数)      -SQL WINDOW    在sqlWINDOW下执行

删除存储过程: DROP PROCEDURE 存储过程名; 

函数

一、概述
1、函数与存储过程的不同点
(1)、函数是一个必须有返回值的过程。
(2)、存储过程只能作为一个pl/sql语句调用,而函数不但可以作为pl/sql语句调用,符合约束的函数还可以作为sql表达式的一部分使用。
(3)、对于无参函数的定义和调用都没有圆括号,但无参存储过程调用需要加括号。

2、函数与存储过程的相同点
(1)、都存储在数据库中,并且可在块中调用,代码都有定义部分、可执行部分、异常处理部分。
(2)、都有in,out,in out三种参数,都可以使用缺省值,都可以通过out模式返回一个或多个值。
(3)、都可以使用位置表示法和名称表示法。

1、基础语句: 
create [or replace] function <function name>[(param1, param2)] 
return <datatype>                          --函数返回值的数据类型,不能指定长度
is|as 
[local declarations] 
begin 
[executable statements; ]
return result;                                 --函数返回结果
exception
[exception handlers; ]
end; 
2 、删除函数:drop function 函数名;
-----------------------------------------------------------------------------------------------------------
数据的导入导出        

    逻辑备份的导入导出
            exp(导出) :exp scott/root123@orcl file=文件路径
                                    exp scott/tiger file=employee.dmp tables=(emp,dept)
            imp(导入) :imp 用户  file =文件路径  fromuser=用户名 touser=用户名 ignore=y commit=y
                                    imp system/manager file=employee.dmp fromuser=scott touser=employee commit=y
     数据泵的导出
           (1)在system 下创建逻辑目录,依托于物理目录
                create directory 目录名_dir AS '文件路径';
           (2)授予查和改目录的权限
               grant read ,write on 目录名_dir to  用户;
           (3)查看目录
               select  *  from dba_directorices
           (3)导出文件
               expdp 用户名 directory=目录名_dir dumpfile=文件名 schema=用户 logfile=文件名
                eg:expdp scott/root123@orcl directory=expnc_dir dumpfile=emp.dmp schemas=scott logfile =emp.log
           (4)impdp directory=目录名_dir dumpfile=文件名  logfile=文件名
                eg:impdp scott/root123@orcl directory=expnc_dir dumpfile=emp.dmp  remap_schemas scoot:system  logfile =emp.log;
     sql loader
          (1)导出数据    -----在comm
              set line 1000         --设置行的长度
              set pagesize 0        --输出不换页
              set feedback off      --默认的当一条sql发出的时候,oracle会给一个反馈,比如说创建表的时候,如果成功命令行会返回类似:Table created的反馈,off后不显示反馈
              set heading off       --不显示表头信息
              set trimspool on      --如果trimspool设置为on,将移除spool文件中的尾部空
              set trims on            --去掉空字符
              set echo off       --显示start启动的脚本中的每个sql命令,缺省为on
              set colsep '|'         --设置分隔符
              set termout off
             --------文件导出的命令
                    spool  文件路径
                       select * from 表;
                       spool off
                       exit
          (2)导入
                    (1)建立4个文件夹 data ,log ,ctl, bad
                    (2)写出控制命令.ctl格式,保存到ctl文件夹中(建立文件与字段的对应关系)
                            load  data
                            infile ‘文件路径’
                            badfile  '文件名'
                            replace into  table 表
                            fileds termianted by
                            TRAILING  NULLCOLS
                            ( 字段   trim(:字段)
                               .........
                               )
                    (3)执行命令
                        sqlldr zhangsan/root123@orcl control=D:\daochu\ctl\student.ctl log=D:\daochu\log\student.log bad=D:\daochu\bad\student.bad data=D:\daochu\data\d.txt
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值