oracle数据库开发的一些经验积累(一)

1、不安装Oracle客户连接Oracle 8的方法

请将以下文件拷贝到运行文件所在目录

一、ODBC动态库 :

ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll

二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下

EXTRA\MSVCRT.DLL

三、ORACLE动态库及配置文件

Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora Sqltnsnt.dll CORE35.DLL

四、PB动态库

pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll

Oracle的客户端不安装让pb连上,我记得以前有帖子的,你可以搜索一下。
具体步骤。
(1).先在某机器上安装好客户端(最好安装在c盘);
(2).复制此客户端oracle目录下的所有文件作为独立的oracle安装文件;
(3).搜索注册表,找到 HKey_Local_machine\software\oracle,把此项目及分支全部导出。
(4).打包好你的pb程序,并独立打包好oracle客户端和注册表导出文件。
(5).到干净的客户端,解开两个包,导入注册表文件,然后加入路径支持:
path=%path%;"c:\Ora817\bin"
这样处理,应该没有问题,因为我就是这样快速处理了几十个机器。

若不想搞注册表,你可以在程序中自己写注册表,构成Oracle客户端必要的注册表支持,至于路径,手工添加应该不难。

至于Oracle客户端那些文件不需要,这个不好说,你可以把那些bin目录下的所有exe删除,Oracle Document删除(7x兆)

至于定义Oracle服务,找到 Ora817\net80\admin\TnsName.ora,参照格式,程序中生成一个也不麻烦。

=======================================================
2、在ORACLE中返回游标结果集

你需要写到一个包中:
create or replace package pag_cs_power as

type c_Type is ref cursor;

FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type;

end pag_cs_power;

函数代码:

FUNCTION FUN_CS_GETDICTLIST(
v_DictIndex in varchar2) return c_Type
as
c_cursor c_Type;
begin
open c_cursor for
select DICTID,DICTNAME FROM SYS_DICT WHERE DICTINDEX = v_DictIndex;
return c_cursor;
end FUN_CS_GETDICTLIST;
----------------------------------------------------------------------
3、P4机器安装ORACLE

(1)、将ORACLE安装软件拷贝到硬盘。
(2)、将 硬盘目录文件\stage\Components\oracle.swd.jre\1.1.7.30/1
\DataFiles\Expanded\jre\win32\bin\symcjit.dll的文件改名为symcjit.old
(3).再运行SETUP.exe 文件进行安装。

-----------------------------------------------------------------------
4、单引号的插入问题

SQL> insert into a values('i''m good'); --两个''可以表示一个'

SQL> insert into a values('i'||chr(39)||'m good'); --chr(39)代表字符'

SQL> insert into a values('a'||'&'||'b');

-----------------------------------------------------------------------
5、全数据库的导入与导出

exp username/password full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

6、exp与imp的具体用法

exp username/password@mzbs_61 full=y file=yourdata.dmp grants=y rows=y
imp username/password full=y ignore=y file=yourdata.dmp grants=y

exp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y rows = y
imp mzbs/mzbs@mzbs_61 file = c:\zzzzzzz.dmp grants = y ignore=y FULL=Y

(1)

exp参数:
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小
OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 表名列表
COMPRESS 导入一个范围 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句

imp参数:
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
TOID_NOVALIDATE 跳过指定类型 id 的校验
FILESIZE 各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)

(2)

一、建立一个expdata.sql文件

USERID=RMTAFIS/3 这里写你的用户名和密码
BUFFER=32768
OWNER=RMTAFIS 这里写导出的用户
FILE=E:\Exp\RMTAFIS.DMP 导出的文件,可以是相对路径
ROWs=Y
GRANTS=Y
COMPRESS=Y
CONSISTENT=Y

二、建立一个expdata.bat
exp parfile=expdata.sql
如果是805
exp80 parfile=expdata.sql
双击expdata.bat就导出数据了

7、如果在like的变量中,是以‘%’开头的话,是不会使用index的。反之,不是以‘%‘开头,而又有相应的index,是会使用index的。具体可以用plain plan来看一下。

8、复制空表结构
create table new_table
as select * from old_table where 1=2;
复制表(含记录)
create table new_table
as select * from old_table ;

9、把一个用户下的表导入到另一个用户下,但需要改名

先用exp导出所有的表;
用imp将导出的表导入到新用户;
在新用户下,执行
select 'RENAME TABLE '||tname||' TO NEW_'||tname||';'
from tab
where tabtype='TABLE';
将上面的查询结果保存到一个sql文件中,处理后执行就可以了。

10、审计步骤

修改参数文件init.ora,参数audit_trail值为true;
重新启动数据库;
打开审计audit session; (audit session by username)
执行登录操作;
察看审计结果:
select * from dba_audit_session;
select * from sys.aud$;
select * from dba_audit_trail;
select * from dba_audit_exists;
关于审计:

为了使oracle8i的审计功能可用,必须在数据库参数文件中修改audit_trail初始参数,而这个修改并不支配oracle8i把生成的审计记录记入审计痕迹中,
由于状态,特权和模式对象已被修改,因而审计的默认值不可用,其参数应设置为none.下面列出了audit_trail 可用的参数

db_使数据库审计和全部直属审计记录到数据库审计的痕迹中
os_是数据库审计依据直属审计记入到操作系统的审计很集中
none_不可用

11、BFILE的用法

(1)、create or replace directory
BFILE_TEST
as
'/oracle/oradata/bfiles';

(2)、grant read on directory BFILE_TEST to SCOTT;

(3)、host ls -l /oracle/oradata/bfiles/1.TXT

(4)、connect SCOTT/TIGER
create table BFILES (ID number, TEXT bfile );

(5)、insert into BFILES values ( 1,
bfilename ( 'BFILE_TEST', '1.TXT' ) );

12、如何在Windows 2000下将Oracle完全卸载?

一、系统环境:
(1)、操作系统:Windows 2000 Server,机器内存128M
(2)、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
(3)、安装路径:D:\ORACLE

二、卸载步骤:
(1)、开始->设置->控制面板->管理工具->服务
停止所有Oracle服务。

(2)、开始->程序->Oracle - OraHome81->Oracle Installation Products->Universal Installer
卸装所有Oracle产品

(3)、运行regedit,选择HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE,按del键删除这个入口。

(4)、运行regedit,选择HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services,滚动这个列表,删除所有Oracle入口

(5)、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标

(6)、重新启动计算机,重起后才能完全删除Oracle所在目录

(7)、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:\Oracle,删除这个入口目录及所有子目录,

并从Windows 2000目录(一般为C:\WINNT)下删除以下文件

ORACLE.INI、oradim80.INI

(8)、WIN.INI文件中若有[ORACLE]的标记段,删除该段

--------------------------------------------------------------------
13、如何使用SQLPLUS和SVRMGRL运行脚本

(1)、用sqlplus调用:

c:\script.txt的内容
startup;

命令行:sqlplus internal/oracle @c:\script.txt

(2)、用svrmgrl调用:
c:\script.txt的内容

connect internal/oracle;
startup;

命令行:svrmgrl @c:\script.txt

--------------------------------------------------------------------
14、ORACLE的临时表

CREATE GLOBAL TEMPORARY TABLE TABLENAME (
COL1 VARCHAR2(10),
COL2 NUMBER
) ON COMMIT PRESERVE(DELETE) ROWS ;
这种临时表不占用表空间,而且不同的SESSION之间互相看不到对方的数据
在会话结束后表中的数据自动清空,如果选了DELETE ROWS,则在提交的时候即清空数据,PRESERVE则一直到会话结束

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

在Oracle8i中,可以创建以下两种临时表:
(1)会话特有的临时表
CREATE GLOBAL TEMPORARY

   1<table_name> (<column specification="">)   
   2ON COMMIT PRESERVE ROWS; 
   3
   4(2)事务特有的临时表   
   5CREATE GLOBAL TEMPORARY <table_name> (<column specification="">)   
   6ON COMMIT DELETE ROWS;   
   7CREATE GLOBAL TEMPORARY TABLE MyTempTable   
   8所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧,我把下面两句话再贴一下:   
   9\--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)   
  10\--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。   
  11冲突的问题更本不用考虑. 
  12
  13临时表只是保存当前会话(session)用到的数据,数据只在事务或会话期间存在。 
  14
  15通过CREATE GLOBAL TEMPORARY TABLE命令创建一个临时表,对于事务类型的临时表,   
  16数据只是在事务期间存在,对于会话类型的临时表,数据在会话期间存在。 
  17
  18会话的数据对于当前会话私有。每个会话只能看到并修改自己的数据。DML锁不会加到   
  19临时表的数据上。下面的语句控制行的存在性。   
  20  
  21● ON COMMIT DELETE ROWS 表名行只是在事务期间可见   
  22● ON COMMIT PRESERVE ROWS 表名行在整个会话期间可见 
  23
  24可以对临时表创建索引,视图,出发器,可以用export和import工具导入导出表的   
  25定义,但是不能导出数据。表的定义对所有的会话可见。 
  26
  27例如:   
  28CREATE GLOBAL TEMPORARY TABLE TEMP_TAB1(   
  29table_name VARCHAR2(20),   
  30primary_key VARCHAR2(100),   
  31field VARCHAR2(1000))   
  32ON COMMIT PRESERVE ROWS; 
  33
  34CREATE GLOBAL TEMPORARY TABLE TEMP_TAB2(   
  35table_name VARCHAR2(20),   
  36primary_key VARCHAR2(100),   
  37field VARCHAR2(1000))   
  38ON COMMIT DELETE ROWS; 
  39
  4015、如何使用OEM   
  41先启数据库服务,再启oracle manager服务。   
  42否则重建档案资料库   
  43如果还不行就把ORACLEHOME\NETWORK\sqlnet.ora文件的内容   
  44sqlnet.authentication_services=(NTS)   
  45改成sqlnet.authentication_services=(NONE) 
  46
  47登录 sysman/oem_temp 
  48
  4916、TNS:没有监听器的问题。 
  50
  51(1)查一下监听服务是否启动,   
  52如果没有启动,则运行lsnrctrl start。   
  53(2)查看一下 LISTENER.ORA内监听的服务器名、服务器IP、数据库名是否正确。   
  54(3)查看一下 TNSNAMES.ORA内服务器名、服务器IP、数据库名是否正确。 
  55
  5617、LINUX、UNIX下自动启动ORACLE服务 
  57
  58(1) 
  59
  60!/bin/sh 
  61
  62# chkconfig: 345 51 49   
  63# description: starts the oracle dabase deamons   
  64# 
  65
  66ORA_HOME=/u01/app/oracle/product/8.1.7   
  67ORA_OWNER=oracle   
  68case "$1" in   
  69'start')   
  70echo -n "Starting Oracle8i: "   
  71su - $ORA_OWNER -c $ORA_HOME/bin/dbstart   
  72touch /var/lock/subsys/oracle8i   
  73echo   
  74;; 
  75
  76'stop') 
  77
  78echo -n "Shutting down Oracle8i: "   
  79su - $ORA_OWNER -c $ORA_HOME/bin/dbshut   
  80rm -f /var/lock/subsys/oracle8i   
  81echo   
  82;; 
  83
  84'restart') 
  85
  86echo -n "Restarting Oracle8i: "   
  87$0 stop   
  88$0 start   
  89echo   
  90;; 
  91
  92*)   
  93echo "Usage: oracle8i { start | stop | restart }"   
  94exit 1 
  95
  96esac   
  97exit 0 
  98
  99我仿照su - $ORA_OWNER -c $ORA_HOME/bin/dbshut 的形式   
 100添加su - $ORA_OWNER -c $ORA_HOME/bin/lsnrctl start   
 101但是在系统启动的时候listener启动不了 
 102
 103(2) 
 104
 105/etc/rc.local   
 106改成如下就可以了   
 107touch /var/lock/subsys/local   
 108#echo 2147483648 &gt; /proc/sys/kernel/shmmax   
 109echo -n "Starting Oracle Database:"   
 110date +"%D %T %a"   
 111su - oracle -c "lsnrctl start"   
 112#su - oracle -c "sqlplus /nolog @startmaster.sql"   
 113echo -n "Oracle Database Started:"   
 114date +"%D %T %a"   
 115\-------------   
 116第一个#是改共享内存大小的   
 117第二个#是启动数据库的。 
 118
 119(3)   
 120ftp://ftp.rpmfind.net/linux/rhcontrib/7.1/i386/oraclerun9i-1.0-1.i386.rpm 
 121
 122下载这个软件包并安装。 
 123
 124里面每个文件都有一些要修改的地方。配置完成之后,就可以在系统服务配置中找到它,选中它就可能以自启动了。 
 125
 12618、回滚段不够的处理方法 
 127
 128(1)、先使回滚段脱机一个,   
 129如果不好用,则再脱机一个。直至好用。   
 130ALTER rollback segment rollbackname offline;   
 131(2)、增加回滚段数据文件的大小   
 132alter database datafile 'datafile' resize 200M; 
 133
 134  
 13519、WINNT向WIN2000移植 
 136
 137不用EXP和IMP的 
 138
 139停掉数据库的服务后,可以做一个数据库的全备份。 
 140
 141在WIN2000上建一个同名的数据库,随便建,越小越好,可以缩短时间。   
 142把WINNT下的数据库备份恢复到WIN2000的数据库上就可以了。但建库的目录   
 143必须一样。(也可以不一样,但需要更改数据文件的连接) 
 144
 145我曾多次为用户这样移植数据,万无一失的。   
 146注意:因为数据很重要,所以建议你先EXP备份一下。这是我们的习惯。 
 147
 148  
 14920、ORACLE SQL PLUS Worksheet乱码问题。 
 150
 151dbappscfg.properties,修改该文件即可解决上述问题。$ORACLE_HOME\sysman\config目录下,修改   
 152# SQLPLUS_NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1   
 153为SQLPLUS_NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。 
 154
 155对于Windows操作系统,还需要修改一项   
 156#SQLPLUS_SYSTEMROOT=c:\\\WINNT40   
 157为SQLPLUS_SYSTEMROOT=C:\\\WINNT 
 158
 159如操作系统的主目录在C盘的Winnt下 
 160
 161对于后面一项的修改只对Windows操作系统进行,对UNIX操作系统则不需要。如果在Windows操作系统中不修改该项,在Oracle Enterprise Manager中,连接系统时,会提示如下的错误:   
 162ORA-12560 TNS:protocol adapter error   
 163或者   
 164ORA-12545 Connect failed because target host or object does not exist   
 165重新连接SQL PLUS Worksheet 
 166
 167  
 16821、DROP掉名字是小写的表(用双引号括起来)。 
 169
 170drop table "tablename"   
 171select * from "tablename" 
 172
 17322、日期的显示格式   
 174注意:SIMPLIFIED CHINESE(简体中文需要" "括起来)   
 175别的国家不用" " 例如:ENGLISH   
 176select to_char(sysdate,'DAY','NLS_DATE_LANGUAGE=''SIMPLIFIED CHINESE''') from dual;   
 177\------------   
 178星期四   
 179\------------ 
 180
 18123、一个从ORACLE中读表信息的存储过程 
 182
 183可以在vc下调用存储过程来实现   
 184例子:   
 185先修改init.ora   
 186例如:   
 187utl_file_dir=/usr //路径为 oracle所在的盘:/usr   
 188此过程将用户TEMP的P1过程的代码保存到ORACLE安装盘下/USR/TEXT.TXT中   
 189create or replace procedure TEST   
 190is   
 191file_handle utl_file.file_type;   
 192STOR_TEXT VARCHAR2(4000);   
 193N NUMBER;   
 194I NUMBER;   
 195begin   
 196I:=1;   
 197SELECT MAX(LINE) INTO N FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1';   
 198file_handle:=utl_file.fopen('/usr','test.txt','a');   
 199WHILE I&lt;=N LOOP   
 200SELECT TEXT INTO STOR_TEXT FROM ALL_SOURCE WHERE OWNER='TEMP' AND NAME='P1' AND LINE= I;   
 201I:=I+1;   
 202utl_file.put_line(file_handle,stor_text);   
 203END LOOP;   
 204utl_file.fclose(file_handle);   
 205commit;   
 206end TEST;   
 207/ 
 208
 20924、关于修改ORACLE的列宽   
 210(1)、不论如何都要备份数据。   
 211(2)、如果没有数据,则可以修改宽度。比如NUMBER,CHAR,VARCHAR2   
 212(3)、如果有数据,则可以增加宽度。比如NUMBER,CHAR,VARCHAR2   
 213注意:不可以减小宽度。   
 214(4)、语法:alter talbe tablename modify columnname columntype not null; 
 215
 21625、如何查看用户的存储过程和函数 
 217
 218select name,text from user_source where name= Procedurename and type = 'PROCEDURE' order by line; 
 219
 22026、在批处理中自动启动ORACLE服务(win2000) 
 221
 222编一个批处理文件   
 223net start OracleServiceSID   
 224OracleServiceSID是ORACLE的实例名称 
 225
 22627、对行加锁时,只对tb1加锁 
 227
 228select tb1.r1 from tb1, tb2 where tb1.r2 = tb2.r2 and tb2.r1 = xxx for update of tb1.r1 nowait 
 229
 23028、得到列的信息 
 231
 232desc tablename   
 233select cname from col where tname='TABLENAME';   
 234select column_name from user_tab_columns where table_name='TABLENAME';   
 235select column_name from ALL_tab_columns where table_name='TABLENAME';   
 236select column_name from dba_tab_columns where table_name='TABLENAME';   
 237select column_name from user_col_comments where table_name='TABLENAME';   
 238select column_name from all_col_comments where table_name='TABLENAME';   
 239select column_name from dba_col_comments where table_name='TABLENAME'; 
 240
 24129、使触发器无效(login_on) 
 242
 243svrmgrl   
 244connect internal/oracle   
 245alter trigger login_on disable; 
 246
 247使触发器为无效alter trigger yourtriggername disable 
 248
 249如果是对于某一个表的所有的触发器:   
 250alter table yourtablename disable all triggers 
 251
 252  
 25330、如在SQLPLUS中何调用存储过程和函数。 
 254
 255call只能调用存储过程后面加上括号就可以了   
 256call 存储过程名();   
 257exec procedurename;(可以不加())   
 258调用函数用sql语句   
 259select 函数名(参数) from dual; 
 260
 26131、函数中如果调用DML语句就不可以调用SELECT语句 
 262
 26332、REDO LOG BUFFER 什么时候写到REDO LOGFILE中   
 264(1)、在COMMIT的时候   
 265(2)、重做日志缓冲区1/3满的时候   
 266(3)、重做日志缓冲区大于1M的时候   
 267(4)、它写信息必须是在数据写进程前调用   
 268(5)、一般CHECKPOINT在日志组切换的时候进行或者由初始化参数设定   
 269在CHECKPOINT的时候需要调用数据写进程 
 270
 27133、ORACLE的http server 把原有的WEB server冲掉,如何解决? 
 272
 273(1).如果你原来的http server是用IIS等其他发布工具做的,那么可以在服务中停掉 oracle http server服务,并且改为手动启动。   
 274(2).如果原来的http server是用apache发布,则可以改变http.conf中的参数 
 275
 27634、关于创建重建查看索引 
 277
 278  
 279创建索引:   
 280CREATE INDEX IND_NAME ON TABLE_NAME(COL1,COL2,...); 
 281
 282重建索引:   
 283ALTER INDEX IND_NAME REBUILD; 
 284
 285查看索引: 
 286
 287SELECT * FROM USER_INDEXES WHERE INDEX_NAME='IND_NAME'; 
 288
 28935、ORACLE如何查杀用户的进程   
 290  
 291一|根据用户的应用程序和SQL语句,在DBA STUDIO找到用户的SESSION并断开其连接   
 292  
 293二、   
 294  
 295(1)、要杀掉一个session应先应知道其sid和serial#,假设你已经知道。   
 296(2)、select paddr from v$session where sid=v_sid and serial#=v_serial#   
 297select spid from v$process where addr=paddr(以上语句所查出的); 
 298
 299(3)、使用ALTER SYSTEM KILL SESSION 'v_sid,v_serial#' immediate; 试一试如不行转   
 300  
 301三、LINUX和UNIX下   
 302转到操作系统下执行:kill -9 spid (以上语句所查出的)   
 303  
 30436、ORACLE中检查表是否被锁的语句 
 305
 306SELECT A.OWNER,   
 307A.OBJECT_NAME,   
 308B.XIDUSN,   
 309B.XIDSLOT,   
 310B.XIDSQN,   
 311B.SESSION_ID,   
 312B.ORACLE_USERNAME,   
 313B.OS_USER_NAME,   
 314B.PROCESS,   
 315B.LOCKED_MODE,   
 316C.MACHINE,   
 317C.STATUS,   
 318C.SERVER,   
 319C.SID,   
 320C.SERIAL#,   
 321C.PROGRAM   
 322FROM ALL_OBJECTS A,   
 323V$LOCKED_OBJECT B,   
 324SYS.GV_$SESSION C   
 325WHERE ( A.OBJECT_ID = B.OBJECT_ID )   
 326AND (B.PROCESS = C.PROCESS )   
 327ORDER BY 1,2   
 328杀掉:alter system kill session 'sid, serial#'   
 32937、ORACLE的登录问题,用户名和密码。 
 330
 331可以直接输入:   
 332internal/oracle@serivce_name   
 333sys/change_on_install@serivce_name   
 334system/manager@serivce_name   
 335scott/tiger@serivce_name   
 336注意:   
 3379i中没有internal/oracle   
 338如果选择典型安装则有 scott用户   
 339如果自定义可以不安装 scott用户   
 340如果是本机则可以省略@serivce_name 
 341
 342oem:(ORACLE ENTERPRISE MANAGER)   
 343sysman/oem_temp 
 344
 345  
 34638、修改表的列名 
 347
 348Oracle9i:   
 349alter table xxx rename column xx to yy; 
 350
 351Oracle8i &amp; lower version   
 352connect sys/passed;   
 353update col$ set name=xx where obj#=对象id and name = 字段   
 354(一般不要这样用,会造成意想不到的结果)   
 355注:最好是删除再建立新的列 
 356
 357  
 35839、把用户模式对象所在的表空间移到新的表空间   
 359(1). create the new tablesapce   
 360(2). alter user test default tablespace test_data;   
 361(3). alter user test quota unlimited on test_data;   
 362(4). alter table the_table_name move tablespace test_data;   
 363生成脚本:   
 364select 'alter table'||tname||' move tablespace test_date;'   
 365from tab   
 366where tabtype='TABLE'   
 367(5). rebuild the indexes; 
 368
 36940、使用OEM备份或者EXP的步骤   
 370WIN2000下: 
 371
 372(1). 控制面板――&gt;管理工具―― &gt;计算机管理――&gt;本地用户和组――&gt;用户――&gt;新建用户sys和sysman(sys和sysman 的帐号要和登陆数据库的帐号相同);   
 373(2).控制面板――&gt;管理工具―― &gt;本地安全策略――&gt;本地策略――&gt;用户权利指派――&gt;   
 374作为批处理作业登陆――&gt;添加sys和sysman两个帐号。   
 375(3).使用Enterprise Manager配置辅助工具   
 376开始→程序→Oracle - OraHome81→Enterprise Manager→Configuration Assistant   
 377a、使用Configuration Assistant工具来创建一个新的资料档案库。 
 378
 379(4).控制面板――&gt;管理工具―― &gt; 服务,查看OracleOraHome81ManagementServer是否启动,如果没有启动,则手动启动该服务。   
 380(5).以sysman/oem_temp(default)登陆DBA Studio   
 381(第二个选项:登陆到Oracle Management Server),立即修改密码为你刚才在NT下建的用户sysman的密码。   
 382(6). 以sysman/ *** (bluesky) 从开始→程序→Oracle - OraHome81→Console 登陆到 控制台。   
 383在 系统→首选项→首选身份证明(我的首选身份设置如下:)   
 384DEFAULT节点:name:sysman   
 385DEFAULT数据库:name:sys   
 386(7). 在搜索/添加结点后,以sysman/ *** 登陆到该结点,以sys/ *** as sysdba登陆数据库(也就是在首选身份设置的结果)。   
 387(8). 在工具→备份管理→向导→预定义备份策略(自定义备份策略)→提交备份计划   
 388(9).从开始→程序→Oracle - OraHome81→Console 登陆到 控制台,查看活动(历史记录)可以看到你的备份是否成功,如果不成功,可以点击备份看明细。(我第一次也没成功,后来我修改系统的临时目录C:\WINNT\Temp→c:\temp\systmp,重新启动机器就ok了) 
 389
 39041、如何修改INTERNAL的口令   
 391  
 392以下是oracle8的8i你可以仿照来做 
 393
 394(1)、进入DOS下 
 395
 396(2)、默认internal密码文件在c:\orant\database下,是隐藏属性,文件名称与数据库实例名有关 
 397
 398如默认ORACLE实例名为ORCL,则internal密码文件名为pwdorcl.ora 
 399
 400(3)、建立新的internal密码文件,起个新名字为pwdora8.ora 
 401
 402orapwd80 file=pwdora8.ora password=B entries=5 --注:password项一定要用大写,并且不要用单引号 
 403
 404(4)、拷贝pwdora8.ora文件到c:\orant\database目录下 
 405
 406(5)、运行regedit,修改口令文件指向 
 407
 408(6)、找到HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE项 
 409
 410定位ORA_ORCL_PWFILE子项,改变其值为c:\orant\database\pwdora8.ora 
 411
 412(7)、关闭ORACLE数据库,重新启动 
 413
 414(8)、进入svrmgr30服务程序,测试internal密码是否更改成功 
 415
 416  
 41742、凭证检索失败的决绝方法。 
 418
 419原因: 由于Oracle不能应用OS认证而导致凭证检索失败   
 420  
 421解决办法:   
 422  
 423(1).打开network/admin下的sqlnet.ora   
 424修改SQLNET.AUTHENTICATION _SERVICES=(NONE)。   
 425  
 426(2).启动Net8 configuration assistant--&gt;选第三项本地网络服务名配置   
 427\--&gt;删除...(删除原来的本地网络服务名) 
 428
 429(3).重复第二步   
 430\--&gt;添加.. (新建本地网络服务名) 
 431
 432(4).restart oracle   
 433  
 434注意:NTS是WinNT的认证方式 
 435
 43643、命令行编译存储过程 
 437
 438ALTER PROCEDURE procedure_name COMPILE; 
 439
 44044、关于如何建立数据库链接(DBlink) 
 441
 442可以通过建立客户机数据库网络服务名的办法,将服务器的名字或是IP地址设置为你需要连接的那个机器就行 
 443
 444如果你要在一个应用中连接它,现在做好上步工作,然后按如下处理 
 445
 446建立数据库连接   
 447CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';   
 448DBaseLinkName 是建立的数据连接名称   
 449UserName 是可以连接到的用户名   
 450Password 是可以连接到的用户的密码   
 451NetServiceName 是可以连接的数据库网络服务名或是数据库名 
 452
 453查询建立数据连接的表实例   
 454Select * From TableName@ DBaseLinkName; 
 455
 456注意:如果在CREATE DATABASE LINK DBaseLinkName CONNECT TO UserName IDENTIFIED BY Password USING 'NetServiceName';中NetServiceName 是数据库名修改init.ora中:global_names = true   
 457否则global_names = false   
 458init.ora中:global_names = false   
 459  
 46045、Object Browser7.0中文版的破解方法 
 461
 462到OBJECT BROWSER的目录里,找到DeIsL1.isu文件,用记事本打开,看到的是乱码吧?没关系,将Stirling Technologies ,Inc 这个字符串前面的乱码去掉(如果有的话),让后在Stirling之前加一个空格(一定要加的),保存,退出,重新运行一下看看,虽然还有提示输入验证信息,但是不用管他,直接确定就行。是不是可以用了呢?保证好使。 
 463
 46446、错误号ORA-01536:space quota exceeded for table space 'ALCATEL'的解决办法   
 465  
 466三个解决办法,任你选择:   
 467(1) alter user USERNAME quota 100M on TABLESPACENAME;   
 468(2) alter user USERNAME quota unlimited on TABLESPACENAME;   
 469(3) grant unlimited tablespace to USERNAME; 
 470
 47147、如何在Oracle中捕获到SQL语句的全部操作内容 
 472
 473SELECT osuser, username, sql_text from v$session a, v$sqltext b   
 474where a.sql_address =b.address order by address, piece; 
 475
 47648、ORACLE中如何实现自增字段: 
 477
 478(1)第一种方法   
 479ORACLE一般的做法是同时使用序列和触发器来生成一个自增字段.   
 480CREATE SEQUENCE SEQname   
 481INCREMENT BY 1   
 482START WITH 1   
 483MAXVALUE 99999999   
 484/   
 485CREATE TRIGGER TRGname   
 486BEFORE INSERT ON table_name   
 487REFERENCING   
 488NEW AS :NEW   
 489FOR EACH ROW   
 490Begin   
 491SELECT SEQname.NEXTVAL   
 492INTO :NEW.FIELDname   
 493FROM DUAL;   
 494End; 
 495
 496(2)第二种方法:   
 497CREATE OR REPLACE TRIGGER TR1   
 498BEFORE INSERT ON temp_table   
 499FOR EACH ROW   
 500declare   
 501com_num NUMBER;   
 502BEGIN   
 503SELECT MAX(ID) INTO COM_NUM FROM TEMP_TABLE;   
 504:NEW.ID:=COM_NUM+1;   
 505END TR1; 
 506
 50749、job的使用: 
 508
 509修改initsid.ora参数   
 510job_queue_processes = 4 8i,9i (允许同时执行的JOB数)   
 511job_queue_interval = 10 8i   
 512job_queue_keep_connections=true 8i 
 513
 514  
 515DBMS_JOB.SUBMIT(:jobno,//job号   
 516'your_procedure;',//要执行的过程   
 517trunc(sysdate)+1/24,//下次执行时间   
 518'trunc(sysdate)+1/24+1'//每次间隔时间   
 519);   
 520删除job:dbms_job.remove(jobno);   
 521修改要执行的操作:dbms_job.what(jobno,what);   
 522修改下次执行时间:dbms_job.next_date(job,next_date);   
 523修改间隔时间:dbms_job.interval(job,interval);   
 524停止job:dbms.broken(job,broken,nextdate);   
 525启动job:dbms_job.run(jobno); 
 526
 527注意:修改后一定要COMMIT; 
 528
 529  
 530例子:   
 531VARIABLE jobno number;   
 532begin   
 533DBMS_JOB.SUBMIT(:jobno,   
 534'Procdemo;',//Procdemo为过程名称   
 535SYSDATE, 'SYSDATE + 1/720');   
 536commit;   
 537end; 
 538
 53950、如何配置mts 
 540
 541修改初始化参数文件   
 542增加以下内容:   
 543mts_dispatchers = "(protocol=TCP)(disp=2)(con=1000)"   
 544mts_max_dispatchers = 50   
 545mts_servers = 20   
 546mts_max_servers = 50 
 547
 54851、取出一个表的最后一条记录 
 549
 550select * from (select rownum id,tname.* from tname) a where a.id=(select count(*) from a); 
 551
 55252、重做日志(Redolog)被删掉,通过什么方法才能恢复! 
 553
 554先mount数据库,然后再目录下建同名文件redo01.log、redo02.log、redo03.log   
 555然后执行alter databse clear logfile group n   
 556对于current的group,执行alter databse clear unarchived logfile group n   
 557然后,再open,就ok了 
 558
 55953、Oracle常见服务 
 560
 561几个主要的: 
 562
 563OracleOraHome81TNSListener 监听服务   
 564OracleServiceSID ORACLE服务   
 565OracleOraHome81Agent 智能代理服务   
 566OracleOraHome81CMan 连接管理服务   
 567OracleOraHome81HTTPServer APACHE WEB 服务   
 568OracleOraHome81ManagementServer ORACLE 企业管理器服务   
 569OracleOraHome81Names ORACLE命名服务 
 570
 571剩下的也不常用。 
 572
 57354、ORACLE的热备份 
 574
 575在不关闭数据库的时候进行ORACLE的备份。 
 576
 577原理停复杂的,你去找本书看看吧。 
 578
 579举个简单的例子:备份表空间USERS 
 580
 581ALTER TABLESPACE USERS BEGIN BACKUP   
 582COPY USERS TABLESPACE 的数据文件到备份目录   
 583ALTER TABLESPACE USERS END BACKUP 
 584
 58555、导致索引不起作用的解决办法 
 586
 587你的问题我刚处理过,是由optimizer_mode参数引起的,该参数的默认值为choose,即为如表有statis则查询走基于cost的方式,否则走基于rule的方式,因些你可以有以下几个解决方法。   
 588(1)、简单的在init<sid>.ora中设optimizer_mode=rule,重起数据库。   
 589(2)、使用analyze table table_name(索引基表) delete statistics;   
 590(3)、最后一个万能办法,将表和索引drop掉,重建。 
 591
 59256、关于数据库进程的问题。 
 593
 594(1).查看相关进程在数据库中的会话   
 595Select a.sid,a.serial#,a.program, a.status ,   
 596substr(a.machine,1,20), a.terminal,b.spid   
 597from v$session a, v$process b   
 598where a.paddr=b.addr   
 599and b.spid = &amp;spid 
 600
 601(2).查看数据库中被锁住的对象和相关会话   
 602select a.sid,a.serial#,a.username,a.program,   
 603c.owner, c.object_name   
 604from v$session a, v$locked_object b, all_objects c   
 605where a.sid=b.session_id and   
 606c.object_id = b.object_id; 
 607
 608(3).查看相关会话正在执行的SQL   
 609select sql_text from v$sqlarea where address =   
 610( select sql_address from v$session where sid = &amp;sid ); 
 611
 612  
 61357、查看IP地址   
 614select SYS_CONTEXT('USERENV','IP_ADDRESS') from dual; 
 615
 61658、运行SQLPLUS时不用输入用户名和密码,进入之后使用CONNECT   
 617  
 618SQLPLUS /NOLOG   
 619SQL&gt;CONNECT SCOTT/TIGER 
 620
 62159、查看当前会话 
 622
 623userenv() 函数 
 624
 625select userenv('language') from dual 字符集   
 626select userenv('isdba') from dual 是否DBA   
 627select userenv('sessionid') from dual sessionid   
 628select userenv('TERMINAL') from dual 客户端名字   
 629select userenv('INSTANCE') from dual 实例数 
 630
 631SYS_CONTEXT() 函数   
 632  
 633select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') from dual; 当前模式   
 634select SYS_CONTEXT('USERENV','CURRENT_SCHEMAID') from dual; 当前模式ID   
 635select SYS_CONTEXT('USERENV','CURRENT_USER') from dual; 当前用户   
 636select SYS_CONTEXT('USERENV','DB_NAME') from dual; 数据库   
 637select SYS_CONTEXT('USERENV','HOST') from dual; 主机   
 638.......... 
 639
 64060、删除重复列的方法 
 641
 642(1) DELETE FROM table_name A WHERE ROWID &gt; (   
 643SELECT min(rowid) FROM table_name B   
 644WHERE A.key_values = B.key_values);   
 645(2) create table table2 as select distinct * from table1;   
 646drop table1;   
 647rename table2 to table1;   
 648(3) Delete from mytable where rowid not in(   
 649select max(rowid) from mytable   
 650group by column_name );   
 651(4) delete from mytable t1   
 652where exists (select 'x' from my_table t2   
 653where t2.key_value1 = t1.key_value1   
 654and t2.key_value2 = t1.key_value2   
 655...   
 656and t2.rowid &gt; t1.rowid); 
 657
 65861、ORA-12571: TNS:packet writer failure(包写入程序失败) 
 659
 660(1) 这个错误在客户端遇到过,通常重新连接一下服务器就好了。   
 661服务器重新启动的时候,在client也会遇到该错误。   
 662这个错误你是在server还是client上遇到的?最常用的办法就是加上跟踪,查看一下 跟踪记录,分析分析错误的原因。   
 663网络问题也会出现该错误,比如网络路由没有配置好。   
 664(2) 安装的杀毒软件导致的   
 665(3) 服务器端的IP是否被改动   
 666(4) 最后不行的话,重新创建监听器   
 667  
 66862、ORACLE服务不能自动启动的解决办法 
 669
 670把ORACLEHOME\network\ADMIN\sqlnet.ora   
 671文件中的 sqlnet.authentication_service=(nts)   
 672注释掉就可以了 
 673
 674  
 67563、不完全的时间点恢复 
 676
 677shutdown immediate   
 678copy 备份文件到需要恢复的目录下   
 679startup mount   
 680recover database until time '2002-12-26 09:00:00' 
 681
 682alter database open resetlogs 
 683
 684自己仔细检查一下,不会发生这样的问题的。 
 685
 68664、oracle如何设置查询超时 
 687
 688select /*+ timeout 30*/ * from veryLargeTable 
 689
 69065、修改字符集 
 691
 692(1)、ALTER DATABAE CHARACTER SET SIMPLIFIED CHINESE_CHINA.ZHS16GBK ; 
 693
 694(2)、update props$ set value$='ZHS16CGB231280'   
 695where name='NLS_CHARACTERSET';   
 696update props$ set value$='ZHS16CGB231280'   
 697where name='NLS_NCHAR_CHARACTERSET'; 
 698
 699建议不使用(2) 
 700
 701注意:   
 702(1)、执行ALTER DATABASE CHARACTER SET必须有SYSDBA权限,并且在STARTUP RESTRICT模式下执行   
 703(2)、原字符集必须是目标字符集的一个真子集(就是浪子所说的只能从WE8ISO8859P1转到ZHS16GBK的原因)   
 704(3)、CLOB字段装换可能有问题,建议在转换以前把有CLOB字段的表导出后DROP,转换以后再导回   
 705(4)、该转换不可逆,所以在做这个操作以前建议做数据库全备份 
 706
 70766、修改数据库名字 
 708
 709(1)、启动svrmgrl,以文本方式备份控制文件   
 710oracle&gt;svrmgrl   
 711svrmgrl&gt;connect internal   
 712svrmgrl&gt;alter system backup controlfile to trace   
 713(2)、编辑产生的跟踪文件,在udump目录下   
 714改CREATE CONTROLFILE REUSE DATABASE "CTC" NORESETLOGS ARCHIVELOG   
 715中的REUSE为SET   
 716然后把create controlfile这段语句拷出   
 717(3)、正常宕库,后启动到nomount下   
 718svrmgrl&gt;shutdown immediate   
 719svrmgrl&gt;startup nomount   
 720(4)、执行create controlfile那段语句   
 721(5)、打开数据库   
 722svrmgrl&gt;alter database open   
 723如提示用resetlogs选项则使用   
 724svrmgrl&gt;alter database open resetlogs   
 725(8)、相应修改初始化参数 
 726
 72767、rownum的用法 
 728
 729select * from (select t.*,rownum id from dept t)   
 730where id between 1 and 20 
 731
 732  
 73368、oracle的内部参数 
 734
 735SELECT a.ksppinm NAME,   
 736b.ksppstdf default_val,   
 737a.ksppdesc DESCRIPTION   
 738FROM x$ksppi a,   
 739x$ksppcv b   
 740WHERE a.indx=b.indx   
 741AND substr(a.ksppinm,1,1)='_'   
 742ORDER BY a.ksppinm 
 743
 74469、9i安装时报areasqueries错误的解决办法   
 745包括IAS 和 IDS   
 746  
 747把安装源文件目录全部改为英文字母或数字   
 748注意:不能是中文的路径 
 749
 75070、我如何知道一个表空间还有多少可以用 
 751
 752(1)、   
 753SELECT upper(f.tablespace_name) 表空间名,   
 754d.Tot_grootte_Mb "表空间大小(M)",   
 755d.Tot_grootte_Mb - f.total_bytes "已使用空间(M)",   
 756round((d.Tot_grootte_Mb - f.total_bytes) / d.Tot_grootte_Mb * 100,2) "使用比",   
 757f.total_bytes "空闲空间(M)",   
 758f.max_bytes "最大块(M)"   
 759FROM   
 760(SELECT tablespace_name,   
 761round(SUM(bytes)/(1024*1024),2) total_bytes,   
 762round(MAX(bytes)/(1024*1024),2) max_bytes   
 763FROM sys.dba_free_space   
 764GROUP BY tablespace_name) f,   
 765(SELECT dd.tablespace_name, round(SUM(dd.bytes)/(1024*1024),2) Tot_grootte_Mb   
 766FROM sys.dba_data_files dd   
 767GROUP BY dd.tablespace_name) d   
 768WHERE d.tablespace_name = f.tablespace_name   
 769ORDER BY 4 DESC   
 770(2)、select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space   
 771group by tablespace_name 
 772
 77371、creck pl/sql developer 的方法 
 774
 775(1)、安装pl/sql developer   
 776(2)、用UltraEdit将程序PLSQLDev.exe打开   
 777(3)、将UltraEdit设置为16进制模式   
 778(4)、查找串:BA 1E 00 00 00 2B D0   
 779修改:2B D0 为:4A 90   
 780(5)、存盘退出   
 781(6)、运行PLSQLDev.exe,如果提示你还有29天的时间可用,那就恭喜你了! 
 782
 78372、使索引无效 
 784
 785ALTER INDEX idx UNUSABLE;   
 786ALTER INDEX idx_acctno DISABLE;(only to a function based index) 
 787
 78873、在SQLPLUS中给指定用户进行 set autotrace on/off   
 789  
 790以SCOTT用户为例: 
 791
 792SQL&gt;CONNECT scott/tiger   
 793  
 794connected.   
 795  
 796SQL&gt;@$ORACLE_HOME/RDBMS/ADMIN/UTLXPLAN.SQL   
 797  
 798Table created.   
 799  
 800SQL&gt;CONNECT / AS SYSDBA   
 801  
 802connected.   
 803  
 804SQL&gt;@$ORACLE_HOME/SQLPLUS/ADMIN/PLUSTRCE.SQL   
 805  
 806drop role plustrace;   
 807Role dropped.   
 808create role plustrace;   
 809Role created.   
 810.   
 811grant plustrace to dba with admin option;   
 812Grant succeeded. 
 813
 814SQL&gt;GRANT PLUSTRACE TO SCOTT; 
 815
 816Grant succeeded. 
 817
 818SQL&gt;CONNECT SCOTT/TIGER 
 819
 820connected. 
 821
 822SQL&gt;set autotrace on 
 823
 824SQL&gt;
 825
 82674、关于约束的四种状态 
 827
 828Disabled novalidate:当约束使不能时,约束的规则不能强制在列   
 829(包含在约束中)的数据之上。但约束的定义保存在数据字典中。   
 830在执行数据仓库卷起(rollup)或装载且要加快装载过程时该方式   
 831是有用的。   
 832Enabled novalidate:是能无效,该状态的表可以包含非法   
 833的数据,但不可能加入新的非法数据。   
 834Enabled validate:使能有效,一个使能的约束是强制的,表的数据检查   
 835有效 
 836
 83775、在SQLPLUS中调用存储过程 
 838
 839SET SERVEROUTPUT ON   
 840declare   
 841out_param varchar2(100);   
 842begin   
 843your_proc(1,out_param);   
 844dbms_output.put_line(out_param);   
 845end;   
 846/   
 847SET SERVEROUTPUT OFF 
 848
 84975、生成系统表和存储过程的三个文件。 
 850
 851cat*.sql   
 852dbms*.sql   
 853utl*.sql 
 854
 85576、JOB中日期的使用 
 856
 857每个月1号:   
 858last_day(sysdate)+1   
 859每个季度的第一天:   
 860to_date(decode(to_char(sysdate,'q'),'1',to_char(sysdate,'yyyy')||'0101',   
 861'2',to_char(sysdate,'yyyy')||'0401','3',to_char(sysdate,'yyyy')||'0701',   
 862'4',to_char(sysdate,'yyyy')||'1001'),'yyyymmdd')   
 863每天:   
 864sysdate+1   
 865每个星期几:   
 866decode(to_char(sysdate,'w'),'1',sysdate+7,   
 867to_char(sysdate,'w'),'2',sysdate+6,to_char(sysdate,'w'),'3',sysdate+5,   
 868to_char(sysdate,'w'),'4',sysdate+4,to_char(sysdate,'w'),'5',sysdate+3,   
 869to_char(sysdate,'w'),'6',sysdate+2,to_char(sysdate,'w'),'7',sysdate+1) 
 870
 871每个星期x下午三点:interval(21, 'next_day(trunc(sysdate),x+1)+15/24'); 
 872
 873每个季度的第一个星期x:   
 874interval(21, 'next_day(trunc(sysdate,''Q''),3),5)'); 
 875
 876  
 87777、使用execute immediate 的问题 
 878
 8798i以上才支持execute immediate   
 8808.05只能用dbms_sql   
 881最好使用execute immediate 
 882
 883  
 88478、ORACLE9i中删除表空间中数据文件的方法   
 885  
 886drop tablespace tbsname including contents 
 887
 88879、找出串中的数字 
 889
 890SELECT TRANSLATE('2KRW229',   
 891'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ','0123456789')   
 892"Translate example"   
 893FROM DUAL   
 894/ 
 895
 8962229 
 897
 898\--全是数字的:   
 899select * from 你的表 where translate(你的列,'0123456789',' ')=''; 
 900
 901select * from 你的表 where trim(ltrim(rtrim(replace(col_name,'0123456789',' ')))) is null 
 902
 90380、分析表   
 904analyze table mzbs.db_code ESTIMATE STATISTICS SAMPLE 20 PERCENT; 
 905
 906  
 90781、表空间管理和用户管理 
 908
 909\--查看表空间和数据文件 
 910
 911select file_name,tablespace_name,autoextensible from dba_data_files; 
 912
 913\--数据表空间 
 914
 915CREATE TABLESPACE USER_DATA   
 916LOGGING   
 917DATAFILE 'D:\ORACLE\ORADATA\ORCL\test.DBF' SIZE 50m REUSE ,   
 918'c:\USERS01112.DBF' SIZE 50m REUSE   
 919AUTOEXTEND   
 920ON NEXT 1280K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL 
 921
 922\--临时表空间 
 923
 924CREATE TEMPORARY   
 925TABLESPACE USER_DATA_TEMP TEMPFILE 'D:\TEMP0111.DBF'   
 926SIZE 50M REUSE AUTOEXTEND   
 927ON NEXT 1024K MAXSIZE 16383M EXTENT MANAGEMENT LOCAL UNIFORM   
 928SIZE 1024K 
 929
 930  
 931\--增加数据文件 
 932
 933ALTER TABLESPACE USER_DATA   
 934ADD DATAFILE 'c:\USERS01113.DBF' SIZE 50M; 
 935
 936ALTER TABLESPACE USER_DATA   
 937ADD DATAFILE 'c:\USERS01114.DBF' SIZE 50M   
 938AUTOEXTEND ON   
 939; 
 940
 941  
 942\--删除表空间 
 943
 944DROP TABLESPACE USER_DATA INCLUDING CONTENTS; 
 945
 946  
 947\--修改数据文件大小   
 948ALTER DATABASE   
 949DATAFILE 'c:\USERS01113.DBF' RESIZE 40M; 
 950
 951\--创建用户、赋予权限 
 952
 953CREATE USER USER_DATA PROFILE DEFAULT IDENTIFIED BY USER_DATA   
 954DEFAULT   
 955TABLESPACE USER_DATA TEMPORARY   
 956TABLESPACE USER_DATA ACCOUNT UNLOCK;   
 957  
 958GRANT CONNECT TO USER_DATA;   
 959GRANT RESOURCE TO USER_DATA; 
 960
 961\--把表移到另一个表空间   
 962ALTER TABLE TABLENAME MOVE TABLESPACE TABLESPACENAME; 
 963
 964\--创建索引 
 965
 966CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME); 
 967
 968CREATE INDEX INDEXNAME ON TABLENAME(COLUMNNAME) TABLESPACE TABLESPACENAME; 
 969
 970\--重新建立索引 
 971
 972ALTER INDEX INDEXNAME REBUILD TABLESPACE TABLESPACE; 
 973
 974  
 975\--创建表 
 976
 977CREAE TABLE TABLENAME   
 978(COLUMN1 COLUTYPE DEFAULT(VALUE) NOT NULL)   
 979(COLUMN2 COLUTYPE DEFAULT(VALUE) NOT NULL); 
 980
 981  
 982\--建表的索引存储分配 
 983
 984  
 985CREATE TABLE summit.employee(id NUMBER(7) CONSTRAINT employee_id_pk PRIMARY KEY DEFERRABLE USING INDEX STORAGE(INITIAL 100K NEXT 100K)   
 986TABLESPACE indx,   
 987last_name VARCHAR2(25) CONSTRAINT employee_last_name_nn NOT NULL,   
 988dept_id NUMBER(7))   
 989TABLESPACE data; 
 990
 991  
 992\--建立主键 
 993
 994ALTER TABLE TABLENAME   
 995ADD CONSTRAINT CONSTRAINTNAME PRIMARY KEY(COLUMN1,COLUMN2) 
 996
 997  
 998\--使约束无效 
 999
1000ALTER TABLE TABLENAME ENABLE NOVALIDATE CONSTRAINT CONSTRANAME; 
1001
1002ALTER TABLE TABLENAME ENABLE VALIDATE CONSTRAINT CONSTRANAME; 
1003
1004\--删除约束 
1005
1006ALTER TABLE TABLENAME DROP CONSTRAINT constraintname; 
1007
1008DROP TABLE TABLENAEM CASCADE CONSTRAINTS;(删除表后将所用的外键删除) 
1009
1010\--给表增加列 
1011
1012ALTER TABLE TABLENAME   
1013ADD COLUMN COLUTYPE DEFAULT(VALUE) NOT NULL; 
1014
1015\--给列增加缺省值 
1016
1017ALTER TABLE TABLENAME   
1018MODIFY COLUMNNAME DEFAULT(VALUE) NOT NULL; 
1019
1020  
1021\--给表增加外键   
1022ALTER TABLE TABLENAME   
1023ADD CONSTRAINT CONSTRAINTNAME   
1024FOREIGN KEY(COLUMN) REFERENCES TABLE1NAME(COLUMN1);</sid></column></table_name></column></table_name>
Published At
Categories with 数据库类
Tagged with
comments powered by Disqus