oracle学习

来源:互联网 发布:日本老龄化数据 编辑:程序博客网 时间:2024/06/05 03:35

SQL Plus常用命令

1.set linesize 200

set linesize 可以设置一行的字符数,默认为80个字符

2.l(List)

可以显示缓存区中的最后执行的内容

3.run / r

重新运行缓存区中的语句

4.save

save可以将最后一次在缓存区中执行的语句保存到文件

5.get

get可以将文件中的sql语句放到缓存区中,采用/或r或run,可以执行

6.ed(edit)

ed可以采用记事本来编辑缓存区中的内容

7.如何直接执行sql脚本

@c:\emp.sql;

 

数据处理函数

Lower

转换小写

upper

转换大写

substr

取子串

length

取长度

trim

去空格

to_date

将字符串转换成日期

to_char

将日期或数字转换成字符串

to_number

将字符串转换成数字

nvl

可以将null转换成一个具体值

case

分支语句

decode

同case

round

四舍五入

 

1.lower

l        查询员工,将员工姓名全部转换成小写

select lower(ename) from emp;

2.expper

l         查询job为manager的员工

select * from emp where job=upper('manager');

3.substr

l         查询姓名以M开头所有的员工

select * from emp where substr(ename, 1, 1)=upper('m');

 

4.length

l         取得员工姓名长度为5的

select length(ename), ename from emp where length(ename)=5;

5.rim

trim会去首尾空格,不会去除中间的空格

l         取得工作岗位为manager的所有员工

select * from emp where job=trim(upper('manager  '));

 

6.to_date

l         查询1981-02-20入职的员工(第一种方法,与数据库的格式匹配上)

select * from emp where HIREDATE='20-2月 -81';

l         查询1981-02-20入职的员工(第二种方法,将字符串转换成date类型)

select * from emp where hiredate=to_date('1981-02-20', 'YYYY-MM-DD');

等同

select * from emp where hiredate=to_date('1981-02-20 00:00:00', 'YYYY-MM-DD ');

默认为0时0分0秒

to_date可以将字符串转换成日期,具体格式to_date(字符串,匹配格式)

日期格式的说明

控制符(不区分大小写)

说明

YYYY

表示年

MM

表示月

DD

表示日

HH12,HH24

表示12小时制,表示24小时制

MI

表示分

SS

表示秒

 

7.to_char

l         查询1981-02-20以后入职的员工,将入职日期格式化成yyyy-mm-dd hh:mm:ss

select empno, ename, to_char(hiredate, 'yyyy-mm-dd hh24:mi:ss') as hiredate from emp;

8.to_number

将字符串转换成数值

select * from emp where sal>to_number('1,500', '999,999');

9.round

四舍五入

select round(2345343.1234, 2) from dual;

Dual是oracle提供的,主要为了方便使用,因为select的时候需要用from

 

Group by

l         取得每个工作岗位的工资合计,要求显示岗位名称和工资合计

select job, sum(sal) from emp group by job;

采用group by,聚合函数前面的所有字段必须参与分组

如果使用了order by,order by必须放到group by后面

   分组语句

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

 

删除表中重复的行如:

num,qtt

1      3

2      5

3      6

1      6

3      0

2      5

4      9

删除后效果:

1   3

2   5

3   6

4  9

delete from tab1 t where t.rowid not in (select  max(rowid) from tab1 t1 group by t1.num);

having

如果想对分组数据再进行过滤需要使用having子句

取得每个岗位的平均工资大于2000

select job, avg(sal) from emp group by job having avg(sal) >2000;

分组函数的执行顺序:

1、  根据条件查询数据

2、  分组

3、  采用having过滤,取得正确的数据

 

select语句总结:

一个完整的select语句格式如下

select 字段

from 表名

where …….

group by ……..

having …….

order by ……..

以上语句的执行顺序

1.         首先执行where语句过滤原始数据

2.         执行group by进行分组

3.         执行having对分组数据进行操作

4.         执行select选出数据

5.         执行order by排序

union和minus

union可以合并集合(相加)

1、查询job包含MANAGER和包含SALESMAN的员工

select * from emp where job in('MANAGER', 'SALESMAN');

2.采用union来合并

select * from emp where job='MANAGER'

union

select * from emp where job='SALESMAN'

 

minus可以移出集合(相减)

l         查询部门编号为10和20的,去除薪水大于2000的(第一种方法)

select * from emp where deptno in(10, 20) and sal<=2000;

l         查询部门编号为10和20的,去除薪水大于2000的(第二种方法,使用minus)

select * from emp where deptno in(10, 20)

minus

select * from emp where sal>2000

 

rownum隐含字段

取五条记录

select rownum,e.* from emp e where rownum <=5;

取得大与第5条的所有数据

select * from emp where rownum > 5;

以上语句,oracle不支持,oracle只支持rownum小于或小于等于的运算

select rownum,e.* from emp e where rownum <=5 order by e.sal desc;

上面的结果不正确,因为采用order by不会改变rownum,rownum的值在数据插入到表中时已经形成,正确使用的方式,将排序好的数据作为一张表来使用,这样这个表的rownum是新形成的,所以可以保证它的顺序是正确的,如下

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

 

采用rownum进行分页

分页主要是为了提高效率,一般采用数据库的机制比较多,主要从数据库表中定位记录的开始位置和结束位置,如每页两条数据:

第一页:记录1~2

第二页:记录3~4

。。。。。。。

因为rownum存在问题,所以需要采用三层的select嵌套完成分页,嵌套的目的将rownum转换成我们自己的字段,如:

select *

from

(select rownum r, t.* from (select * from emp ) t where rownum <=9) where r > 6;

 

 

删除:

1.删除表结构:

drop table tableName;

2.清空表数据:

truncate table tableName

 

建立索引

 

如经常根据birthday进行查询,并且遇到了性能瓶颈,首先查看程序是否存算法问题,再考虑对birthday建立索引,建立索引如下:

create index idx_t_student_birthday on t_student(birthday);

删除索引

drop index IDX_T_STUDENT_BIRTHDAY;

主键建立后,会相应的为主键建立索引,所以根据主键查询,通常比普通字段快

视图

如下示例:

select a.deptno, a.avg_sal, b.grade

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

where a.avg_sal between b.losal and b.hisal;

为什么使用视图?,因为需求决定以上语句需要在多个地方使用,如果频繁的拷贝以上代码,会给维护带来成本,视图可以解决这个问题

create view v_dept_avg_sal_grade as select a.deptno, a.avg_sal, b.grade

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

where a.avg_sal between b.losal and b.hisal;

出现了没有权限创建视图,必须授予scott用户能够创建事务的权限

如何查询当前用户拥有的权限?

select * from session_privs;

如何切换用户?

conn system/bjpowernode

如何查看当前用户是什么?

show user

如何让某个用户采用某种角色登录?

conn scott/tiger as sysdba;

如何对scott用户授权?

切换到system系统

conn system/bjpowernode

为scott用户授权

grant create view to scott;

切换到scott用户

conn scott/tiger

查询scott用户拥有的权限

select * from session_privs;

 

序列(Sequence)

序列是Oracle特有的,它可以维护一个自增的数字序列,通常从1开增长,但可以设置,例如:学生表t_student中的编号,可以采用Oracle的序列的方式来维护

还有一种经常使用的生成策略是Identity,如:Mysql/MS SQL Server

2.22.1、创建序列

create sequence seq_student_id start with 1 increment by 1;

使用序列

insert into t_classes(classes_id, classes_name) values(SEQ_STUDENT_ID.nextval, '603');

 

删除序列

drop sequence SEQ_STUDENT_ID;

 

存储过程、触发器和游标,循环

储过程

存储过程最直接的理解:就是保存了批量的sql(select,insert,if for),以后可以通过一个名字把这些批量的sql执行,使用存储过程在大批量数据查询或计算时会带来高性能,存储过程编写和调试比较复杂,不同数据库产品存储过程差异非常大,很难实现平滑一致

l         建立存储过程--查询

 

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. --使用游标创建查询返回单条记录的存储过程  
  2. create or replace procedure proc_test(in_var number,out_var out sys_refcursor)  
  3. as  
  4. begin  
  5.     open out_var for select * from emp where deptno=in_var;  
  6. end;   
  7. /  
  8. --执行存储过程  
  9. var ret refcursor  
  10. exec proc_test(20,:ret)  
  11. print :ret  

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. --使用游标创建查询所有数据的存储过程  
  2. create or replace procedure test(list in out sys_refcursor)is  
  3. begin  
  4. open list for select * from student;  
  5. end;  
  6. /  
  7. --执行存储过程  
  8. variable x refcursor  
  9. exec test(:x)  
  10. --将结果集打印  
  11. print x;  

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. --查询返回单条记录数据的存储过程  
  2. create or replace procedure test(in_id number)is  
  3. s_name varchar2(10);  
  4. begin  
  5. select name into s_name from student where id=in_id;  
  6. DBMS_OUTPUT.PUT_LINE(s_name);  
  7. end test;  
  8. /  
  9. 执行存储过程  
  10. SER SERVEROUTPUT ON  
  11. exe test(10);  

l         建立存储过程--新增

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. create or replace procedure addrow(in_id number,in_name varchar2,in_age number,in_sex varchar2)is  
  2. begin  
  3. insert into student(id,name,age,sex)values(in_id,in_name,in_age,in_sex);  
  4. end addrow;  
  5. /  
[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1.    
[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. <p>执行存储过程</p><p>exec addrow(37,'Jelod',20,'男')</p>  
[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 使用循环在存储过程中循环添加19到30号数据  
  2. create or replace procedure addrow is  
  3. i number;  
  4. begin  
  5. i:=19;  
  6. while i<=30 loop  
  7. i:=i+1;  
  8. insert into student (id,name,age,sex)values(i,'Jeelon'||i,i,'g'||i);  
  9. end loop;  
  10. commit;  
  11. end addrow;  
  12. /  
  13.   
  14. exec addrow;  


 

l         建立存储过程--修改


 

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. create or replace procedure modifyrow(in_id number,in_name varchar2,in_age number,in_sex varchar2)is  
  2. begin  
  3. update student set name=in_name,age=in_age,sex=in_sex where id=in_id;  
  4. if SQL%found then  
  5.     dbms_output.put_line('successly excute');  
  6.     commit;  
  7. else  
  8.     dbms_output.put_line('error to excute');  
  9. end if;  
  10. end modifyrow;  
  11. /  
  12. 执行存储过程  
  13. exec modifyrow(37,'天马',99,'男')  


 

l         建立存储过程--删除

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. create or replace procedure delrow(in_id number)is  
  2. begin  
  3. delete from student where id=in_id;  
  4. end delrow;  
  5. /  
  6. 执行存储过程  
  7. exec delrow(37)  


 

触发器

触发器是特殊的存储过程,它与数据库的insert、update和delete相关联,如定义完成触发器之后,会在insert、update或delete语句执行前或执行后自动执行触发器中的内容

 

触发器示例,向emp表中加入数据,采用触发器自动再向t_log表里加入一条数据

l         首先建立t_log表

create table t_log (

       log_id number(10) primary key,

       log_time date

)

 

l         为建立t_log的主键建立sequence

create sequence seq_log_id start with 1 increment by 1;

l         建立触发器

create or replace trigger tri_test

  after insert on emp

begin

   insert into t_log(log_id, log_time) values(seq_log_id.nextval, sysdate);

end;

 

l         向emp表中加入数据

insert into emp (empno, ename) values(9999, 'ls');

 

游标

游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
二  类型 
  Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。 
1. 隐式Cursor: 
1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。
2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含: 
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数 
SQL%FOUND  布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功 
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反 
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假 
3) 隐式Cursor是系统自动打开和关闭Cursor.

2. 显式Cursor: 
(1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含: 
游标的属性   返回值类型   意    义  
%ROWCOUNT   整型  获得FETCH语句返回的数据行数  
%FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假  
%NOTFOUND   布尔型 与%FOUND属性返回值相反  
%ISOPEN 布尔型 游标已经打开时值为真,否则为假  

(2) 对于显式游标的运用分为四个步骤: 
 定义游标---Cursor  [Cursorü Name]  IS; 
 打开游标---Open  [Cursor Name];ü 
 操作数据---Fetch  [Cursor name]ü 
 关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。ü 
(3)以下是三种常见显式Cursor用法。

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 1.  Set serveroutput on;     
  2. 2.      
  3. 3.  declare      
  4. 4.      ---define Cursor     
  5. 5.      Cursor cur_policy is    
  6. 6.       select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account     
  7. 7.       from t_contract_master cm     
  8. 8.       where cm.liability_state = 2     
  9. 9.       and cm.policy_type = 1     
  10. 10.      and cm.policy_cate in ('2','3','4')     
  11. 11.      and rownum < 5     
  12. 12.      order by cm.policy_code desc;     
  13. 13.     curPolicyInfo cur_policy%rowtype;---定义游标变量     
  14. 14. Begin    
  15. 15.    open cur_policy; ---open cursor     
  16. 16.    Loop      
  17. 17.      --deal with extraction data from DB     
  18. 18.      Fetch cur_policy into curPolicyInfo;     
  19. 19.      Exit when cur_policy%notfound;     
  20. 20.               
  21. 21.      Dbms_Output.put_line(curPolicyInfo.policy_code);     
  22. 22.    end loop;     
  23. 23.    Exception      
  24. 24.      when others then    
  25. 25.          close cur_policy;     
  26. 26.          Dbms_Output.put_line(Sqlerrm);     
  27. 27.               
  28. 28.    if cur_policy%isopen then       
  29. 29.     --close cursor      
  30. 30.       close cur_policy;     
  31. 31.    end if;     
  32. 32. end;     
  33. 33.     
  34. 34. /  


 

Ref Cursor(动态游标): 
1) 与隐式Cursor,显式Cursor的区别:Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。而另外两种Cursor,是静态的,在编译期间就决定数据结果集。
2) Ref cursor的使用: 
 Type [Cursor type name] is ref cursorü 
 Define 动态的Sql语句ü 
 Open cursorü 
 操作数据---Fetch  [Cursor name]ü 
 Close Cursorü

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. 1.  Set serveroutput on;     
  2. 2.      
  3. 3.  Declare    
  4. 4.      ---define cursor type name     
  5. 5.      type cur_type is ref cursor;     
  6. 6.      cur_policy cur_type;     
  7. 7.      sqlStr varchar2(500);     
  8. 8.      rec_policy t_contract_master%rowtype;     
  9. 9.  begin    
  10. 10.    ---define 动态Sql     
  11. 11.    sqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cm     
  12. 12.      where cm.liability_state = 2      
  13. 13.      and cm.policy_type = 1      
  14. 14.      and cm.policy_cate in (2,3,4)      
  15. 15.      and rownum < 5      
  16. 16.      order by cm.policy_code desc ';     
  17. 17. ---Open Cursor     
  18. 18.   open cur_policy for sqlStr;     
  19. 19.   loop     
  20. 20.        fetch cur_policy into rec_policy.policy_code, rec_policy.applicant_id, rec_policy.period_prem,rec_policy.bank_code,rec_policy.bank_account;     
  21. 21.        exit when cur_policy%notfound;     
  22. 22.             
  23. 23.        Dbms_Output.put_line('Policy_code:'||rec_policy.policy_code);     
  24. 24.        
  25. 25.   end loop;     
  26. 26. close cur_policy;         
  27. 27.     
  28. 28. end;     
  29. 29. /  


 

我们有时采用select会返回一个结果集,使用简单的select无法得到上一行,下一行,后5行,后10行,如果想做到这一点必须使用游标,游标是存储在数据库服务器上的一个数据库查询,它不是一条select语句,他是一个结果集,有了游标就可以根据需要滚动浏览数据了

 

下面通过一个示例,根据岗位加工资,如果是MANAGER增加20%的工资,如果是SALESMAN增加10%的工资,其他的增加5%的工资

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. create or replace procedure proc_sal  
  2. is  
  3.     cursor c is   
  4.         select * from emp for update;  
  5. begin  
  6.     for v_emp in c loop  
  7.         if (v_emp.job = 'MANAGER'then  
  8.             update emp set sal = sal + sal*0.2 where current of c;  
  9.         elsif (v_emp.job = 'SALESMAN'then   
  10.             update emp set sal = sal + sal*0.1 where current of c;  
  11.         else  
  12.             update emp set sal = sal + sal*0.05 where current of c;  
  13.         end if;  
  14.           
  15.     end loop;   
  16.     commit;  
  17. end;  
  18.   
  19. --执行存储过程  
  20. exec proc_sal;  


 

循环(只列出俩种常用的for和while循环

while循环

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. declare  
  2. i number;  
  3. begin  
  4. i:=0;  
  5. while i<10 loop  
  6. i:=i+1;  
  7. dbms_output.put_line('循环的次数是:'||i);  
  8. end loop;  
  9. end;  
  10. /  


 

for循环

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. begin  
  2. for i in reverse 1..20 loop --reverse 表示由大到小 不加reverse表示默认:由小到大循环  
  3. dbms_output.put_line('for循环:'||i);  
  4. end loop;  
  5. end;  
  6. /  


常用的DBA命令

 

查看用户拥有的数据库对象

select object_name from user_objects;

 

查看约束信息

select constraint_name from user_constraints;

 

查看用户拥有的表

select table_name from user_tables;

select * from tab;

 

查看用户拥有的视图

select view_name from user_views;

 

查看用户拥有的触发器

select trigger_name from user_triggers;

 

查看用户拥有的序列

select sequence_name from user_sequences;

 

查看用户拥有的存储过程

select object_name from user_procedures;

查看用户拥有的索引

select index_name from user_indexes;

 

显示当前用户

show user;

切换用户

conn system/bjpowernode;

将用户赋予某种角色登录

 

查看所有的用户

conn system/bjpowernode

select username from dba_users;

 

查看用户拥有的权限

select * from session_privs;

 

常用权限

CREATE SESSION

连接数据库

CREATE TABLE

创建表

CREATE VIEW

创建视图

CREATE SEQUENCE

创建序列

CREATE PROCEDURE

创建存储过程

CREATE TRIGGER

创建触发器

CREATE INDEXTYPE

创建索引

UNLIMITED TABLESPACE

对表空间的使用

 

给用户加锁

alter user scott account lock;

 

给用户解锁

alter user scott account unlock;

 

修改用户密码

alter user scott identified by test123;

新建用户

create user bbs identified by bbs123;

 

删除用户及相关对象

drop user test1 cascade;

 

给用户授权(多个采用逗号间隔)

grant create session, create table to bbs;

 

分配表空间usres给用户

create table t_test(id number(10), name varchar2(30))

以上出现无法创建表,主要原因在于没有分配表空间,也就是我们新建的表不知道放到什么地方。

alter user bbs default tablespace users;

 

 

授权表空间给用户

grant UNLIMITED TABLESPACE to bbs;

 

导入和导出命令imp、exp

首先赋予该用户dba的权限然后:

如:将数据库文件.DMP导入到yishiyiyi2011数据库中  

imp yishiyiyi2011/yishiyiyi@SID full=y file=fileLoad ignore=y

 

 导出同理.

exp yishiyiyi2011/yishiyiyi@SID full=y file=fileLoad

注意:yishiyiyi2011 是我要导出的数据库

 

另一种方式:

将数据库TEST完全导出,用户名system密码manager导出到D:\daochu.dmp中exp system/manager@TEST file=d:\daochu.dmp full=y
将D:\daochu.dmp 中的数据导入TEST数据库中
imp system/manager@TEST file=d:\daochu.dmp

只有DBA才能执行完整数据库或表空间的导出


 

删除表空间以及相应的数据文件

 drop tablespace xxxx including contents and datafiles;

 

查看各个表空间使用情况:

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. select b.tablespace_name,  
  2.        round(b.all_byte) all_byte,  
  3.        round(b.all_byte - a.free_byte) use_byte,  
  4.        round(a.free_byte) free_byte,  
  5.        100 - round((a.free_byte / b.all_byte) * 100) percent  
  6.   from (select tablespace_name,  
  7.                sum(nvl(bytes, 0)) / 1024 / 1024 / 1024 free_byte  
  8.           from dba_free_space  
  9.          group by tablespace_name) a,  
  10.        (select tablespace_name,  
  11.                sum(nvl(bytes, 0)) / 1024 / 1024 / 1024 all_byte  
  12.           from dba_data_files  
  13.          group by tablespace_name) b  
  14.  where b.tablespace_name = a.tablespace_name(+)  
  15.  order by 5 desc, 1;  


 

 

一个完整的过程,创建用户、创建表空间、授权、建表

l         创建用户

create user bbs identified by bbs123;

l         创建表空间

create tablespace ts_bbs datafile 'E:\bbs\bbs_data.dbf' size 100m;

l         将表空间分配给用户

alter user bbs default tablespace ts_bbs;

l         给用户授权

grant create session, create table, create view, create sequence, unlimited tablespace to bbs;

l         以bbs登陆建立表,tt

create table tt(

tt_id number(10)

);

 

[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. --判断是否存在表  
  2. select * from user_tables t where t.table_name = upper('diycolumn');  
  3. --判断是否存在表字段  
  4. select *  
  5.   from user_tab_columns t  
  6.  where t.table_name = upper('diycolumn')  
  7.    and t.column_name = upper('Columnid');  
  8. --判断是否存在主键  
  9.  select *  
  10.    from user_constraints t  
  11.   where t.table_name =upper('diycolumn')  
  12.     and t.constraint_type = 'P';  
[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /*根据内容查询存储过程、根据字段查询表明 互向*/  
[sql] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. SELECT * FROM ALL_SOURCE  where TYPE='PROCEDURE' AND TEXT LIKE '%insert into dqd_bsa_files_mid1%';  
  2. SELECT A.* FROM user_objects a where a.OBJECT_TYPE = 'TABLE';  
  3. SELECT A.* FROM all_tab_cols A where a.TABLE_NAME = 'DQD_BSA_FILES_ALL';  
  4. SELECT A.* FROM all_tables a where a.TABLE_NAME = 'DQD_BSA_FILES_ALL';  


 

Oracle基础知识

一、数据库名
什么是数据库名?

数据库名就是一个数据库的标识,就像人的身份证号一样。他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:
DB_NAME=myorcl
...
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。

数据库名的作用
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: d:\oracle\product\10.1.0\oradata\DB_NAME\...
Unix: /home/app/oracle/product/10.1.0/oradata/DB_NAME/...
pfile:
winnt: d:\oracle\product\10.1.0\admin\DB_NAME\pfile\ini.ora
Unix: /home/app/oracle/product/10.1.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora
跟踪文件目录:
winnt: /home/app/oracle/product/10.1.0/admin/DB_NAME/bdump/...
另外,在创建数据时,careate database命令中的数据库名也要与参数文件中DB_NAME参数的值一致,否则将产生错误。
同样,修改数据库结构的语句alter database, 当然也要指出要修改的数据库的名称。
如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也是指指DB_NAME。
还有在备份或恢复数据库时,都需要用到数据库名。
总之,数据库名很重要,要准确理解它的作用。

查询当前数据名
方法一:select name from v$database;
方法二:show parameter db
方法三:查看参数文件。

修改数据库名
前面建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。那么现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下:
1.关闭数据库。
2.修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
3.以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)

二、数据库实例名
什么是数据库实例名?
数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名。实例名也被写入参数文件中,该参数为instance_name,在winnt平台中,实例名同时也被写入注册表。
数据库名和实例名可以相同也可以不同。
在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。这一点在第一篇中已有图例说明。

查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
方法三:在参数文件中查询。

数据库实例名与ORACLE_SID
虽然两者都表是oracle实例,但两者是有区别的。instance_name是oracle数据库参数。而ORACLE_SID是操作系统的环境变量。 ORACLD_SID用于与操作系统交互,也就是说,从操作系统的角度访问实例名,必须通过ORACLE_SID。在winnt不台, ORACLE_SID还需存在于注册表中。
且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。

数据库实例名与网络连接
数据库实例名除了与操作系统交互外,还用于网络连接的oracle服务器标识。当你配置oracle主机连接串的时候,就需要指定实例名。当然8i以后版本的网络组件要求使用的是服务名SERVICE_NAME。这个概念接下来说明 。

三、数据库域名
什么是数据库域名?
在分布工数据库系统中,不同版本的数据库服务器之间,不论运行的操作系统是unix或是windows,各服务器之间都可以通过数据库链路进行远程复制,数据库域名主要用于oracle分布式环境中的复制。举例说明如:
全国交通运政系统的分布式数据库,其中:
福建节点: fj.jtyz
福建厦门节点: xm.fj.jtyz
江西: jx.jtyz
江西上饶:sr.jx.jtyz
这就是数据库域名。
数据库域名在存在于参数文件中,他的参数是db_domain.

查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询。

全局数据库名
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:oradb.fj.jtyz

四、数据库服务名(经常是orcl)
什么是数据库服务名?
从oracle9i版本开始,引入了一个新的参数,即数据库服务名。参数名是SERVICE_NAME。
如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。

查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
方法三:在参数文件中查询。

0 0
原创粉丝点击