oracle 常用脚本

SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL


select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id = o.object_id and l.session_id=s.sid;

alter system kill session 'sid,serial#'; 


获取单表的dll语句

set serveroutput on
 DECLARE
 TT varchar2(4000);
 begin
 tt := DBMS_METADATA.GET_DDL('TABLE','BASE_QYJBXX','QYZZSP');
 dbms_output.put_line(tt);
end;


1.得到一个表或索引的ddl语句
 
SELECT DBMS_METADATA.GET_DDL('TABLE','DEPT','SCOTT') FROM DUAL;
 
select dbms_metadata.get_ddl('INDEX','PK_DEPT','SCOTT') from dual;
 
2.得到一个用户下的所有表,索引,存储过程的ddl
 
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)
FROM USER_OBJECTS u
where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE');
 
3.得到所有表空间的ddl语句
 
SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)
FROM DBA_TABLESPACES TS;
 
4.得到所有创建用户的ddl
 
SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U;
 
================================================================================
 
9i  中可以利用DBMS_METADATA.GET_DDL包得到数据库的对象的ddl脚本。如下(SQLPLUS中执行):
 
a. 获取单个的建表、视图和建索引的语法
 
set pagesize 0
set long 90000
set feedback off
set echo off
spool DEPT.sql
select dbms_metadata.get_ddl('TABLE','TAB_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('VIEW','VIEW_NAME','SCOTT') from dual;
select dbms_metadata.get_ddl('INDEX','IDX_NAME','SCOTT') from dual;
spool off;
  
b.获取一个SCHEMA下的所有建表、视图和建索引的语法,以scott为例:
 
set pagesize 0
set long 90000
set feedback off
set echo off
spool schema.sql
connect scott/tiger;
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u;
 SELECT DBMS_METADATA.GET_DDL('VIEW',u.VIEW_name) FROM USER_VIEWS u;
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name) FROM USER_INDEXES u;
spool off;
 
c.    获取某个SCHEMA的建全部存储过程的语法
 
set pagesize 0
set long 90000
set feedback off
set echo off
spool procedures.sql 
select   DBMS_METADATA.GET_DDL('PROCEDURE',u.object_name) from     user_objects u where     object_type = 'PROCEDURE';
spool off;
 
d.    获取某个SCHEMA的建全部函数的语法
 
set pagesize 0
set long 90000
set feedback off
set echo off
spool function.sql 
select   DBMS_METADATA.GET_DDL('FUNCTION',u.object_name) from     user_objects u where     object_type = 'FUNCTION';
spool off;



打开sqlplus终端,或者任意的oracle客户端环境,执行以下SQL
 
create database link 链接名
 connect to 用户名 identified by 密码
   using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 要连接的IP)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = 数据库的SID) ))';
 
例如:
 
create database link idtsxxzsp
 connect to sxxzsp identified by sxxzsp
   using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 199.66.68.15)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = idt) ))';
 
建立连接之后,就可以通过(表名@链接名)访问对方(即任一端)的表。
 
例如
 
insert into designer_form1 select * from designer_form@idtsxxzsp  //把远端的的designer_from表数据全部插入到现连接的数据库中的designer_form1表中 。
 
insert into designer_form@idtsxxzsp select * from designer_form where id in (893,892,999) //这个是把本地数据有选择的插入到远端数据库中。(支持大对象)
 
所以这种方法可以实现案例。对于不同版本的oracle数据库,一样适用。


select a.owner, --主键拥有者 
        a.table_name, --主键表 
        b.column_name, --主键列 
        c.OWNER, --外键拥有者 
        c.table_name, --外键表 
        d.column_name --外键列 
        ,a.constraint_name--约束名
        ,b.constraint_name--约束名
        ,c.constraint_name--约束名
 from user_constraints  a 
 left join user_cons_columns b  
             on  a.constraint_name=b.constraint_name 
 left join user_constraints c  
             on c.R_CONSTRAINT_NAME=a.constraint_name 
 left join user_cons_columns d 
             on c.constraint_name=d.constraint_name 
 where  a.constraint_type='P' 
     and  a.table_name='PROCESS_QYTZZZS' --需要查看主外键关系的表 
 order by a.table_name;
 
 查询各种约束
 
user_constraints            all_constraints           dba_constraints
 
 
 
select * from user_constraints where constraint_type='R'
 
select * fromALL_constraints where constraint_type='P'
 
select * from dba_constraintswhere constraint_type='C'

 
  CREATE TABLESPACE QYZZ DATAFILE
  'C:\APP\MINGCHEN\PRODUCT\11.2.0\DBHOME_1\DATABASE\QYZZ.DBF' SIZE 209715200
  AUTOEXTEND ON NEXT 104857600 MAXSIZE 32767M
 
 
 二、死锁的原理
 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提
 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态,
 此时的现象是这条语句一直在执行,但一直没有执行成功,也没有报错。
 三、死锁的定位方法
 通过检查数据库表,能够检查出是哪一条语句被死锁,产生死锁的机器是哪一台。
 1)用dba用户执行以下语句
 select username,lockwait,status,machine,program from v$session where sid in
 (select session_id from v$locked_object)
 如果有输出的结果,则说明有死锁,且能看到死锁的机器是哪一台。字段说明:
 Username:死锁语句所用的数据库用户;
 Lockwait:死锁的状态,如果有内容表示被死锁。
 Status: 状态,active表示被死锁
 Machine: 死锁语句所在的机器。
 Program: 产生死锁的语句主要来自哪个应用程序。
 2)用dba用户执行以下语句,可以查看到被死锁的语句。
 select sql_text from v$sql where hash_value in
(select sql_hash_value from v$session where sid in
 (select session_id from v$locked_object))
 
四、死锁的解决方法
      一般情况下,只要将产生死锁的语句提交就可以了,但是在实际的执行过程中。用户可
 能不知道产生死锁的语句是哪一句。可以将程序关闭并重新启动就可以了。
  经常在Oracle的使用过程中碰到这个问题,所以也总结了一点解决方法。

1)查找死锁的进程:

sqlplus "/as sysdba" (sys/change_on_install)
 SELECT s.username,l.OBJECT_ID,l.SESSION_ID,s.SERIAL#,
 l.ORACLE_USERNAME,l.OS_USER_NAME,l.PROCESS
FROM V$LOCKED_OBJECT l,V$SESSION S WHERE l.SESSION_ID=S.SID;
 
2)kill掉这个死锁的进程:

  alter system kill session ‘sid,serial#’; (其中sid=l.session_id)

3)如果还不能解决:

select pro.spid from v$session ses,v$process pro where ses.sid=XX and ses.paddr=pro.addr;
 
  其中sid用死锁的sid替换: exit
 ps -ef|grep spid
 
  其中spid是这个进程的进程号,kill掉这个Oracle进程

 
 
SELECT   bs.username "Blocking User", bs.username "DB User",
         ws.username "Waiting User", bs.SID "SID", ws.SID "WSID",
         bs.serial# "Serial#", bs.sql_address "address",
         bs.sql_hash_value "Sql hash", bs.program "Blocking App",
         ws.program "Waiting App", bs.machine "Blocking Machine",
         ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
         ws.osuser "Waiting OS User", bs.serial# "Serial#",
         ws.serial# "WSerial#",

         DECODE (wk.TYPE,
                 'MR', 'Media Recovery',
                 'RT', 'Redo Thread',
                 'UN', 'USER Name',
                 'TX', 'Transaction',
                 'TM', 'DML',
                 'UL', 'PL/SQL USER LOCK',
                 'DX', 'Distributed Xaction',
                 'CF', 'Control FILE',
                 'IS', 'Instance State',
                 'FS', 'FILE SET',
                 'IR', 'Instance Recovery',
                 'ST', 'Disk SPACE Transaction',
                 'TS', 'Temp Segment',
                 'IV', 'Library Cache Invalidation', 
                 'LS', 'LOG START OR Switch',
                 'RW', 'ROW Wait',
                 'SQ', 'Sequence Number',
                 'TE', 'Extend TABLE',
                 'TT', 'Temp TABLE',
                 wk.TYPE ) lock_type,
         DECODE (hk.lmode,
                 0, 'None',
                 1, 'NULL',
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE', 
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (hk.lmode)
                ) mode_held,
         DECODE (wk.request,
                 0, 'None',
                 1, 'NULL', 
                 2, 'ROW-S (SS)',
                 3, 'ROW-X (SX)',
                 4, 'SHARE', 
                 5, 'S/ROW-X (SSX)',
                 6, 'EXCLUSIVE',
                 TO_CHAR (wk.request)
                ) mode_requested,
         TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
         DECODE
            (hk.BLOCK,
             0, 'NOT Blocking',         /**//* Not blocking any other processes */
             1, 'Blocking',             /**//* This lock blocks other processes */
             2, 'Global',          /**//* This lock is global, so we can't tell */
             TO_CHAR (hk.BLOCK)
            ) blocking_others
    FROM v$lock hk, v$session bs, v$lock wk, v$session ws
   WHERE hk.BLOCK = 1
     AND hk.lmode != 0
     AND hk.lmode != 1
     AND wk.request != 0
     AND wk.TYPE(+) = hk.TYPE
     AND wk.id1(+) = hk.id1
     AND wk.id2(+) = hk.id2
     AND hk.SID = bs.SID(+)
     AND wk.SID = ws.SID(+)
     AND (bs.username IS NOT NULL)
     AND (bs.username <> 'SYSTEM')
     AND (bs.username <> 'SYS')
ORDER BY 1;

 
 
 
 
 
 
 
 
 
  Oracle级联删除可以使用触发器来实现,但是实现起来会比较麻烦,最简单的就是直接建立表的主外键关系,给列设置级联删除。

——创建了CLASS表,并设置ID字段为主键。

-- Create table

create table CLASS   (   ID VARCHAR2(2) not null,   CLASS_NAME VARCHAR2(20)   )   alter table CLASS   add constraint PK_CLASS primary key (ID) ——创建了STUDENTS表,并设置ID字段为主键,CLASS_ID为外键且有级联删除。

-- Create table

create table STUDENTS   (   ID VARCHAR2(4) not null,   CLASS_ID VARCHAR2(2) not null,   STU_NAME VARCHAR2(20),   STU_AGENUMBER   )   alter table STUDENTS   add constraint PK_STU primary key (ID)   alter table STUDENTS   add constraint FK_STU foreign key (CLASS_ID)   references CLASS (ID) on delete cascade; 这样删除了班级ID,所属的学生都会被删除。这就实现了Oracle的级联删除。


禁用外键
select 'alter table '|| t.table_name||' disable constraint '||t.constraint_name||';'
from user_constraints t where t.constraint_type = 'R'
order by t.table_name

启用外键

select 'alter table '|| t.table_name ||' enable constraint '||t.constraint_name||';'
from user_constraints t where t.constraint_type = 'R'
order by t.table_name


4.删除所有外键约束, 使用下面的sql生成对应sql脚本:

select 'alter table ' || table_name || ' drop constraint ' || constraint_name || ';' from user_constraints where constraint_type = 'R';
 
 
exp qyzz/qyzz@orcl file=d:\exp20130410.dmp log=d:\exp_20130410.log


//强制数据库分配表空间
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
//设置后新表就能导出了,之前的不行
alter system set deferred_segment_creation=false scope=both;



1、创建表的同时创建主键约束
(1)无命名
create table student (
studentid int primary key not null,
studentname varchar(8),
age int);
(2)有命名
create table students (
studentid int ,
studentname varchar(8),
age int,
constraint yy primary key(studentid));


2、删除表中已有的主键约束
(1)无命名
可用 SELECT * from user_cons_columns;
查找表中主键名称得student表中的主键名为SYS_C002715
alter table student drop constraint SYS_C002715;
(2)有命名
alter table students drop constraint yy;


3、向表中添加主键约束
alter table student add constraint pk_student primary key(studentid);


、创建索引
 
create Index IX_xxxx   on table_name (colummname);


怎样建立最佳索引?
 
1、明确地创建索引
 
create index index_name on table_name(field_name)
 
tablespace tablespace_name
 
pctfree 5
 
initrans 2
 
maxtrans 255
 
storage
 
(
 
minextents 1
 
maxextents 16382
 
pctincrease 0
 
);
 
 
 
2、创建基于函数的索引
 
常用与UPPER、LOWER、TO_CHAR(date)等函数分类上,例:
 
create index idx_func on emp(UPPER(ename)) tablespace tablespace_name;
 
 
 
3、创建位图索引
 
对基数较小,且基数相对稳定的列建立索引时,首先应该考虑位图索引,例:
 
create bitmap index idx_bitm on class (classno) tablespace tablespace_name;
 
 
 select 'create bitmap index ' || table_name || '_IDX_BITM on ' || table_name || '(LIUSHUIHAO) tablespace qyzzsp' from user_tables  t where t.TABLE_NAME like 'PROCESS%'; 


 
 
4、明确地创建唯一索引
 
可以用create unique index语句来创建唯一索引,例:
 
create unique index dept_unique_idx on dept(dept_no) tablespace idx_1;
 
 
 
5、创建与约束相关的索引
 
可以用using index字句,为与unique和primary key约束相关的索引,例:
 
alter table table_name
 
add constraint PK_primary_keyname primary key(field_name)
 
using index tablespace tablespace_name;
 
 
 
如何创建局部区索引?
 
1)基础表必须是分区表
 
2)分区数量与基础表相同
 
3)每个索引分区的子分区数量与相应的基础表分区相同
 
4)基础表的自分区中的行的索引项,被存储在该索引的相应的自分区中,例如
 
create index TG_CDR04_SERV_ID_IDX on TG_CDR04(SERV_ID)
 
Pctfree 5
 
Tablespace TBS_AK01_IDX
 
Storage(
 
MaxExtents 32768
 
PctIncrease 0
 
FreeLists 1
 
FreeList Groups 1
 
)
 
local
 
/
 
 
 
如何创建范围分区的全局索引?
 
基础表可以是全局表和分区表
 
create index idx_start_date on tg_cdr01(start_date)
 
global partition by range(start_date)
 
(partition p01_idx vlaues less than ('0106')
 
partition p01_idx vlaues less than ('0111')
 
...
 
partition p01_idx vlaues less than ('0401'))
 
/
 
 
 
如何重建现存的索引?
 
重建现存的索引的当前时刻不会影响查询
 
重建索引可以删除额外的数据块
 
提高索引查询效率
 
alter index idx_name rebuild nologging;
 
对于分区索引
 
alter index idx_name rebuild partition partition_name nologging;
 
 
 
删除索引的原因?
 
1)不再需要的索引
 
2)索引没有针对其相关的表所发布的查询提供所期望的性能改善
 
3)应用没有用该索引来查询数据
 
4)该索引无效,必须在重建之前删除该索引
 
5)该索引已经变的太碎了,必须在重建之前删除该索引
 
语句:
 
drop index idx_name;
 
drop index idx_name partition partition_name;
 
 
 
建立索引的代价?
 
基础表维护时,系统要同时维护索引,不合理的索引将严重影响系统资源,
 
主要表现在CPU和I/O上。
 
插入、更新、删除数据产生大量db file sequential read锁等待。



oracle修改表增加列删除列修改列  2011-05-03 12:41:53|  分类: oracle |  标签: |字号大

小 订阅
tag:oracle修改表;sql增加列;sql删除列;sql修改列

1.增加列

ALTER TABLE table_name ADD( column datatype [DEFAULT EXPR][,column datatype...]);

例如:

SQL>ALTER TABLE emp01 ADD eno NUMBER(4);


2.修改列定义

例如:

SQL>ALTER TABLE emp01 MODIFY job VARCHAR2(15)

2    DEFAULT 'CLERK'


3.删除列

例如:

SQL> ALTER TABLE emp01 DROP COLUMN dno;


4.修改列名

例如:

SQL>ALTER TABLE emp01 RENAME COLUMN eno TO empno;


5.修改表名

例如:

SQL>RENAME emp01 TO employee;


6.增加注释

例如:

SQL>COMMENT ON TABLE employee IS '存放雇员信息';

SQL>COMMENT ON TABLE employee.name IS '描述雇员姓名';


修改用户

system

密码为以前的值

alter user system identified by values '2D594E86F93B17A1';


select 'drop table ' || table_name ||';'||chr(13)||chr(10) from user_tables; 
--delete tablesselect 'drop view ' || view_name||';'||chr(13)||chr(10) from user_views;
 --delete viewsselect 'drop sequence ' || sequence_name||';'||chr(13)||chr(10) from user_sequences;
 --delete seqsselect 'drop function ' || object_name||';'||chr(13)||chr(10) from user_objects  where object_type='FUNCTION';
 --delete functionsselect 'drop procedure ' || object_name||';'||chr(13)||chr(10) from user_objects  where object_type='PROCEDURE';
 --DELETE PROCEDUREselect 'drop package ' || object_name||';'||chr(13)||chr(10) from user_objects  where object_type='PACKAGE';--delete pags
 
 
 
 
 create tablespace bjjs datafile 'C:\app\mingchen\product\11.2.0\dbhome_1\database\qyzzsp.dbf' size 200m autoextend on next 10m maxsize unlimited;
alter database datafile 'C:\app\mingchen\product\11.2.0\dbhome_1\database\qyzzsp.dbf' autoextend on;


Select r.table_name table_name ,p.table_name ref_table_name From User_Constraints r,User_Cons_Columns p Where r.constraint_type = 'R' And r.r_constraint_name = p.constraint_name And  ( p.table_name = upper('PROCESS_TASK')  or   p.table_name = upper('PROCESS_NODE') or  p.table_name = upper('PROCESS_BUSINESS'))   and r.table_name not in('PROCESS_NODE','PROCESS_TASK')

你可能感兴趣的:(oracle)