一、数据库语言部分1.SQL语言:关系数据库的标准语言2.PL/SQL:过程化语言ProceduralLanguage3.SQL*Plus:简单的报表,操作系统接口
4.Oracle8.01后出现:(1)数据分区技术:只适用8.01后的版本,数据分散存放,不要放在一个硬盘上,I/O性能好,安全性能好。(2)对象技术:存储过程、函数、包、数据库触发器、动态SQL编程(3)数据库权限管理(4)数据完整性约束(DataIntegrityConstraints)
二、Oracle数据库核心,数据库管理员DBA数据库的管理与日常维护数据库总体设计数据库存储结构设计:物理结构、逻辑结构/**************************************************************************************************
可以运行Oracle的操作系统:UNIX:SunSolaris,HP-UX,AIX,Compaq-Tru64,SCO-UNIX和Linux(运行在PC机上)
WindowsNT/2000
P4机器上不能安装Oracle,要想安装需要对安装文件进行修改或者下载补丁程序在P4机器上安装Oracle的方法(只限于IntelP4机器):将Oracle的安装光盘拷贝到硬盘上,然后将/stage/components/oracle.swp.jre/win32/bin/symcjit.dll文件改名为symcjit.org,然后再开始安装。
***************************************************************************************************/
数据库的备份与恢复优化与性能调整
三、应用系统开发
四、应用服务器OAS
五、在WindowsNT/2000下清除Oracle8i运行环境(重新安装前的准备工作):
1.删除Oracle8i注册表:regedit.exe=>HKLM=>Software=>ORACLE
2.删除Oracle8i服务:regedit.exe=>HKLM=>System=>CurrentControlset=>Services=>以Oracle开头的服务
3.删除Oracle8i事件日志:regedit.exe=>HKLM=>System=>CurrentControlset=>Services=>Eventlog=>Application=>以Oracle开始的事件
4.删除WindowsNT/2000安装磁盘/ProgramFiles/Oracle目录。
5.删除Oracle8i环境变量控制面板=>系统=>高级=>环境变量(1)删除CLASSPATH(2)编辑PATH,将其中与Oracle有关系的路径删除。
6.删除Oracle8i菜单
7.重新启动WindowsNT/2000,停止服务。
8.删除Oracle8i主目录。
/*IP:75.64.16.XMask:255.255.248.0GateWay:75.64.16.3DNS:75.64.16.3*/
[七、Oracle网络配置]
/*(1)查询数据库名:SQL>selectnamefromv$database;
(2)查询数据库实例名:SQL>selectinstance_namefromv$instance;
(3)查询数据库服务名:SQL>selectvaluefromv$parameterwherename='service_names';//(小写)
(4)查询全局数据库名(sys用户):SQL>selectvalue$fromprops$wherename='GLOBAL_DB_NAME';//字符串区分大小写*/
1.Oracle网络驱动使用SQL*Netv2.0连接
OracleforWin98->SQL*NetEasyConfiguration
2.Oracle网络驱动使用Net8连接
3.Oracle网络驱动使用Net8i连接
Oracle程序组->NetworkAdministration->Net8Assistant
[创建TNS连接过程]:(1)启动Net8Assistant(2)本地->服务命名(3)编辑->创建...(4)第一页:网络服务名:给要使用的网络数据库在本机指定一个HostString,自己定义。(5)第二页:协议:TCP/IP(Internet协议)(6)第三页:主机名:输入对方机器的IP地址或域名。端口号:默认是1521,一般不需要修改。(7)第四页:(Oracle8i)服务名:输入网络数据库的服务名(8)第五页:完成。(9)菜单:文件->保存网络配置。
监视用户会话:SQL>selectusername,sid,serial#,machinefromv$session;删除用户会话:SQL>altersystemkillsession'sid,serail#';
/*练习sqlplusstud01/stud01SQL>showuser
SQL>select*fromemp;
SQL>select*fromdept;
*/[//使用下面的方法可以重复执行上一条SQL语句(在SQL*Plus中)SQL>l//小写字母L,显示上一条SQL语句1*selectusername,sid,serial#,machinefromv$sessionSQL>///正斜杠:重复执行上一条SQL语句
SQL>setlinesize1000//将SQL*Plus中显示行宽设成1000个字符。
]
4.手工配置Oracle网络连接:主要是配置"tnsnames.ora"文件。A.手工配置Oracle网络连接配置文件:tnsnames.ora
(1)在UNIX中:/u01/app/oracle/product/8.1.6/network/admin/tnsnames.ora
(2)在Windows98/NT/2000中:d:/oracle/ora81/network/admin/tnsnames.ora
B.手工配置Oracle监听进程配置文件:listener.ora
(1)在UNIX中:/u01/app/oracle/product/8.1.6/network/admin/listener.ora
UNIX下启动进程命令:$lsnrctlstart//启动监听进程$lsnrctlstatus//显示监听进程状态$lsnrctlstop//停止监听进程
(2)在Windows98/NT/2000中:d:/oracle/ora81/network/admin/listener.ora
启动进程的命令与UNIX相同。
#LISTENER.ORANetworkConfigurationFile:d:/Oracle/Ora81/network/admin/listener.ora#GeneratedbyOracleconfigurationtools.
LISTENER=(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ORA54)(PORT=1521))//注意:上面一行的HOST必须是你的主机名,否则监听会出问题,也可以使用你的机器的IP地址))(DESCRIPTION=(PROTOCOL_STACK=(PRESENTATION=GIOP)(SESSION=RAW))(ADDRESS=(PROTOCOL=TCP)(HOST=ORA54)(PORT=2481))))
SID_LIST_LISTENER=(SID_LIST=(SID_DESC=(SID_NAME=PLSExtProc)(ORACLE_HOME=d:/Oracle/Ora81)(PROGRAM=extproc))(SID_DESC=(GLOBAL_DBNAME=ora54)(ORACLE_HOME=d:/Oracle/Ora81)(SID_NAME=ora54)//注意:ora54为数据库的SID名称,不能更改,否则监听出问题))
[HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0]"local"="ora54"*/
[SVRMGRL:ServerManager的使用方法]D:/>svrmgrl
OracleServerManagerRelease3.1.6.0.0-Production
Oracle8iEnterpriseEditionRelease8.1.6.0.0-ProductionWiththePartitioningoptionJServerRelease8.1.6.0.0-Production
SVRMGR>connectinternal//使用svrmgrl,进入后使用的第一个命令必须是这个命令。口令://如果要求输入口令,请输入oracle连接成功。SVRMGR>selectnamefromv$database;//检查当前使用的数据库名NAME---------ORA44已选择1行。SVRMGR>shutdownimmediate//关闭当前使用的数据库已关闭数据库。已卸下数据库。已关闭ORACLE实例。SVRMGR>startup//启动当前使用的数据库,如果无效,请使用startupforce已启动ORACLE实例。系统全局区域合计有24433932个字节FixedSize70924个字节VariableSize7507968个字节DatabaseBuffers16777216个字节RedoBuffers77824个字节ORA-00205:SVRMGR>
[另一个启动oracle数据库的例子]d:/>sqlplusinternal/oracleSQL>startupforce//强行重新启动数据库。
[修改口令字]SQL>grantconnecttosystemidentifiedbyNewPassword;//如果用数字作口令,需要使用双引号括起来SQL>grantconnecttosysidentifiedbyNewPassword;SQL>alterusersystemidentifiedbyNewPassword;SQL>alterusersysidentifiedbyNewPassword;SQL>password//需要输入原口令
//注:以上修改口令的方法等价;sys与system用户可以互相修改口令;如果sys与system用户的口令都忘记了,使用如下方法:
D:/>svrmgrl
SVRMGR>connectinternal/oracle连接成功。SVRMGR>grantconnecttosystemidentifiedbymanager;语句已处理。SVRMGR>exit服务器管理程序结束。
[2002.04.18]//=========================================================================================================
八、Oracle产品组成
查询数据库选件产品:SQL>select*fromv$option;一般都是True,如果是False,可以双击激活。/*cartridges(小产品的)插件,(大产品的)选件(options)*/
[SYS用户是Oracle数据库中权限最大的用户。]
[orapwd命令:修改internal用户的口令字]/*orapwd的命令行参数D:/>orapwdUsage:orapwdfile=
wherefile-nameofpasswordfile(mand),password-passwordforSYSandINTERNAL(mand),entries-maximumnumberofdistinctDBAandOPERs(opt),Therearenospacesaroundtheequal-to(=)character.*/
修改internal口令字(internal默认口令为oracle)认证方法(AB两个步骤):
SQLNET.ORA文件的位置:UNIX:/u01/app/oracle/product/8.1.6/network/admin/sqlnet.oraWindowsNT/2000:d:/oracle/ora81/network/admin/sqlnet.ora
B.修改Internal口令字:WindowsNT/2000:C:/>ORAPWDfile=d:/oracle/ora81/database/pwdora8i.orapassword=YourPassword//YourPassword为你要设置的密码entries=30/*ORAPWDfile=d:/oracle/ora81/database/pwdora54.orapassword=qeventries=30*/
UNIX:$orapwdfile=$ORACLE_HOME/dbs/orapwSIDpassword=YourPasswordentries=30然后重新启动Oracle服务(服务->OracleServiceHOSTNAME)。
/*在执行上述命令之前,需要先将相应目录的pwdora8i.ora(或orapwSID)文件删除或者改名,因为口令字文件不能重名。*/
[tkprof跟踪文件整理工具]$tkprofx.trcx.txt
Windows2000/NT:d:/oracle/admin/db_name/udump/*.trc
UNIX:/u01/app/oracle/amdin/db_name/udump/*.trc//*/
九、Oracle数据分区技术:8.0以后开始使用
(一)LOB(LargeObject)大对象类型数据:1.BLOB:存储二进制数据,如图象、视频、声音等,用于代替Longraw类型(Oracle7.0以前的数据类型,今后不再支持)2.CLOB:存储大字符,如:个人简历,用于代替long字段。3.NCLOB:其它民族语言的支持(1)数据库字符集NLS:Server端:NLS_CHARACTERSET:(如果为以下的字符集,Oracle的数据库可以用来存储汉字)ZHS16GBK(Oraclei8,Oracle8)ZHS16CGB231280(Oracle7.3,8,8i)
此参数位置在数据字典中,查询核心字符集(语言、日期、货币等):SQL>select*fromnls_database_parameters;
Client端:NLS_LANG=SimplifiedChinese_CHINA.ZHS16GBK(如果没有设置,默认是英文)regedit.exe
UNIXClient中:$NLS_LANG="simplifiedchinese"_china.zhs16gbk$exportNLS_LANG
//一般将上述环境变量放入.profile文件中。
/***********************************************插入内容********************************************************
(1)sys是一种用户,internal是一种方式,用来启动关闭数据库,9.0以后不再使用internal,全部是sys。
(2)SQL>setcomv7//将8i版本暂时退回到7版
(3)SQL>altersystemsuspend;//使用internal用户执行,冻结数据SQL>altersystemresume;//取消冻结,恢复正常
****************************************************************************************************************/
(2)Oracle数据库核心字符集修改方法:
[*]修改数据字典(使用SYS用户):SQL>updateprops$setvalue$='ZHS16GBK'wherename='NLS_CHARACTERSET';SQL>commit;然后重新启动数据库。
4.BFILE:外部文件存储,将数据存储在服务器硬盘
十、Oracle8i数据库改变:1.网络计算数据库2.支持IFS(InternetFileSystem)3.集成Java虚拟机
[数据库语言]第一章SQL语言基础
一、什么是SQL语言:StructuredQueryLanguage----结构化查询语言
SQL*Plus支持的SQL语言:1.SQL语言(标准的SQL语言)2.SQL*Plus语言(非标准):报表或接口3.PL/SQL语言(非标准):程序开发(例如存储过程)
二、SQL语言特点:1.非过程化语言2.功能强3.提供视图功能4.两种使用方式(1)交互式(2)程序式:SQL>@filename.sql
5.提供数据控制
三、SQL语言分类:1.数据查询语言(QL):QueryLanguage2.数据操纵语言(DML):包括数据的插入、更新和删除,DataManipulationLanguage3.数据定义语言(DDLDataDefinitionLanguage):建表、建视图、建存储过程等4.数据控制语言(DCLDataControlLanguage):事务控制、包括权限等
五、SQL命令的输入:在SQL>提示符后输入命令,可以输入多行,以分号结束
六、SQL*Plus关键字:以回车结束1.@:执行外部命令,格式:@路径/文件名2.#:注释3./:执行上一条命令4.Accept:接收键盘输入的命令5.Append(简化为a):在行尾增加字符串/*例SQL>select*fromdep;select*fromdep*ERROR位于第1行:ORA-00942:表或视图不存在
SQL>at1*select*fromdeptSQL>/
DEPTNODNAMELOC-------------------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50COMPUTERBEIJING*/
6.Break:分组,Syntax:breakon分组列skipn//n为每两组之间间隔的空行/*例:SQL>breakonjobSQL>select*fromemporderbyjob;//此处务必按分组列排序
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-------------------------------------------------------------------------------7788SCOTTANALYST756613-6月-873000207902FORD756603-12月-813000207369SMITHCLERK790217-12月-80800207876ADAMS778813-6月-871100207934MILLER778223-1月-821300107900JAMES769803-12月-81950307566JONESMANAGER783902-4月-812975207782CLARK783909-6月-812450107698BLAKE783901-5月-812850307839KINGPRESIDENT17-11月-815000107499ALLENSALESMAN769820-2月-81160030030
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-------------------------------------------------------------------------------7654MARTINSALESMAN769828-9月-8112501400307844TURNER769808-9月-8115000307521WARD769822-2月-81125050030
已选择14行。
SQL>breakonjobskip1SQL>/
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-------------------------------------------------------------------------------7788SCOTTANALYST756613-6月-873000207902FORD756603-12月-81300020
7369SMITHCLERK790217-12月-80800207876ADAMS778813-6月-871100207934MILLER778223-1月-821300107900JAMES769803-12月-8195030
7566JONESMANAGER783902-4月-812975207782CLARK783909-6月-812450107698BLAKE783901-5月-81285030
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO-------------------------------------------------------------------------------
7839KINGPRESIDENT17-11月-81500010
7499ALLENSALESMAN769820-2月-811600300307654MARTIN769828-9月-8112501400307844TURNER769808-9月-8115000307521WARD769822-2月-81125050030
已选择14行。*/7.Btitle,Ttitle:设置表尾、表头SQL>Ttitle'表头'SQL>Btitle'表尾'SQL>Ttitleoff//失效
8.Change:写错了改正,Syntax:C/old/new/*例:SQL>select*fromdetp;select*fromdetp*ERROR位于第1行:ORA-00942:表或视图不存在
SQL>c/tp/pt1*select*fromdeptSQL>/
9.Clear:清除SQL>clearbreak//清除前面的break设置SQL>clearbuff//清除SQL*Plus缓冲区中的SQL语句
10.Column:列定义,用于定义列的显示格式语法:SQL>column列名format格式例:SQL>Columnsalformat$99.999999
11.computer:统计计算
12.connect:从一个用户退出,直接进入另一个用户
13.disconnect:中断当前用户的连接
14.copy:远程复制(用的较少,一般数据链路)
15.define:定义
16.undefine:取消定义
17.del:删除当前行
18.describe(简写desc):显示表结构例:SQL>descemp
19.document:文档注释
20.edit(简化ed):调入外部编辑器编辑缓冲区中的SQL语句,保存后,可以直接通过“/”运行编辑过的SQL语句
21.get:将外部文件调入不执行,只供显示例:SQL>getc:/sqlplus.ora
22.host:执行操作系统命令例:SQL>hostdir
23.input(简化为I):行插入,在当前行的后面插入。
24.List(简化为L):列示
25.Pause:设置屏幕暂停SQL>setpauseon//暂停SQL>setpauseoff//不暂停SQL>set'more'pauseon[]
26.Quit:退出
27.Remark:注释
28.Run(R):类似“/”
29.Save:将已经运行过的SQL命令保存到磁盘例:SQL>savec:/run.sqlreplace//覆盖保存append//追加
30.set:设置
31.show:显示环境变量的值
32.Spool:显示跟踪例:SQL>spoolc:/文件名SQL>spooloff//停止记录
33.Start:类似@,执行外部的SQL文件
七、数据字典:描述系统信息的表、视图、同义词等,由系统自动维护。例:SQL>select*fromtabs;
2.user_xxx:描述用户创建的对象,如:user_tables,user_views,user_indexes
3.dba_XXX:数据库管理员(sys,system)专用数据字典
[第二章数据库查询语言(QL)]
一、查询语句基本语法:1.查询全表的数据:SQL>select*fromemp;
2.查询某(几)个列:SQL>selectename,salfromemp;
3.DISTINCT标识:只显示不相同的列例:SQL>selectjobfromemp;//显示结果中有相同的记录SQL>selectdistinctjobfromemp;//只显示不相同的职业
4.使用orderby将显示结果排序:ASC升序(默认),DESC降序
5.使用where指出查询条件:SQL>select*fromempwheresal>2000;
[字符型或日期型用单引号括起来,并区分大小写]
6.设置日期显示格式:(1)确定日历格式:设置参数nls_calendar。
SQL>altersessionsetnls_calendar='JapaneseImperial';//设置为日本日历SQL>altersessionsetnls_calendar='ROCofficial';//设置为台湾日历SQL>altersessionsetnls_calendar='Gregorian';//设置为格林尼治日历,这是我们要设置成的日历。
(2)确定日期格式:参数nls_date_format常用的日期格式:yyyy.mm.ddyyyy-mm-ddyyyy/mm/ddyyyy"年"mm"月"dd"日"//如果要显示汉字,请用双引号括起来yyyy"年"mm"月"dd"日"dy//dy表示星期
命令格式:SQL>altersessionsetnls_date_format='格式';[此命令只修改前端的显示,退出后即失效,要想永久有效,要修改注册表,在注册表中HKLM->Software->Oracle->Home0增加字符串关键字nls_date_format,键值为日期格式,此处的格式不需要用单引号括起来。]
例:SQL>altersessionsetnls_date_format='yyyy"年"mm"月"dd"日"dy';
glogin.sql文件路径:
Windows下:d:/oracle/ora81/sqlplus/admin/glogin.sql
UNIX:/u01/app/oracle/product/8.1.6/sqlplus/admin/glogin.sql
二、运算符与谓词1、算术运算符:+,-,*,/
SQL>selectsal,sal*12fromemp;//计算工资及年薪。SQL>selectsal,sal+commfromemp;//错误语句,因为comm中存在空值,会使运算结果也会出现空值。SQL>selectsal,sal+NVL(comm,0)fromemp;//正确语句,NVL为空值运算函数,当comm为空值时,该函数返回第二个值0。
2、逻辑运算符:NOT,AND,OR,三个运算符的优先级别依次降低。
3、比较运算符:>,<,=,>=,<=,!=
4、谓词:(1)IN(或NOTIN):等于(不等于)列表中的任意值。
SQL>select*fromempwherejobin('MANAGER','CLERK')
(2)(NOT)BETWEENAND:表示从小到大的一个范围。[必须是从小到大]SQL>select*fromempwheresalnotbetween2000and3000;
(3)LIKE:模式匹配SQL>select*fromempwhereenamelike'S%';//寻找ename为S打头的记录%:表示任意字符串_(下划线):表示一个任意字符
SQL>select*fromempwhereenamelike'李%';//可以使用中文SQL>select*fromempwhereenamelike'S_I%';//寻找ename为S打头,第三个字母为I的记录SQL>selectobject_namefromall_objectswhereobject_namelike'DBA%';//搜索数据字典中与dba有关系的对象
(4)
SQL>select*fromempwherecommisNULL;//查询哪些人没有资金。
5.伪列:
(1)rowid:唯一行标识,行被删除之后,rowid不变。(2)rownum:行号,一行被删除之后,后面的行号会随之改变
SQL>selectempno,ename,rowid,rownumfromemp;
(1)SQL>selectsql_textfromv$sqlarea;//查询以前使用过的SQL语句
(2)查询当前连接用户的SQL语句:SQL>selectuser_name,sql_textfromv$open_cursor;//需要用sys或system用户执行
三、列名别名SQL>selectename,salasSalaryfromemp;SQL>selectename职工姓名,sal工资fromemp;
*#//select都不允许做别名,如果一定要用,用双引号括起来。
[第三章数据操纵语言(DML)]
一、数据插入:
1.对于表中全部列插入语法:SQL>insertinto表名values(值表达式);
例:SQL>Insertintodeptvalues(51,'软件开发部','北京');
[*]用desc显示表结构、数据类型、顺序SQL>descdept//注意,不要将linesize设置的太大,否则看不到表结构,设置成100即可。[*]所插数据必须与目标列一致。[*]字符与日期数据使用单引号
2.对于表中部分列插入语法:SQL>insertinto表名(列名1,列名2...)values(值表达式);[*]对于表中的非空列必须插入数据
SQL>insertintoemp(empno,ename,job,hiredate,deptno)values(1234,'李大力','工程师',sysdate-30,10);
/*sys或system用户访问其它用户的表的方法
/********************commit及Rollback用法:下例是Rollback的一个例子。SQL>deletedeptwheredeptno=51;
已删除1行。
DEPTNODNAMELOC-------------------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50COMPUTERBEIJING
SQL>rollback;
重算已完成。
DEPTNODNAMELOC-------------------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50COMPUTERBEIJING51软件开发部北京
已选择6行。*************************************************/
3.使用参数(变量),临时输入值
SQL>insertinto表名(列名1,列名2,...)values(&x1,&x2,...);
SQL>insertdept(deptno,dname,loc)values(&x1,'&x2','&x3')
/*例:SQL>insertintodeptvalues(&x1,&x2,&x3)//&x2,&x3没有用单引号括起来输入x1的值:52输入x2的值:'bb'//字符型数据输入时需要输入单引号输入x3的值:'cc'//同上原值1:insertintodeptvalues(&x1,&x2,&x3)新值1:insertintodeptvalues(52,'bb','cc')
已创建1行。
DEPTNODNAMELOC-------------------------------------10ACCOUNTINGNEWYORK20RESEARCHDALLAS30SALESCHICAGO40OPERATIONSBOSTON50COMPUTERBEIJING51软件开发部北京52bbcc
已选择7行。
SQL>insertintodeptvalues(&x1,'&x2','&x3');//在命令行中给字符或日期型参数加上单引号,则下面输入时不再需要输入单引号
输入x1的值:53输入x2的值:dd输入x3的值:ee原值1:insertintodeptvalues(&x1,'&x2','&x3')新值1:insertintodeptvalues(53,'dd','ee')
已创建1行。********************************************************************/
//definex=7788//也可以这样用:select&x1,&x2fromemp;
4.使用子查询从另一个表中复制数据语法:Insertinto表名select子句;
SQL>inserttoemp(empno,hiredate,deptno)selectdeptno+7300,sysdate,deptnofromdept;
SQL>inserttoemp(empno,hiredate,deptno)selectdeptno+7300,sysdate,deptnofromdept@数据库链路名;//表示dept这个表在网络上的其它服务器中,注意:@之后不是连接串。
SQL>createtablepayasselectename,salfromemp;//用复制的方法创建表SQL>insertintopayselect*frompay;//自己复制自己,可以使一个表飞速扩大。
二、数据更新语法:SQL>Update表名set列名=值表达式where条件;
例:SQL>updateempsetsal=sal+100wheresal<2000;SQL>updateempsetsal=5000,job='MANAGER'whereename='SMITH';SQL>updateempsetcomm=100wherecommisnull;
三、数据删除语法:SQL>Deletefrom表名where条件;//删除数据保留结构,可以回退SQL>Truncatetable表名;//删除数据保留结构,不可以回退,效率高SQL>Droptable表名;//删除数据及结构,不可以回退[第四章数据控制语言(DCL)]
一、事务提交:对于数据的插入、更新、删除,只有提交后,数据才真正改变,在提交之前,只有修改了数据的用户才可以看到数据的改变,而其他用户看不到数据的改变。
1.显式数据提交语法:SQL>commit;
/*某一个用户对表进行更新等写操作之后,如果没有commit,那么其它用户不能对表进行更新操作,否则就会死掉。查锁方法:SQL>selectusername,sid,serial#fromv$session;
解锁方法:SQL>altersystemkillsession'sid,serial#';
*****************************************************************************************************/
2.隐式数据提交:下列命令是隐式提交命令:Create,Alter,Drop,Connect,Disconnect,Grant,Revoke,Rename,Exit,Quit,Audit,NoAudit
3.自动数据提交:SQL>setautocommiton//打开自动数据提交开关SQL>setautocommitoff//关闭自动数据提交开关(默认)
二、事务回退语法:SQL>Rollback;//使数据库回退到最近一次提交后状态,如果一次也没有提交过,回到最原始状态SQL>Rollbac;SQL>Rollba;SQL>Rollb;SQL>Roll;//以上的用法都是正确的。
三、设置保存点:SQL>SavePointa;
回退到保存点:SQL>Rollbacktoa;//此处的Rollback不能再简写。
[第五章数据定义语言(DDL)]
包括:创建基表、视图、同义词、索引、数据库链路、序列等
一、创建基表语法:SQL>CreateTable表名(列名1数据类型,列名2数据类型,...);//最多可以到1000个字段
例:SQL>CreateTableproduct(p_name,varchar2(20),p_id_numbernumber(7),p_datedate);
1.数据类型(1)字符型char(n):n<=2000,固定长度,如果实际长度不够,前面用空格补齐。varchar2(n):n<=4000,可变长度,不用空格补齐。(2)数字型number(n):整数,number(n,d):小数(3)日期型(4)二进制raw(8i以前的,现在不支持了)(5)大字符long:建议不要使用,现在不支持了(6)blob:存储二进制(7)CLOB:存储大字符
SQL>Createtableemployee(namevarchar2(30),salarynumber(7,2),b_datedate,photeblob,resumeclob);[*]修改数据库兼容性参数(如果在执行上面的SQL语句时,提示clob字段“默认字符集具有不同的宽度”,则需要修改数据库兼容性。):D:/oracle/amdin/db_name/pfile/init.oracompatible=8.0.5=改为=>8.1.0或8.1.5改完后重新启动数据库使修改生效。/**********************************************修改前:SQL>Createtableemployee(2namevarchar2(30),3salarynumber(7,2),4b_datedate,5photeblob,6resumeclob);resumeclob)*ERROR位于第6行:ORA-22866:默认字符集具有不同的宽度
修改后:SQL>Createtableemployee(2namevarchar2(30),3salarynumber(7,2),4b_datedate,5photeblob,6resumeclob);
表已创建。
************************************************/
2.约束条件:数据完整性约束条件(DataIntegrityConstaints)
Oracle常用约束条件:(1)非空约束:NOTNULL(2)唯一性约束:UNIQUE(3)主键:PRIMARYKEY,主键同时具有上面两个约束条件,一个表中只允许有一个主键。(4)外键:FOREIGNKEY,这一列值从其它表中取出,允许重复,但不允许修改。(5)检查:CHECK(e.g.check(sal>200)(6)引用(参考):REFERENCES,只能用其它表或者本表的某一列列值,不能随便修改。(7)缺省值:DEFAULT,如果没有输入,自动使用DEFAULT值。
3.约束条件的定义方法:可以定义为列的一部分,也可以定义为表的一部分。(1)定义为列的一部分:SQL>CreateTableproduct(p_namevarchar2(20)unique,p_idnumber(7)primarykey,p_datedatenotnull);
[*]Check、Default约束条件:SQL>Createtableemployee(namevarchar2(20),idnumber(7)primarykey,salnumber(11)check(sal>200andsal<2000),h_datedatedefaultsysdate);
一个列具有多个约束条件的写法:SQL>CreateTableproduct(p_namevarchar2(20)unique,p_idnumber(7)primarykey,check(p_id>=111andp_id<=999),p_datedatenotnull);
例:SQL>insertintoemployee(name,id,sal)values('Smith',2,201);SQL>select*fromemployee;
NAMEIDSALH_DATE------------------------------------------------------ChenZheng15002002年04月14日Smith22012002年04月19日
(2)定义为表的一部分(不能用在Default和NotNUll的定义上):SQL>CreateTableProduct(p_namevarchar2(20),p_idnumber(7),p_datedatenotnull,constraintp_id_pkprimarykey(p_id),constraintp_name_ukunique(p_name));[*]查询约束条件:SQL>select*fromuser_constraintswheretable_name='PRODUCT';
(3)另一种约束定义方法:SQL>CreateTableProduct(p_namevarchar2(20),p_idnumber(7)constraintpk_p_idprimarykey,p_datedateconstraintfk_p_datenotnull);4.使用外键创建主从基表(1)创建主表(定义主表):SQL>CreateTableproduct(p_namevarchar2(20),p_idnumber(7)primarykey,p_datedatenotnull);(2)创建子表,定义外键SQL>createtablesales_list(sales_namevarchar2(20),sales_idnumber(7)primarykey,p_idnumber(7),constraintp_id_fkforeignkey(p_id)referencesproduct(p_id));5.数据完整性约束条件的修改(1)删除约束条件:A.删除主键约束:SQL>Altertableproductdropprimarykey;SQL>Altertableproductdropconstraintp_id_pk;
//以上两种方法等价
B.删除唯一性约束:SQL>Altertableproductdropunique(p_name);SQL>Altertableproductdropconstraintp_id_uk;
C.删除非空约束SQL>Altertableproductmodify(p_dateNULL);
D.删除缺省值:SQL>Altertableproductmodify(p_datedefaultnull);
(2)增加约束条件A.增加主键约束:SQL>Altertableproductaddprimarykey(p_id);SQL>Altertableproductaddconstraintp_id_pkprimarykey(p_id);
B.增加非空约束SQL>altertableproductmodify(p_datenotnull);
C.增加缺省值SQL>Altertableproductmodify(p_datedefaultsysdate-1);
[*]查询缺省值:SQL>selecttable_name,column_name,data_defaultfromuser_tab_columns;
二、修改表结构1.在表中增加新列:SQL>Altertableproductadd(p_listnumber(7),p_locvarchar2(20));
2.删除一个列(只适用于Oracle8i以后的版本):
SQL>Altertableproductdrop(p_list,p_loc);//删除多个列SQL>Altertableproductdropcolumnp_list;//删除一个列
3.修改列宽:SQL>Altertableproductmodify(p_namevarchar2(40));//增加列宽没有约束,但减小列宽要求列中数据为空。使用此命令也可以修改列的数据类型。
1.创建视图的语法:SQL>CreateorReplaceview视图名asselect语句;例:SQL>createviewmanagerasselect*fromempwherejob='MANAGER';//select*fromtab;检查SQL>select*frommanager;//查询视图如果查询表//第二次创建视图,可以使用orreplace参数,不需要再删除而直接覆盖同名视图。SQL>createorreplaceviewmanagerasselect*fromempwherejob='MANAGER';[几点说明:](1)在创建视图时,不得使用orderby排序。(2)在视图中插入数据,则数据被插入到基表中,所以,如果要向视图插入数据,则创建视图时,必须包含表中全部非空列。(3)用户视图数据字典:SQL>selectview_name,textfromuser_views;
2.视图列别名:
错误语句:SQL>createviewpaymentasselectsal,sal*12,nul(comm,0)/salfromemp;//错误原因:视图可以视同为表,所以列名也要符合规定,而sal*12则是不符合规矩的列名。
正确语句:SQL>createviewpayment(c1,c2,c3)as//c1,c2,c3即为视图列别名selectsal,sal*12,nvl(comm,0)/salfromemp;
3.创建视图时增加约束条件:WITHCHECKOPTION
SQL>Createorreplaceviewdeptno20asselectempno,ename,deptnofromempwheredeptno=20;
SQL>Insertintodeptno20values(1236,'李力',30);
SQL>select*fromdeptno20;
//上面的语句会出现能够通过视图入基表中插入数据,但却不能通过视图看到插入的数据的问题,解决办法:SQL>Createorreplaceviewdeptno20asselectempno,ename,deptnofromempwheredeptno=20WITHCHECKOPTION;
4.创建Oracle8i的实体化视图(MaterializedView):视图不依赖于基表,基表被删除后,视图仍然正常。一般用于两个远程数据库之间的访问,通过数据链路来实现。
删除基表:SQL>droptable表名;
删除视图:SQL>dropview视图名;
三、创建数据库链路(Databaselink):数据库链路:用于数据库之间的远程数据复制。
DB1(UNIX)<-------DB2(NT)
若要将DB2中的数据复制到DB1,则需要在DB1中创建数据库链路指向DB2数据库。
创建数据库链路的步骤:(1)创建好连接串。(2)创建数据库链路。
1.创建数据库链路的语法:SQL>Createdatabaselink数据库链路名connectto用户名identifiedby口令using'主机字符串';
[*]数据库链路名必须与远程数据库的全局数据库名(数据库名.域名,若没有数据库名,就是数据库名)相同[*]用户名及口令为远程数据库的用户名及口令[*]主机字符串为本机tnsnames.ora中网络连接串。
SQL>Createdatabaselinkora31connecttouser30identifiedbyuser30using'ora31';
3.删除数据库链路:SQL>Dropdatabaselinkora31;
(一)创建数据库触发器实现两个数据库之间实时数据传输。DB1(UNIX)<-------DB2(NT)若要将DB2中的数据复制到DB1,则需要在DB1中创建数据库链路指向DB2数据库。
[*]在对方的数据库(DB2)上建立触发器,即数据发送方的数据库上建立触发器。[*]在数据发送方建立指向DB1的数据库链路。
(2)在DB2上建立到DB1的数据库链路:SQL>Createdatabaselinkora31connecttouser30identifiedbyuser30using'ora31';
//上述创建数据库触发器的语句,请以.号结束,然后以/执行。
/*查看SQL语句执行的错误信息:SQL>showerrors*/
查询数据库链路信息:SQL>selectusername,passwordfromuser_db_links;
(二).创建快照(实体化视图)实现两个数据库之间定时数据库传输:快照:要求主副站点数据库的用户名相同
(1)在主节点创建快照日志语法:SQL>Createsnapshotlogon主节点表名;//主节点基表必须含有主键
/*******************************教师的部分操作语句*****************************************************
以下SQL语句为在副节点上的操作语句,主节点对应的用户为user30,例中的photo为要创建快照的表名createuseruser30identifiedbyuser30;
grantconnect,resourcetouser30;
grantcreatesnapshottouser30;
connectuser30/user30
createdatabaselinkora31connecttouser30identifieduser30using'ora31';
********************************************************************************************************//**************************我的操作步骤******************************[1]主节点:ora8iSQL>showuserUSER为"STUD29"SQL>createsnapshotlogondept;
实体化视图日志已创建。
SQL>showuserUSER为"STUD29"SQL>select*fromdept;
SQL>insertintodeptvalues(60,'testsnap','snapshot');
提交完成。
[2]副节点
SQL>connectsystem/ab已连接。SQL>createuserstud29identifiedbystud29;
用户已创建
SQL>grantconnect,resourcetostud29;
SQL>grantcreatesnapshottostud29;
SQL>connectstud29/stud29;已连接。SQL>connectsystem/ab已连接。SQL>grantcreatedatabaselinktostud29;
SQL>connectstud29/stud29已连接。SQL>createdatabaselinkora8iconnecttostud29identifiedbystud29using'tea';
数据库链接已创建。
实体化视图已创建。*******************************************************************************************/
[Oracle8i图形界面管理工具]
Oracle程序组->EnterpriseManager->
(1)先运行该组中的ConfigurationAssistant,创建一个新的档案资料库(其作用请查询相应界面上的帮助信息)。
然后搜索要管理的节点(使用主机名或者IP地址都可以),节点要想被搜索到,需要先在节点上启动OracleOraHome81Agent服务,要想在节点上使用图形管理工具,要求先启动OracleOraHome81ManagementServer服务。
四、创建索引(indexes):
语法:SQL>createindex索引名on表名(列名);
例:SQL>createindexindex_dept_dnameondept(dname);
索引数据字典:SQL>selectindex_name,table_owner,table_name,fromuser_indexes;
五、创建序列(Sequences):
语法:SQL>Createsequence序列名startwith起始编码incrementby步长maxvalue终止编码;
SQL>createsequenceid_codestartwith2incrementby2maxvalue999;序列使用方法:id_code.nextval//下一个值id_code.currval//当前值
第一次要使用nextval,然后以后每次使用currval。
insertintostudentvalues(id_code.nextval,'姓名');
[*]||(双竖线)在oracle中是连接符号,将两个字符串连成一个,如:'A'||'B'='AB'
[第六章数据库分区技术]
一、什么是数据分区?数据分区是指把一个表划分成若干小块。在创建表的结构时应考虑好分区方案,选择表中某一列或多列数据作为分区关键字,该关键字决定哪些数据分到哪些区。Oracle对分区进行管理,新插入数据自动存储到相应的分区。
二、创建分区表:
SQL>Createtableemployee(idnumber(7),namevarchar2(20),salnumber(7,2))Partitionbyrange(sal)(Partitionp1valueslessthan(500)tablespaceusers,Partitionp2valueslessthan(800)tablespacetools,partitionp3valueslessthan(1000)tablespacesystem);
//p1,p2,p3是三个分区的名字,users,tools,system是三个表空间的名字。lessthan是小于(不包含)。几点说明:[.]所插数据不得大于LESSTHAN中的最大值[.]可以使用MAXVALUE(如上面的语句中,要求工资不能大于1000,如果出现这种情况,则应该改成下面的语句:SQL>Createtableemployee(idnumber(7),namevarchar2(20),salnumber(7,2))Partitionbyrange(sal)(Partitionp1valueslessthan(500)tablespaceusers,Partitionp2valueslessthan(800)tablespacetools,partitionp3valueslessthan(1000)tablespacesystem,partitionp4valueslessthen(maxvale)tablespaceusers);[.]不指定表空间时,则该区使用该用户的缺省表空间。*查询每个用户的用户缺省表空间:SQL>selectusername,default_tablespacefromdba_users;//使用dba用户查询
[*]查询可以使用的表空间名字:SQL>selecttablespace_name,file_namefromdba_data_files;//使用dba(sys或system)来执行
SQL>selectdba_users.username,dba_users.default_tablespace,dba_data_files.file_namefromdba_users,dba_data_fileswheredba_users.default_tablespace=dba_data_files.tablespace_name;
[temp表空间不能用于数据分区。]
三、分区表的查询方法:SQL>select*fromemployee;//按没有分区的方法查询
SQL>select*fromemployeepartition(p1);//只查询p1分区的数据。SQL>createtablepart3asselect*fromemployeepartition(p3);
四、分区表的修改:1、增加分区:SQL>AltertableemployeeADDpartitionp4valueslessthan(1500)tablespaceusers;
[*]分区数据字典:SQL>selectpartition_name,high_value,tablespace_namefromuser_tab_partitionswheretable_name='EMPLOYEE';2、删除分区:SQL>AltertableemployeeDROPpartitionp4;//结构数据全部删除(相应分区及数据全部被删除)SQL>AltertableemployeeTRUNCATEpartitionp4;//保留结构(即区还存在),数据删除
3、修改区名:SQL>AltertableemployeeRENAMEpartitionp4top5;
4、分区数据移动:将分区数据从一个表空间移动到另一个表空间SQL>AltertableemployeeMOVEpartitionp4tablespacesystem;
5、分区的拆分:
SQL>AltertableemployeeSPLITpartitionp3at(900)into(partitionp31,partitionp32);/*关于数据字典的几点说明:v$打头的数据字典,后面不会以s结尾,例如:V$database,v$session;user打头的,后面都会以s结尾(复数),如:user_tab_partitions,user_tablesdba打头的,有的以s结尾,有的不。***************************************************************************/
6、分区的合并:SQL>AltertableemployeeMERGEpartitionsp31,p32intopartitionp3;
[第七章SQL*Plus报表功能]
SQL>btitile'表尾'
失效:SQL>ttitleoffSQL>btittleoff
二、定义列名语法:SQL>column列名heading别名//别名不区分大小写
三、定义列格式:SQL>column列名Format格式常用列格式:An:A为字符,n为最大字符宽度。
$99.9999.999.99eeee
例:SQL>Columnsalformat$99.9999.99SQL>ColumncommlikeSal
四、分组命令:语法:SQL>breakon列名skipn例:SQL>breakondeptnoskip2SQL>select*fromemporderbydeptno;
五、统计计算:语法:SQL>compute函数of统计列onskipn//可以使用的函数有:sum,max,min,avg,count,var(斜方差),std(标准差)例:SQL>computesumofsalondeptno清除命令:SQL>clearcomputeSQL>clearbreakSQL>clearcolumn
增加报表级统计:SQL>breakondeptnoonREPORTSQL>computesumofsalonreport//整个报表出一个结果,上面两行都要运行,那么整个报表会根据你的设置出一个sumofsal的总计结果。
[第八章函数]
一、日期格式转换函数:to_char(日期变量,'格式')//格式要用单引号括起来
(1)日期格式构成方法:
年月日时分秒yymmddhh(12小时制)missyyyymondy(星期)hh24(24小时制)monthdayA.yy.mm.dd,yy/mm/dd,yy-mm-dd,yyyy.mm.dd,...加中文也可以,中文要用又引号括起来
SQL>selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;//dual是一个虚拟表,任何用户都可以使用。
二、聚组函数:从一组中返回汇总信息聚组函数有:Sum,count,countdistinct,max,min,avg,stddev(标准差)
例:SQL>selectmin(sal),max(sal),avg(sal),sum(sal)formemp;SQL>selectename,job,salfromempwheresal=(slectmax(sal)fromemp);SQL>selectcount(*)fromemp;.....[请参考PowerPiont教程:SQL讲稿.ppt]
[第九章复杂查询]
一、连接查询:问:Smith在哪里工作?答:SQL>selectlocfromdept,empwhereename='SMITH'andemp.deptno=dept.deptno;
二、集合查询[请参考PowerPiont教程:SQL讲稿.pptP29,30,31]集合操作是将多个基表的查询结果作UNION运算。交操作:Intersect差操作:MINUS
三、子查询(Subqueries):子查询是在where子句中包含的查询语句,是由系列简单构成的复杂查询。
问:谁与smith在同一部门工作?答:SQL>selectdeptnofromempwhereename='SMITH';SQL>selectenamefromempwheredeptno=20;
将两个语句合起来:Selectenamefromempwheredeptno=(selectdeptnofromempwhereename='SMITH');
[第十章Oracle权限设置]
一、权限分类:系统权限:系统规定用户使用数据库的权限。(系统权限是对用户而言)。
实体权限:某种权限用户对其它用户的表或视图的存取权限。(是针对表或视图而言的)。
二、系统权限管理:1、系统权限分类:DBA:拥有全部特权,是系统最高权限,只有DBA才可以创建数据库结构。
RESOURCE:拥有Resource权限的用户只可以创建实体,不可以创建数据库结构。
对于普通用户:授予connect,resource权限。对于DBA管理用户:授予connect,resource,dba权限。
例:SQL>connectsystem/managerSQL>Createuseruser50identifiedbyuser50;SQL>grantconnect,resourcetouser50;
查询用户拥有哪里权限:SQL>select*fromdba_role_privs;SQL>select*fromdba_sys_privs;SQL>select*fromrole_sys_privs;
删除用户:SQL>dropuser用户名cascade;//加上cascade则将用户连同其创建的东西全部删除
3、系统权限传递:增加WITHADMINOPTION选项,则得到的权限可以传递。
SQL>grantconnect,resorcetouser50withadminoption;//可以传递所获权限。
4、系统权限回收:系统权限只能由DBA用户回收命令:SQL>Revokeconnect,resourcefromuser50;
系统权限无级联,即A授予B权限,B授予C权限,如果A收回B的权限,C的权限不受影响;系统权限可以跨用户回收,即A可以直接收回C用户的权限。
三、实体权限管理1、实体权限分类:select,update,insert,alter,index,delete,all//all包括所有权限execute//执行存储过程权限
user01:SQL>grantselect,update,insertonproducttouser02;SQL>grantallonproducttouser02;
user02:SQL>select*fromuser01.product;
//此时user02查user_tables,不包括user01.product这个表,但如果查all_tables则可以查到,因为他可以访问。
3.将表的操作权限授予全体用户:SQL>grantallonproducttopublic;//public表示是所有的用户,这里的all权限不包括drop。
SQL>createtablestud02.employeeasselect*fromscott.emp;5.实体权限传递(withgrantoption):user01:
SQL>grantselect,updateonproducttouser02withgrantoption;//user02得到权限,并可以传递。
6.实体权限回收:user01:SQL>Revokeselect,updateonproductfromuser02;//传递的权限将全部丢失。
四、同义词(Synonym):
1、创建私有同义词:语法:SQL>createsynonym同义词名for代替项;
user01:SQL>grantselect,upateonproducttouser02;
user02:SQL>Createsynonymproductforuser01.product;
SQL>select*fromproduct;//这里的product即user01.product。
同义词数据字典:SQL>selectsynonym_name,owner,table_namefromall_synonyms;SQL>selectsynonym_name,table_namefromuser_synonyms;
2、DBA可以创建公共同义词(PublicSynonym):公共同义词全体用户可以存取语法:SQL>createpublicsynonym公共同义词名for代替项;
SCOTT:SQL>grantselectonpaymenttopublic;
SYSTEM:SQL>createpublicsynonympaymentforscott.payment;
3.删除同义词:User:SQL>dropsynonym私有同义词名;
DBA:SQL>droppublicsynonym公共同义词名;
[PL/SQL程序设计]
一、PL/SQL概述PL/SQL块结构:Declare--变量定义部分Begin--可执行语句Exception--例外处理:对于程序运行中的错误信息、警告信息的说明End;.//以.号结束程序编写
二、PL/SQL语言的特点(参考PowerPoint教程)1.PL/SQL中可以定义变量,变量有其作用范围。2.PL/SQL是以块的方式设计,块中可以嵌套子块,子块可以位于块中任何部分。3.
x.PL/SQL是以块为单位,SQL语句以语句为单位。
7.减少对Oracle核心的访问,降低网络负载。
三、PL/SQL与SQL语言(参考PowerPoint教程)1.PL/SQL语句不能使用DDL语句。可以使用的SQL语句:Insert,Update,Delete,[selectinto],commit,rollback,savepoint
...
四、PL/SQL基础1.变量的使用2.单行注释:--多行注释:/**/
3.数据类型:(1)布尔型:Boolean(TRUE,FALSE,NULL)(2)数字型:NUMBERINT=INTEGER
(3)字符型,基本上没有变化(4)日期型(5)二进制数据:raw,blob
4.数据定义:变量名数据类型变量名数据类型:=初始值
5.变量赋值:变量:=值;
[*]%TYPE:数据类型匹配
s1char(20);s2s1%TYPE;//定义s2变量,其类型与s1完全匹配。
v_salemp.sal%type;//v_sal变量的类型与emp表中的sal字段的数据类型完全匹配,%TYPE最经常使用的方法
[*]%ROWTYPE:行类型,用于存储数据库基表的一条记录。定义方法:变量基表名%rowtype;
例:SQL>setserveroutputon//使能屏幕打印函数的输出
Declare//如果PL/SQL程序中没有定义变量,那么Declare可以省略v_empnoemp.empno%type:=&empno;remp%rowtype;Beginselect*intorfromempwhereempno=v_empno;dbms_output.put_line('姓名'||r.ename||'工资'||r.sal||'日期'||r.hiredate);//r.字段名:表示某一列的值;dbms_output.putline()是一个屏幕打印函数End;
[*]Table类型:类似于C语言中的结构类型数组:定义方法:TYPE[table_emp]isTableof[emp.ename%type]indexbybinary_integer;//[]内为用户可以修改的部分
使用:mytable=table_emp;mytable(0):='SCOTT';...例:Declarev_empnoemp.empno%type:=&empno;typet_empistableofemp.ename%typeindexbybinary_integer;tt_emp;Beginselectenameintot(10)fromempwhereempno=v_empno;dbms_output.put_line('编码为'||v_empno||'的员工是'||t(10));End;
五、条件控制语句:条件判断语句1.IF-THEN语句:IF条件成立THEN可执行语句;ENDIF;
Declarev_empnoemp.empno%type:=&empno;v_enameemp.ename%type;v_salemp.sal%type;Beginselectsal,enameintov_sal,v_enamefromempwhereempno=v_empno;ifv_sal<2000thenBeginupdateempsetsal=sal+100whereempno=v_empno;dbms_output.put_line('员工'||v_ename||'工资已经修改!');End;Endif;End;
2.IF-THEN-ELSE语句
IF条件成立THEN执行语句1;ELSE执行语句2;ENDIF;
例:Declarev_deptnoemp.deptno%type:=&deptno;inumber(2):=0;Beginloopi:=i+1;insertintoemp(empno,hiredate,deptno)values(i+7200,sysdate,v_deptno);dbms_output.put_line('i的当前值为:'||i);exitwheni=10;endloop;End;
2.WHILE循环:
WHILE条件成立LOOP执行语句;ENDLOOP;
Declarev_deptnoemp.deptno%type:=&deptno;inumber(2):=0;Beginwhilei<10loopi:=i+1;insertintoemp(empno,hiredate,deptno)values(i+7200,sysdate,v_deptno);dbms_output.put_line('i的当前值为:'||i);--exitwheni=10;endloop;End;3.FOR循环:FOR计数器IN低界..高界LOOP执行语句;ENDLOOP;
例:Declarev_deptnoemp.deptno%type:=&deptno;inumber(2):=0;Beginwhilei<10loopi:=i+1;insertintoemp(empno,hiredate,deptno)values(i+7200,sysdate,v_deptno);dbms_output.put_line('i的当前值为:'||i);--exitwheni=10;endloop;End;
七、光标设计(Cursor):
1、什么是光标?在PL/SQL中,当查询语句执行结果超过一行时,为处理每一行,必须定义一个cursor,叫光标。
2、光标使用方法:(1)定义光标:语法:光标名isselect语句;
(2)打开光标:语法:open光标名;
(3)取数据:语法:Fetch光标名into变量;
(4)光标下移:使用loop循环
(5)关闭光标:close光标名;
例:Declarev1emp.empno%type;v2emp.ename%type;v3emp.sal%type;cursorcisselectempno,ename,salfromemp;Beginopenc;loopfetchcintov1,v2,v3;ifv3<3000thenBeginupdateempsetsal=sal+100whereempno=v1;dbms_output.put_line('员工'||v2||'工资已经更新!');End;endif;exitwhenc%NOTFOUND;endloop;closec;End;/
--//要求从emp表中取出按用户输入要求的前几位工资最高的人员及其工资放入topsalary表中:--//我的方法:SQL>createtabletopsalary(namevarchar2(20),salnumber(7,2));SQL>Declarevcountnumber(7):=&n;inumber(7):=0;vnameemp.ename%type;vsalemp.sal%type;cursorcisselectename,salfromemporderbynvl(sal,0)desc;--//使用nvl函数防止工资出现空值的情况,老师补充Begindeletetopsalary;--//先清空topsalary表openc;foriin1..vcountloopfetchcintovname,vsal;insertintotopsalaryvalues(vname,vsal);endloop;closec;End;--//教师的方法Declareinumber(3):=&i;jnumber(3):=0;cursorcisselectename,salfromemporderbynvl(sal,0)desc;v1emp.ename%type;v2emp.sal%type;Beginopenc;loopj:=j+1;fetchcintov1,v2;insertintotopsalaryvalues(v1,v2);exitwhenj=i;endloop;closec;End;
3.光标属性:每一个光标有四种属性%FOUND查询语句(FETCH语句)返回记录%NOTFOUND查询语句(FETCH语句)无返回记录,用于循环退出条件%ROWCOUNTFETCH已获取的记录数%ISOPEN光标已打开标记
例:Declarev1emp.empno%type;v2emp.ename%type;v3emp.sal%type;cursorcisselectempno,ename,salfromemp;Beginopenc;loopfetchcintov1,v2,v3;ifv3<3000thenBeginupdateempsetsal=sal+100whereempno=v1;dbms_output.put_line('员工'||v2||'工资已经更新!');End;endif;exitwhenc%NOTFOUND;endloop;dbms_output.put_line('光标处理的行数:'||C%ROWCOUNT);closec;End;4.隐式光标处理:隐式光标是指在处理SQL时,不需定义光标,所使用的SQL语句包括:INSERT,UPDATE,DELETE子句。
隐式光标属性:SQL%FOUNDSQL%NOTFOUNDSQL%ROWCOUNT
隐式光标的使用:Declarev_empnoemp.empno%type:=&empno;Begindeletefromempwhereempno=v_empno;ifSQL%NOTFOUNDthendbms_output.put_line('你的删除失败,数据库无此人:'||v_empno);endif;End;
[例外处理Exception]Declarev_empnoemp.empno%type:=&empno;v_enameemp.ename%type;v_salemp.sal%type;Beginselectsal,enameintov_sal,v_enamefromempwhereempno=v_empno;ifv_sal<2000thenBeginupdateempsetsal=sal+100whereempno=v_empno;dbms_output.put_line('员工'||v_ename||'工资已经修改!');End;elsifv_sal<2500thenBeginupdateempsetsal=sal+50whereempno=v_empno;dbms_output.put_line('员工'||v_ename||'工资已经修改!');End;elsifv_sal<3000thenBeginupdateempsetsal=sal+10whereempno=v_empno;dbms_output.put_line('员工'||v_ename||'工资已经修改!');End;elsedbms_output.put_line('员工'||v_ename||'的工资已经超过规定值,不予更新!');Endif;Exception--//例外处理whenNO_DATA_FOUNDthendbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');whenTOO_MANY_ROWSthendbms_output.put_line('你的查询语句返回结果出现多行,请定义光标后重试!');whenOTHERSthendbms_output.put_line('你的程序是错误的,请仔细检查后重试!');End;
[用户定义的例外](1)在Declare段定义(2)在Begin段中用Raise引起。(3)在Exception段中使用。
Declarev_empnoemp.empno%type:=&empno;no_resultexception;Begindeletefromempwhereempno=v_empno;ifSQL%NOTFOUNDthenraiseno_result;endif;Exception--//例外处理whenNO_DATA_FOUNDthendbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');whenNO_RESULTthendbms_output.put_line('数据库中没有编码为'||v_empno||'的员工。');whenTOO_MANY_ROWSthendbms_output.put_line('你的查询语句返回结果出现多行,请定义光标后重试!');whenOTHERSthendbms_output.put_line('你的程序是错误的,请仔细检查后重试!');End;
[存储过程(StorageProcedure)与函数(Function)设计]
一、什么是存储过程?存储过程(函数)是把一个PL/SQL块存储到数据库中,作为一个数据库实体,可以在其它存储过程、函数、应用程序中调用。1、存储过程的调用方法:(1)在SQL*Plus中调用方法:SQL>Execute存储过程名称;//execute可以简写为Exec。(2)在其它存储过程、函数、应用程序中调用方法:存储过程名称;
2、存储过程的设计方法:编写程序->在SQL*PLUS中编译->修改错误->调用执行。
二、创建存储过程的语法:[参考PowerPoint教程:存储过程1.ppt(P3)]说明:IN:调用者向过程传递参数OUT:过程向调用者传递参数INOUT:双向传递参数无Declare
[例1:]IN:删除数据CreateorReplaceprocedureDelEmp(v_empnoinemp.empno%type)isBegindeletefromempwhereempno=v_empno;dbms_output.put_line('编码为'||v_empno||'的员工已被除名!');EndDelEmp;
调用方法:SQL>ExecDelEmp(7788);SQL>ExecDelEmp(7934);
[例2:]IN:插入数据CreateorReplaceprocedureInsertEmp(v_empnoinemp.empno%type,v_enameinemp.ename%type,v_deptnoinemp.deptno%type)isBegininsertintoemp(empno,ename,hiredate,deptno)values(v_empno,v_ename,sysdate,v_deptno);dbms_output.put_line('新员工“'||v_ename||'”录入成功!');EndInsertEmp;
[例3:]IN、OUT:数据查询CreateorReplaceprocedureQueryEmp(v_empnoinemp.empno%type,v_enameoutemp.ename%type,v_joboutemp.job%type)isBeginselectename,jobintov_ename,v_jobfromempwhereempno=v_empno;EndQueryEmp;
调用方法:Declarev1emp.ename%type;v2emp.job%type;vemp.empno%type:=&empno;BeginQueryEmp(v,v1,v2);dbms_output.put_line('编码为'||v||'的员工姓名是:'||v1||'职业是:'||v2);End;
[*查询存储过程源代码:]SQL>selecttextfromuser_sourcewherename='DELEMP';//名字要大写
三、创建函数语法:例1:CreateorreplaceFunctionGetSalary(vempno%type)returnnumbwrisv_salemp.sal%type;Beginselectsalintov_salfromempwhereempno=v;returnv_sal;EndGetSalary;[调用方法:](1)SQL>Execdbms_output.put_line(GetSalary(7788));(2)SQL>selectGetSalary(7788)fromdual;(3)使用PL/SQL的方法:Begindbms_output.put_line(GetSalary(7788));End;
[函数例2]Createorreplacefunctiongetmaxsalreturnnumberisv_maxsalemp.sal%type;beginselectmax(sal)intov_maxsalfromemp;returnv_maxsal;endgetmaxsal;[调用方法:](1)SQL>Execdbms_output.put_line(GetMaxSal);(2)SQL>selectGetMaxSalfromdual;(3)使用PL/SQL的方法:Begindbms_output.put_line(GetMaxSal);End;[练习题]:求n!函数(n的阶乘)。
[我的答案]Createorreplacefunctionnj(ninnumber)returnnumberisnumtmpnumber;Beginifn=0thennumtmp:=1;elsenumtmp:=n*nj(n-1);endif;returnnumtmp;Endnj;[教师的答案]//高,实在是高!!!Createorreplacefunctionfn(ninnumber)returnnumberisBeginifn=0thenreturn1;elsereturnn*fn(n-1);endif;Endfn;
四、存储过程及函数管理:1、查询存储过程及函数的源代码:SQL>select*fromuser_source;SQL>select*fromdba_source;SQL>select*formall_source;
权限回收:SQL>Revokeexecuteon过程(或函数)from用户名;SQL>Revokeexecuteon过程(或函数)frompublic;
3、查询错误信息:SQL>select*fromuser_errors;SQL>showerrors;
4、查询依赖性信息:依赖性:实体的结构定义修改时,对创建在这些实体上的存储过程及函数的影响叫依赖性。
显示依赖性关系:SQL>selectname,type,referenced_owner,referenced_name,referenced_typefromuser_dependencies;
5、删除存储过程及函数:SQL>dropprocedure过程名;SQL>dropfunction函数名;
[包(Package)的设计与开发]
三、包的开发步骤:1、创建包的说明部分:Createpackage2、创建包体部分:Createpackagebody3、在SQL*Plus中运行创建包4、在存储过程、其它应用中调用。在SQL*Plus中调用方法:SQL>exec包名.过程名;
在存储过程、函数、其它应用中调用方法:包名.过程名;
四、创建包的语法:1、创建包(说明部分):请参考PowerPoint教程:存储过程1.ppt[Page10]
2、创建包体(CreatePackageBody):请参考PowerPoint教程:存储过程1.ppt[Page11]
3、例:请参考PowerPoint教程:存储过程1.ppt[Page12、13、14、15]
五、包的删除:SQL>droppackage包名;SQL>droppackagebody包名;
查询包源代码:SQL>selecttextfromuser_sourcewherename='包名';//包名大写。
[数据库触发器(Triggers)设计与开发]
一、什么是触发器?数据库触发器是一个存储的PL/SQL程序块,它与一个基表联系,当在表上执行特定的数据库维护(插入、删除、更新这三种操作)时,隐含地执行一个PL/SQL程序块。
2、触发事件:什么SQL语句会引起触发器触发(Insert,delete,update)[3]
3、触发子体:触发器触发时要执行的操作(一个完整的PL/SQL程序)
4、触发类型:触发器被执行的次数(语句级、行级)[2]//语句级只执行一次,行级会执行多次。
[*]一个表上最多可以创建12个不同类型的触发器:3*2*2=12
四、创建触发器注意事项:1、在触发器中可以调用存储过程、包;在存储过程中不得调用触发器。
2、在触发器中不得使用commit,rollback,savepoint语句。
3、在触发器中不得间接调用含有commit,rollback,savepoint的语句的存储过程及函数。
五、创建语句级触发器:语句级触发器:请参考PowerPoint教程:存储过程1.ppt[Page19]该触发器在数据库操作时只执行一次。说明:。update中的of是可选项,用于指定语句要修改的列。要创建的触发器已经存在时,使用replace选项
[触发器数据字典]SQL>selecttable_owner,table_name,trigger_bodyfromuser_triggerswheretrigger_name='DELEMP';
//例2:After型触发器:CreateorreplacetriggerInsertEmpafterinsertonemp//如果是before,就会比after的结果少一名。Declarev_empcountnumber(7);Beginselectcount(*)intov_empcountfromemp;dbms_output.put_line('目前员工总数已达到:'||v_empcount||'名。');End;
endif;End;
六、创建行级触发器:等级触发器:增加选项foreachrow,使触发器在每一行上触发。
1、创建行级触发器注意事项:(1)在行级触发器中,在列名前增加old表示该列修改前值,增加new表示该列修改后值。(2)在PL/SQL中引用时,前边增加冒号。[例4:行级触发器]//必须是对所有的行进行操作才行。CreateorReplacetriggerUpdateEmpBeforeupdateonempforeachrowBegindbms_output.put_line(:old.sal||'--------->'||:new.sal);End;
[例5:保存历史数据,这种使用方法很重要,用来保存关键表的历史数据]CReateorReplacetriggerChangeEmpBeforeupdateordeleteonempforeachrowBeginInsertintooldemp(empno,ename,job,hiredate,sal)values(:old.empno,:old.ename,:old.job,sysdate,:old.sal);End;
SQL>createtableoldempasselectempno,ename,job,hiredate,salfromempwhere1>2;
[例6:修改外键]CreateorReplacetriggerUpdateDeptafterupdateondeptforeachrowBeginupdateempsetemp.deptno=:new.deptnowhereemp.deptno=:old.deptno;End;
七、触发器管理1、使触发器失效:SQL>altertrigger触发器名称disable;//失效SQL>AlterTrigger触发器名称enable;//生效
SQL>Altertable表名DISABLEalltriggers;//一个表上的所有触发器失效SQL>Altertable表名ENABLEalltriggers;//使一个表上的所有触发器生效
SQL>DropTrigger触发器名;//删除触发器;
[第一章]Oracle数据库体系结构物理结构逻辑结构内存结构进程结构
[数据库管理员DBA(DatabaseAdministrator)]DBA职责:。Oracle核心软件安装与产品升级。为数据库系统分配存储空间及规划未来存储需求。创建数据库存储结构。用户权限与角色管理。监视与控制用户对数据库的存储。维护数据库安全。完成数据库备份与恢复。监视与优化数据库性能
一、物理结构:数据库是由构成数据库的操作系统文件所组成。UNIX:/u01/app/oracle/oradata/db_name/*.*WindowsNT/2000:D:/Oracle/oradata/db_name/*.*
//为保证数据安全,只要将此目录中的所有文件备份即可。Control0X.CTL文件(X为1,2,3)是一样的,只要有一个完好就可以。
包含三类物理文件:1、数据文件(DataFiles):存储数据库数据的文件,表、索引、存储过程等都存储在数据文件中。
[*]查询数据文件信息:SQL>select*fromdba_data_files;
/*数据文件的大小只是表示有多少存储数据的空间,并不表示数据量的大小。*/
[*]查询表空间空闲空间:SQL>select*fromdba_free_space;//显示结果中包括碎片SQL>selecttablespace_name,sum(bytes)fromdba_free_spacegroupbytablespace_name;[*]表空间碎片合并命令:SQL>altertablespace表空间名coalesce;
SQL>altertablespacetempcoalesce;
[*]数据块大小控制参数:db_block_size=2K-32K在数据库安装后,数据块大小不得修改。
系统缺省值如下:Oracle7,Oracle8,Oracle8i8.1.5:2048(2K)
Oracle8i8.1.6:8192(8K)
Oracle8i8.1.7:8192(8K)
这个参数存储在d:/oracel/admin/db_name/pfile/init.ora文件中。
SQL>selectbytes,blocks,blocks*8192,file_namefromdba_data_files;
数据文件的大小都是数据块的整数倍。数据块的大小在数据库安装之前确实,数据库安装之后就不能再修改。
[*]显示数据块大小:(1)d:/svrmgrlSVRMGR>connectinternal/oracle
SVRMGR>showparameterdb_black_size
SQL>selectvalueformv$parameterwherename='db_block_size';(小写)
[1.1]在Oracle数据库中,数据文件大小可以修改,命令如下:SQL>Alterdatabasedatafile'数据文件名及路径'resizexxM;
SQL>alterdatabasedatafile'd:/oracle/oradata/ora8i/system01.dbf'resize100m;//上一行中ora8i在具体系统中应该是相应的数据库名
更改之前,查询相应磁盘是否有空闲空间。用相同的方法可以压缩数据文件的大小,但不能小于已经存储的数据的大小。
[1.2]在Oracle8i数据库中,数据文件的大小可以自动扩展,命令如下:SQL>Alterdatabasedatafile'数据文件名及路径'autoextendon;--//该数据文件允许自动扩展(缺省)
SQL>Alterdatabasedatafile'数据文件名及路径'autoextendoff;--//该数据文件不允许自动扩展
[*]查询数据文件自动扩展属性:SQL>selectbytes,autoextensible,maxbytes,file_namefromdba_data_files;
SQL>Alterdatabasedatafile'数据文件名及路径'autoextendonnext50m--//每次扩展50Mmaxsize1000m;--//最大扩展到1000M,如果unlimited,则受磁盘大小的限制[*]查询每次扩展量:SQL>selectbytes,increment_by,file_namefromdba_data_files;
[安全起见,建议把自动扩展关闭]
[C.1]SunEnterprise6500:8*34Gsystem01.dbf==>33G
SQL>Altertableempdeallocateunused;--//压缩表未用空间
2、日志文件(Redologfiles):记录数据库修改前后的信息,用于数据库恢复。
每一个数据库至少有两个日志文件组,每组有一个或多个日志成员文件。每个组的成员文件的缺省大小是1M。
[*]假设有三个组,每个组有三个成员文件,Oracle的日志工作流程(概括起来为循环覆盖):
(1)每个组中的日志成员文件之间的关系是镜像关系,每个成员分别存储到不同的物理磁盘上,只有全部损坏,这个组才算损坏。如果只有一个成员,则这个数据库是不安全的。
(2)在同一个时刻,只有一个组在工作。当第一组不能全部存放要记录的数据时,则转换到第二组,如果第二组仍然写不下,则转到第三组,第三组仍然存不下,则再转回到第一组。如果第一组日志的归档模式为归档日志,则第一组日志中存储的数据归档到磁盘或者磁带上,然后数据被覆盖,如果是非归档日志(默认模式,建议改变为归档模式),则新的数据直接覆盖第一组的数据,这种情况就会造成数据丢失。
[*]确认数据库(日志)归档方式:SQL>selectlog_modefromv$database;
SVRMGR>archiveloglist
[C*]Oracle的数据库恢复不完全数据库恢复:通过备份来回退,会造成部分数据的丢失完全数据库恢复:数据不会丢失。两种情况下都需要用到日志,日志对于数据库的恢复至关重要。
[*](1)在线日志:v$log//当前使用的日志,currentSQL>select*fromv$log;
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME--------------------------------------------------------------------------------------------1119910485761NOCURRENT1533022002年04月2119710485761NOINACTIVE1123352002年04月3119810485761NOINACTIVE1324502002年04月[如果当前日志文件损坏,则数据库无法恢复。(打死也恢复不了)。][C*]日志文件组的名称是:REDO0X.LOG(X=1,2,3)。[对于Oracle数据库来说,还有一个关键文件是SYSTEM01.DBF,如果这个文件坏了,整个数据库系统无法启动,数据也会全部丢失。]
[!!!一定要做好数据库及日志的备份!!!]
日志文件:v$logfile//日志文件归档日志:v$archived_log//日志组切换时归档到磁盘或者磁带上的日志
(4)历史日志:v$log_history//日志的历史记录SQL>select*fromv$log_history;
[*]RedoLog文件镜像(1)一组中RedoLog文件具有相同的信息。(2)选择合适的日志文件大小(不能太小,太小容易导致频繁的切换,从而导致过多的磁盘I/O,降低系统的性能)。[C*]内存的多少对数据库系统性能的影响是最重要的,日志虽然对系统性能有影响,但没有内存关键,内存一定要大。
[C*]Oracle数据库最大化参数:maxlogmembers:最大值是5,缺省值是2。maxlogfiles:最大254,缺省32个。//最大的日志文件个数maxdatafiles:最大65534,缺省254。maxloghistory:最大65534,缺省65534maxinstances:最大63,缺省1。
[组不需要太多,至少三个,四个一般就可以了]
[C*不同日志文件组的文件大小可以不同,两个组中文件的个数也可以不同](3)组中的成员同时被更新。...[请参考PowerPoint教程]
[*]日志切换:DBA强制日志切换命令:SQL>altersystemswitchlogfile;
[*]在Oracle中,文件的扩展名没有任何意义,从以下数据字典中查询相应的文件的文件名(1)表空间文件*.dbf:dba_data_file,v$datafile(2)日志文件*.log:v$logfile(3)控制文件*.ctl:v$controlfile
SQL>select*fromv$log;
查询数据文件同步号:SQL>seelctfile#,checkpoint_change#,fromv$datafile;
控制文件同步号:SQL>selectcheckpoint_change#fromv$database;
Oracle不提供修改同步号的命令。如果在一个数据库中出现同步号不一致的情况,说明这个数据库的数据已经有不一致的部分,原因可能是进行了不完全恢复,只有当数据完全恢复后,同步号才能重新变得一致。
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME--------------------------------------------------------------------------------------------1119910485761NOCURRENT1533022002年04月2119710485761NOINACTIVE1123352002年04月3119810485761NOINACTIVE1324502002年04月上述显示结果中的SEQUENCE#的最大值是65534,如果达到最大值,会自动清零,从头开始。
[*]日志管理与配置命令A.增加日志文件组:SQL>AlterdatabaseADDlogfilegroupn('第一个日志成员文件','第二个日志成员文件')sizexxM;//n为组号。第二个日志成员文件为可选的,两个成员文件最好放到不同的物理磁盘上。
SQL>AlterdatabaseADDlogfilegroup4('d:/oracle/oradata/ora8i/log41.log','d:/oracle/oradata/ora8i/log42.log')size5m;
SQL>AlterdatabaseADDlogfilegroup4('d:/oracle/oradata/ora8i/log41.log','d:/oracle/oradata/ora8i/log42.log')REUSE;//如果在相应的路径下存在同名文件,请加Reuse直接覆盖原来的文件。
[C*]:Oracle不提供修改原来的日志组的属性(文件大小)的命令,解决办法是先创建新的,然后删除旧的
//*************************************实际操作内容************************************************SQL>AlterdatabaseADD2logfilegroup4('d:/oracle/oradata/ora54/ReDo41.log','d:/oracle/oradata/ora54/ReDo42.log')3size5m;
数据库已更改。
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME--------------------------------------------------------------------------------------------1119910485761NOCURRENT1533022002年04月2119710485761NOINACTIVE1123352002年04月3119810485761NOINACTIVE1324502002年04月41052428802YESUNUSED0
SQL>altersystemswitchlogfile;
系统已更改。
SQL>/
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME--------------------------------------------------------------------------------------------1119910485761NOINACTIVE1533022002年04月2120110485761NOINACTIVE1534352002年04月3120210485761NOCURRENT1534362002年04月4120052428802NOINACTIVE1534342002年04月/*****************************************************************************************************/
B.删除日志文件组:SQL>AlterdatabaseDROPlogfilegroupn;
说明:(1)Current,Active组不得删除,如果是归档日志组,要求先归档,否则,该组状态为ACTIVE,不能删除。(2)数据库只有两个日志组时,不得删除。(3)逻辑删除后,再删除物理文件。切记:不要删除错了文件,尤其是在UNIX下,最好在删除之间检查正在使用的物理文件,(当然,如果删除之前先备份文件更好)如下命令:SQL>select*fromv$logfile;
C.增加日志成员文件:SQL>AlterdatabaseADDlogfilemember'成员文件名及路径'togroupn;
D.删除日志成员文件:SQL>AlterdatabaseDROPlogfilemember'成员文件名及路径';
说明:(1)Current,Active组的成员不得删除;(2)日志组只有一个成员时,不得删除成员,可以删除组。
(1)查询数据库跟踪文件信息(跟踪文件记录所有影响控制文件修改的命令):D:/oracle/admin/db_name/bdump/SIDalrt.log//SID视具体情况而定/u01/app/oracle/admin/db_name/bdump/alert_sid.log
(2)建议设置:。至少设置两个控制文件并保存于不同的磁盘。。在数据库参数文件中的Control_files指明控制文件。.控制文件可以镜像,可以在安装或者安装完成后进行配置.[(2).C]数据库参数文件名称及路径:Unix:/u01/app/oracle/admin/db_name/pfile/initSID.ora
WindowsNT/2000:D:/oracle/admin/db_name/pfile/init.ora
指明控制文件的参数:control_files=('file1','file2','file3')例:control_files=("D:/Oracle/oradata/ora54/control01.ctl","D:/Oracle/oradata/ora54/control02.ctl","D:/Oracle/oradata/ora54/control03.ctl")(3)查询控制文件名及路径:SQL>select*fromv$controlfile;
(4)控制文控镜像方法:A.关闭数据库B.复制控制文件到目标路径C.修改参数文件control_files,包含新的控制文件D.重启数据库
二、逻辑结构:数据库的逻辑结构包括:。表空间(Tablespaces)。段(Segments)。区(Extents)。数据块(DataBlocks)
数据块->区->段->表空间->(逻辑)数据库(1)表空间://对应四种不同的段类型,Oracle有四种对应的表空间。数据表空间。索引表空间:INDX。临时表空间:TEMP。回退表空间:RBS
(2)段(Segments)的四种类型:。数据段:用来存储基表数据。索引段:存储索引数据。临时段:用于排序(Orderby)、汇总等。回退段:用于事务回退,rollback语句使用
//临时段和回退段占的空间固定,不能增大。//Oracle中最复杂的就是回退段管理。//每个段的结构都大致相同,即包含若干个区,每个区的大小又是数据块的整数倍。//表空间是Oracle中最大的逻辑结构
1、表空间(Tablespaces):(1)表空间的特点与作用:。控制数据库数据磁盘分配
。跨越磁盘存储数据
。表空间通过离线(Offline)、在线(online)控制数据可用性。
[A]设置表空间offline、online、readonly、readwrite属性:SQL>Altertablespace表空间名offline;SQL>Altertablespace表空间名online;//正常状态SQL>Altertablespace表空间名readonly;SQL>Altertablespace表空间名readwrite;//正常状态
[system表空间不得offline]
[B]查询表空间信息:SQL>select*fromdba_tablespaces;SQL>selecttablespace_name,statusfromdba_tablespaces;
。完成部分数据库的备份与恢复
。表空间通过数据文件来扩大,表空间大小等于构成该表空间的所有数据文件大小之和。
[A]查询表空间与数据文件之间的关系:SQL>selecttablespace_name,file_namefromdba_data_files;
2、段(Segments):(1)数据段:存储基表数据的段,由Createtable命令产生。用户在创建基表时,则自动在用户缺省表空间中创建一个数据段。[A]查询用户与用户缺省表空间对应关系:SQL>selectusername,default_tablespacefromdba_users;[B]查询表与所在表空间的对应关系:SQL>selecttable_name,tablespace_namefromuser_tables;
如果一个表有分区,则用上面这个命令无法查询表所使用的表空间,因为表使用了多个表空间。查询方法如下:SQL>selectpartition_name,segment_type,tablespace_naemfromuser_extentswheresegment_name='EMPLOYEE';
(2)、索引段:存储索引数据的段,由Createindex命令产生。用户在创建索引时,则自动在用户缺省表空间中创建一个索引段。[A]索引与所在表空间的对应关系:SQL>selectindex_name,tablespace_namefromuser_indexes;
[B]使用索引表空间创建索引:SQL>createindexemp_jobonemp(job)tablespaceindx;//如果不加tablespaceindx,则索引默认创建在用户缺省表空间中。
(3)临时段:用户排序、汇总时临时工作空间。临时段表空间在DBA创建用户时确定。创建用户时未指定临时表空间,则系统自动使用system表空间作为临时表空间使用。临时表空间公用(temp)。[A]查询用户及所使用的临时表空间:SQL>selectusername,temporary_tablespacefromdba_users;
//建议不要使用system作为用户的临时表空间,因为容易导致碎片。
[B]DBA可以修改用户的临时表空间SQL>Alteruser用户名temporarytablespacetemp;
(4)回退段:用于用户在回退事务时使用。回退段由DBA创建,全体用户公用。[A]查询回退段及所对应的表空间:SQL>selectsegment_name,tablespace_name,statusfromdba_rollback_segs;
[B]为什么要设回退段回退段是数据库的一部分,是Oracle数据库的一个重要参数,其设计是否正确直接影响到数据库的动态性能。Rollback段的使用用于保存一个事务的操作,以便在某些情况下回退或取消操作。每个Oracle数据库都有多个回退段。
[C]回退段的作用。并发操作时,保证数据的读一致性。。使用SQL语句rollback回退一个事务的操作。。事务恢复的需要。
[D]回退段操作举例。由于语句错误回退一个事务。。回退一个事务、或回退事务到一个保存点(SavePoint)。。由于异常进程中断而回退。。在例程恢复中回退所有未完成的事务。
//delete操作是最消耗回退段的操作
[E]回退段使用原则。根据事务大小及数量确定回退段。//每四个用户至少对应一个回退段。每个事务必须对应一个回退段。。一个事务可以根据回退段中“最少使用原则”来自动对应一个回退段。[C*]只有delete、insert、update三个命令使用回退段//回退段可以自动动态扩展,但不能无限扩展。
/*如果回退段都已经被用户占用,那么再增加新用户,则新用户使用所有回退段中磁盘扩展量最小的回退段(与其它用户共享使用),这就是“最少使用原则”。因此,回退段可以共享。*/
。在创建数据库后,应为系统创建回退段,事务越多,回退段应越多。
3、区(Extents):区是磁盘空间分配最小单位。每一个区的大小都是数据块的整数倍(用户可以指定,默认是5倍)。
SQL>selectsegment_type,extent_id,bytes,blocksfromuser_extentswheresegment_name='EMP';(1)区大小控制参数(磁盘存储参数)://下面这五个参数对磁盘存储有直接影响Initial:初始区大小Next:增长区大小Minextents:区的最小个数Maxextents:区的最大个数Pctincrease:区的增长百分比
SQL>Createtablesales(s1char(20),s2char(20)Storage(initial10K--//第一个分区的大小next10K--//第二个分区的大小minextents1--//最少一个分区maxextents121--//最多121个分区pctincrease50);--//区的增长比例为50%。以上语句中的Storage部分,在建表时如果不写是要隐含执行的。1Block=2K第一个分区:Initial=10K=1Blocks*5第二个分区:Next=10K第三个分区=Next+next*50%=10K+5K=>变成blocks的整数倍=16K第四个分区=第三个分区*(1+50%)...
例:SQL>Createtablesales(s1char(20),s2char(20)Storage(initial100Knext200Kminextents2maxextents121pctincrease0);
/*区太小,会导致区的数目太多,进一步导致磁盘碎片的产生。而区太大,则容易浪费空间。因此,要选择合适的分区大小。最好的办法是根据数据量的大小给表只分一个区。*/估算分区的大小的方法:以上面例子中的表为例:(1)1行=40B(2)1block=2048B,2048B-2048*20%-标识=1547//2048*20%表示给一个块儿留的剩余空间,标识是用来存储表中每行在块中的位置的信息,其大小可以通过查询V$type_size来获得(3)1547/40=A(4)假设表中可能有1百万行的数据(最大数据量),则1000000/A*2K=B兆。
则initial为B兆,此时next值不要太大,因为initial区中已经分配了足够的空间,假设是100M,那么可以把Next设置成1M。
(2)区存储参数可以用于:表空间、表、段(回退段)、索引
(3)存储参数优先使用原则:实体级参数>表空间级对应参数>系统缺省参数
实体级参数:指建立实体(如建表)时指定的存储参数表空间级对应参数:可以从dba_tablespaces数据字典中查询。
(4)查询实体的存储参数:SQL>selectinitial_extent,next_extent,min_extents,max_extents,pct_increasefromuser_tableswheretable_name='EMP';
[C*有时SQL*Plus中查询某个字段较多的表时,屏幕宽度不够,而滚动条又不能横向滚动,此时修改环境变量中的arraysize参数,将缓冲区宽度修改一下,默认是1000,可以修改成500,保存设置后即可使用横向滚动条。]
(5)存储参数的修改:SQL>AltertableempStorage(next200kmaxextents2000pctincrease50);--//五个参数中只有这3个能够修改
4、数据块(Blocks):数据文件存储空间单位,I/O最小单位。数据块大小由参数db_block_size决定,数据库创建后不得修改。(1)查询数据块大小:SQL>selectvaluefromv$parameterwherename='db_block_size';
[在实用情况中,SGA当然是越大越好,但最大不要超过系统可用内存的55%~57%。]
。查询SGA及数据参数取值:SVRMGR>showsgaSVRMGR>showparameterSVRMGR>showparameterdbSVRMGR>showparameterlogSVRMGR>showparameter参数名称
SQL>select*fromv$sga;SQL>select*fromv$sgastat;
查询数据库名称:SQL>selectnamefromv$database;查询数据库实例名称:SQL>selectinstance_namefromv$instance;
2、程序全局区PGA(PragramGlobalArea):非共享区域,主要是用户编程时变量、数组工作区域。
3、排序区SORTAREA:用户使用orderby排序、汇总时临时工作区域。排序区大小由参数SORT_AREA_SIZE确定。
4、大区(LargePool):使用于数据备份工具Rman,只用在Oracle8以上的版本数据库,大区的大小由参数:Large_Pool_size确定。
5、Java语言区(JavaPool):用于Oracle8i、Oracle9i中的Java语言。Java区的大小由参数Java_Pool_Size确定。
四、Oracle实例的进程结构:1、什么是Oracle实例?数据库启动时,系统分配SGA内存区域,同时启动后台进程,该SGA与后台进程合称为一个Oracle实例(Instance)。Instance==>SGA+BackgroundProcesses
数据库与实例相联系,有一个数据库就有一个实例。实例名用参数instance_name表示,数据库名用参数db_name表示。
。数据库实例名:instance_name(Oracle参数)ORACLE_SID(操作系统环境变量)在Unix系统中选择数据库实例:$ORACLE_SID=ora8i$exportORACLE_SID存取另一个数据库时:$ORACLE_SID=ora835$exportORACLE_SID$svrmgrl在WindowsNT/2000中选择数据库实例:c:/>setORACLE_SID=ora8iC:/>svrmgrlC:/>setORACLE_SID=ora835C:/>svrmgrl[*]在WindowsNT/2000中,数据库实例名定义在注册表中。2、Oracle实例的进程结构:Oracle进程:单进程多进程==>用户进程、服务器进程、后台进程。Dnnn(Dispatcher):调度进程ARCH:归档进程PMON:进程监控SMON:系统监控CKPT:checkpointRECO:Recovery[*]进程数量的限制参数:Processes,Oracle数据库进程数Processes
[*]数据存取方法:a.用户发出查询命令,产生user进程,server进程查找内存。b.server进程在内存没有找到数据时,则server进程从数据文件中读数据,则server进程在LRU找空闲块。c.将LRU中的dirty块-->DirtyListd.DirtyList超长(threshold),通知DBWR刷新缓冲区。e.从磁盘读数据进入空闲内存。
五、Oracle连接配置结构
3、多线程服务器体系结构MTS(MultithreadedServer)
SVRMGR>showparametermts;
[第二章数据库启动与关闭]
一、数据库启动:Unix:login:oraclePassword:xxxx$$ORACLE_HOME:/home/app/oracle/product/8.1.7$svrmgrlSVRMGR>connectinternalSVRMGR>startupSVRMGR>exit[*]启动监听进程:$lsnrctlstart如果在启动时报错,检查:/home/app/oracle/product/8.1.7/network/admin/listener.ora$lsnrctlstop//停止监听进程$lsnrctlstatus//显示监听进程状态二、数据库启动过程:1、启动数据库实例:ORACLEinstancestarted。读取参数文件。分配SGA区。启动后台进程//如果启动出现问题,有可能是因为参数文件有问题或者内存不足。2、数据库安装:Databasemounted。读取控制文件。打开控制文件//如果启动出现问题,可能是控制文件出现问题。3、打开数据库:Databaseopened。打开全部数据文件。打开全部日志文件//如果有一个文件出现问题,则数据库不能启动。数据库文件读取顺序:参数文件==>控制文件==>日志、数据文件,三类文件中不能有一个文件损坏,否则数据库不能启动。
4、数据库启动过程中可以使用的选项:
SVRMGR>startupOPEN--1、2、3//加OPEN与不加OPEN效果相同,1、2、3指三个步骤:启动实例==>安装数据库==>打开数据库SVRMGR>startupMOUNT--1、2启动实例=>安装数据库SVRMGR>startupNOMOUNT--1只启动数据库实例
(1)OPEN用于数据库的正常启动(或不加OPEN)。(2)MOUNT的使用方式:。用于修改数据库归档方式。用于数据库恢复。Recovery命令在mount状态使用。在mount状态,所有v$xxxx数据字典可以使用,所有alterdatabase命令可以使用。
(3)NOMOUNT的使用方式:。创建控制文件。创建新的数据库(4)数据库在MOUNT下可以使用的选项:SVRMGR>startupMOUNTSVRMGR>AlterdatabaseARCHIVELOG;//将数据库由非归档方式修改为归档方式[*]SVRMGR>AlterdatabaseNOARCHIVELOG;//将数据库由归档方式修改为非归档方式//SVRMGR>archiveloglist//SVRMGR>selectlog_modefromv$database;SVRMGR>AlterdatabaseOPEN;//将数据库由MOUNT直接到OPEN状态。SVRMGR>AlterdatabaseOPENREADONLY;//整个数据库以只读方式打开SVRMGR>AlterdatabaseOPENREADWRITE;//整个数据库以读写方式打开(系统缺省方式,不需要写上READWRITE)
[2002.05.14]//=====================================================================================================================
(5)数据库在OPEN下可以使用的选项:[A]SVRMGR>startupPFILE=参数文件名称及路径
//在有两个数据库存在的情况下,可以用如下方法同时启动两个数据库。SVRMGR>startupPFILE=第一个数据库的参数文件名称及路径SVRMGR>startupPFILE=第二个数据库的参数文件名称及路径
[B]SVRMGR>startupRESTRICT//限制性数据库启动命令,以这种方式启动数据库后,具有restrictedsession权限的用户可以连接数据库,其他用户不能连接。
DBA可以指定用户连接:SQL>grantrestrictedsessiontoscott;//指定权限SQL>revokerestrictedsessionfromscott;//收回权限
修改限制:SQL>Altersystemdisablerestrictedsession;//解禁SQL>altersystemenablerestrictedsession;//禁止
[C]SVRMGR>startupFORCE//强制性数据库启动命令
[D*]允许多个选项同时使用,顺序没有关系:SVRMGR>startupPFILE=c:/init.oraFORCEMOUNTSVRMGR>startupforcerestrictpfile=c:/init.ora
三、数据库关闭命令:在关闭服务器之前,必须使用shutdown命令先关闭数据库,再关闭操作系统。
SVRMGR>shutdownnormal//正常关机。系统等待所有用户从数据库中正常退出,很难关掉。SVRMGR>shutdownimmediate//立即关机。中断现在连接,回退未提交事务,不再接收用户的连接请求。(有的用户数据会丢失)SVRMGR>shutdownabort//异常关机。只关闭实例,释放内存,不保证数据完整性。尽量少用。SVRMGR>shutdowntransactional//事务终结后关机。等待用户提交数据后关闭数据库。
[补充内容]四、数据库启动过程中失败恢复方法:
1、第一步不启动(实例):参数文件错误:参数错误、路径、文件名、参数设置错误等。
2、第二步不能mount:控制文件坏。检查有没有镜像文件,如果没有,需要重新创建控制文件。
3、第三步,数据库不能Open。数据文件或日志损坏。
(1)数据文件(Datafile)被破坏或被误删除时数据库的恢复方法。SVRMGR>startupmount
[A]如果数据库运行在ARCHIVELOG模式下,使用以下命令:SVRMGR>alterdatabasedatafile'被删数据文件名及路径'OFFLINE;//在归档方式下,这个被删的文件可能通过归档日志恢复数据。
打开数据库:SVRMGR>Alterdatabaseopen;
[B]如果数据库运行在NOARCHIVELOG模式下,使用以下命令:SVRMGR>alterdatabasedatafile'被删数据文件名及路径'OFFLINEDROP;//在非归档方式下,被删数据文件的内容绝对不可能恢复,所以只好DROP掉。
(2)日志文件(RedoLogFiles)被破坏或被误删除时数据库的恢复方法。SVRMGR>startupmount
删除被物理破坏的日志文件组:SVRMGR>Alterdatabasedroplogfilegroupn;
增加已经被物理破坏的日志文件组:SVRMGR>Alterdatabaseaddlogfilegroupn('日志成员文件','日志成员文件')sizexxM;
SVRMGR>Alterdatabaseopen;
//如果当前日志被破坏,则恢复操作将比较复杂,必须通过数据库备份来恢复(不完全恢复)。
4、重新创建控制文件(ControlFiles):创建控制文件的语法:SVRMGR>startupnomountCreatecontrolfiledatabase数据库名称logiflegroup1(日志文件名及路径'','日志文件名及路径')sizexxM,group2(日志文件名及路径'','日志文件名及路径')sizexxM,...noresetlogsdatafile'第一个数据文件名称及路径'sizexxM,//xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。'第二个数据文件名称及路径'sizexxM,...charactersetzhs16gbk;SVRMGR>startupnomountCreatecontrolfiledatabaseora8ilogfilegroup1('d:/oracle/oradata/ora8i/redo01.dbf')size1M,group2('d:/oracle/oradata/ora8i/redo02.dbf')size1M,group3('d:/oracle/oradata/ora8i/redo03.dbf')size1M,noresetlogsdatafile'd:/oracle/oradata/ora8i/system01.dbf'size70M,'d:/oracle/oradata/ora8i/rbs01.dbf'size520M,...charactersetzhs16gbk;
SQL>selectbytes/1024/1024,blocks,file_namefromdba_data_files;//通过这个命令来查询数据文件的大小,以Oracle中查询的数据为准,不要根据操作系统显示的文件大小来决定,建议事先做好备份。
[*C]修改数据库名称时,需要重新创建数据库控制文件,语法如下(注意与上面的语法稍有不同):SVRMGR>startupnomountCreatecontrolfilesetdatabase新数据库名称//这一行有不同,注意:数据库的名称一般不要超过5个字符。logiflegroup1(日志文件名及路径'','日志文件名及路径')sizexxM,group2(日志文件名及路径'','日志文件名及路径')sizexxM,...resetlogs//这一行也有不同datafile'第一个数据文件名称及路径'sizexxM,//xxM中不能出现小数点儿,如果有小数,就使用K,如果仍然有小数,则使用字节。'第二个数据文件名称及路径'sizexxM,...charactersetzhs16gbk;五、检测数据库文件工具:DBVerify
使用方法:C:/>dbvfile=文件名及路径logfile=输出结果文件名blocksize=数据块大小(缺省是2K,否则指出)start=起始数据块end=终止数据块
可以检测数据、日志及控制文件等。如果不加start和end,则默认检测整个数据文件。
[第三章Oracle在Unix下安装]
一、创建数据库安装用户
*1、Oracle在Unix下运行平台:。SunSolaris(SunSPARC)(Solaris是Oracle目前运行最多的平台)。HP-UX。IBM-AIX。COMPAQTru64-Unix(ALPHA)。SCOUNIX(PC)。Linux(PC)。SGI//前三种平台上运行的最多
*2、用户组名:dba(Oracle7,Oracle8)oinstall(Oracle8i,Oracle9i)
*3、在Unix下,与用户所在组有关的文件:/etc/group如果要加新组就在此文件中新加一行,如:oinstall::20:oracle,oraweb//gid<1024,组号越大,权限越小。
*4、与用户有关的文件:/etc/passwdoracle8i:x:30:20:Oracle8iforUnix:/u01/app/oracle/product/8.1.7:/bin/sh用户名:x:用户号:组号:描述(可省略):文件系统名称:shell
//#admintoolSun的图形管理工具//#samHP-UX//#scoadminSCOUNIX
二、创建Oracle数据库安装目录在Unix下安装数据库,最好使用Oracle建议设置的标准目录:OFA(OptimalFlexibleArchitecture):将Oracle的系统文件与数据库文件分别存储。
OFA要求创建两个目录:$ORACLE_BASE$ORACLE_HOME
假设目录为:/u01/app/oracle/product/8.1.7则:$ORACLE_BASE=/u01/app/oracle//这个目录下的各个子目录存放数据库文件$ORACLE_HOME=/u01/app/oracle/product/8.1.7//这个目录存储系统文件
例如:$ORACLE_BASE/oradata存储数据文件
$df-k//查看文件系统的使用率,如果超过80%,就不要再继续添加文件,否则文件系统将十分慢
#mkdirapp#cdapp#mkdiroracle...#mkdir8.1.7
#chgrp-Roinstalloracle//-R包括子目录,将oracle目录的属组改为oinstall组#chown-Roracleoracle//将oracle(第二个)目录的属主改为oracle用户
#ls-al
三、编辑安装用户的.profile文件,定义操作系统环境变量
NLS_LANG,Oracle用户在安装时默认安装为与操作系统一致的字符集,因此要想在英文版本的操作系统上安装支持中文的Oracle时,务必要设置这个环境变量。
#vi.profile//内容如下:ORACLE_BASE=/u01/app/oracleexportORACLE_BASEORACLE_HOME=$ORACLE_BASE/product/8.1.7exportORACLE_HOMEORACLE_SID=ora8i//数据库实例名exportORACLE_SIDORACLE_TERM=sun//终端类型,SCO为vt100,防止字符混乱exportORACLE_TERMNLS_LANG="simplifiedchinese"_china.zhs16gbk(oracle8.0以后).zhs16cgb231280(oracle8以前,为保持数据兼容,如要导入oracle7的数据,建议选择这一个)exportNLS_LANGLD_LIBRARY_PATH=/usr/lib:$ORACLE_HOME/libexportLD_LIBRARY_PATHORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/dataexportORA_NLS33TMPDIR=/var/tmpexportTMPDIRPATH=/bin:$ORACLE_HOME/BIN:/usr/sbin;/opt/binexportPATH
//.profile文件应该放在$ORACLE_HOME目录下。
四、配置操作系统核心
五、安装过程:在安装光盘下运行:$./runInstall
[第四章创建Oracle数据库、表空间管理、回退段管理]
一、创建数据库1、确定数据库名、实例名、服务名数据库名参数:db_name=prod数据库实例名参数:instance_name=prod域名:db_domain数据库服务名参数:service_names=prod[.域名]//服务名等于:数据库名.域名,为了省事,一般不要域名。
2、创建新数据库的参数文件:init.ora
需要修改的参数:db_nameinstance_nameservice_namescontrol_files:d:/oracle/oradata/prod/...010203background_dump_dest:后台信息跟踪文件的存储位置d:/oracle/oradata/prod/bdumpuser_dump_dest:用户信息跟踪文件的存储位置d:/Oracle/oradata/prod/udumpsql_trace=true
3、设置操作系统参数:主要是设置ORACLE_SID选择数据库实例在Unix下设置实例的方法:$ORACLE_SID=ora8i$exportORACLE_SID
换成另外一个:$ORACLE_SID=prod$exportORACLE_SID
在WindowsNT/2000下,有一个实例写在注册表中,如果要进入第二个数据库,设置方法如下:C:/>setORACLE_SID=ora8iC:/>setORACLE_SID=prod
//为了不致发生混乱,每次在使用数据库之前,进行上述设置。
4、创建数据库实例语法:C:/>oradim-new-sid[实例名]-intpwd[口令]-startmodeauto-pfile[数据库参数文件名称及路径]
。红色部分需要用户确定。startmode:auto,manual。参数文件名称及路径:Unix:/u01/app/oracle/admin/db_name/pfile/initSID.ora/u01/app/oracle/product/8.1.7/dbs/initSID.ora//这是oracle直接读取的参数文件//在Unix中上面的dbs目录是pfile目录的symbollink,即两上文件是同一个文件。Windows:d:/oracle/admin/db_name/pfile/init.orad:/oracle/ora81/database/initSID.ora//这是oracle直接读取的参数文件/*第二个文件指向第一个文件,上面这个文件可以随便放到什么位置,只要在第二个文件中通过IFILE指明了其位置,也可以直接用第一个文件的内容替换第二个文件的内容。*/[*]删除数据库实例方法:D:/>oradim-delete-sid[实例名]最后的命令格式为:D:/>oradim-new-sidprod-intpwdprod-startmodeauto-pfiled:/oracle/ora81/database/initprod.ora
[如果执行了setoracle_sid=prod后,仍然不能通过svrmgrl连接到internal用户,请检查是否在注册表中设置了local串。]
5、创建数据库:SVRMGR>startupnomountSVRMGR>createdatabaseprodlogfilegroup1('d:/oracle/oradata/prod/log1a.log','d:/oracle/oradata/prod/log1b.log')size2m,group2('d:/oracle/oradata/prod/log2a.log','d:/oracle/oradata/prod/log2b.log')size2mdatafile'd:/oracle/oradata/prodsystem01.dbf'size200mautoextendonnext10mmaxsize1000mcharactersetzhs16gbk;
[2002.05.15]//=====================================================================================================================6、加载数据字典:(1)加载常用的数据字典:SVRMGR>@d:/Oracle/ora81/rdbms/admin/catalogSVRMGR>@/u01/app/oracle/product/8.1.7/rdbms/admin/catalog
(2)加载PL/SQL程序包:SVRMGR>@d:/Oracle/ora81/rdbms/admin/catproc
(3)加载Java程序包:SVRMGR>@d:/oracle/ora8i/javavm/install/initjvm
7、网络配置:配置tnsnames.ora文件d:/oracle]ora81/network/admin/tnsnames.ora
[C*]对于新数据库,监听程序不用配置,如果运行中出现没有监听,则运行:D:/>lsnrctlstatus查看相应的数据库是否已启动监听。如果没有启动监听,运行:D:/>lsnrctlstopD:/>lsnrctlstart重启监听程序。
SQL>selectnamefromv$database;//查询当前数据库
[C*]在Unix下:$dbassist
在WindowsNT/2000下(oracle8i):程序组->Databaseadministration->DatabaseConfigrationAssistant
可以删除已创建的数据库(服务、文件)。
通过提示符下命令:oradim-delete-sidprod-srvcoracleserviceprod
SVRMGR>showparameterlicense//查看最大会话数,0表示没有限制
共享服务器连接模式:最大缺省说明65534254最大数据库文件数25432最大日志文件数52最大日志成员数
二、表空间管理
SQL>select*fromdba_free_space;//查询表空间是否存在碎片
1、创建表空间(1)语法:SQL>CreateTablespacetablespacenameDatafile'filespec'AttributesDefaultStorageOnline/offline;
(2)实例:SQL>Createtablespacesales_2002datafile'D:/oracle/oradata/ora8i/sales_2002_01.dbf'size100m,'D:/Oracle/oradata/ora8i/sales_2002_02.dbf'size100mautoextendonnext100mmaxsizeunlimited,//每个文件都可以加上这一行,表空间的扩展属性'D:/oracle/oradata/ora8i/sales_2002_03.dbf'size100mdefaultstorage(initial100knext100kminextents1maxextentsunlimitedpctincrease0);(3)查询表空间与数据文件对应关系:SQL>selecttablespace_name,bytes,blocks,autoextensible,file_namefromdba_data_files;
(4)创建临时表空间:在创建表空间时增加临时表空间关键字:temporary
SQL>Createtablespacetemp_datadatafile'd:/oracle/oradata/ora8i/acc01.dbf'reusedefaultstorage(initial100knext100kminextents1maxextentsunlimitedpctincrease0)TEMPORARY;
说明:A.上例中的reuse指在相应的目录已经存在一个acc01.dbf(大小已经确定,例如一个被删除的表空间,但物理文件未被删除),则按这个文件的大小新建文件,内容将被覆盖。如果文件不存在,需要使用size来确定大小。
B.临时表空间用于排序,在创建用户时可以为用户指定专用的临时表空间。临时表空间不得用于创建永久性实体(例如表)。SQL>createtableaa(c1number(10))tablespacesales_2002;SQL>createtablebb(c1number(10))tablespacetemp_data;
C.查询表空间类型:SQL>selecttablespace_name,contentsfromdba_tablespaces;
2、改变表空间:
(1)为表空间增加数据文件:SQL>Altertablespacesales_2002ADDdatafile'd:/oracle/oradata/ora8i/sales_2002_04.dbf'size10m,'d:/oracle/oradata/ora8i/sales_2002_05.dbf'size10mautoextendonnext50mmaxsize1000m;
(2)将数据文件从一个磁盘移动到另一个磁盘。将表空间脱机offlineSQL>Altertablespacesales_2002offline;。物理移动:将要移动的表空间文件复制或移动到目的磁盘。逻辑移动SQL>altertablespacesales_2002renamedatafile'd:/oracle/oradata/ora8i/sales_2002_04.dbf','d:/oracle/oradata/ora8i/sales_2002_05.dbf'to'c:/sales_2002_04.dbf','c:/sales_2002.05.dbf';。将表空间联机onlineSQL>altertablespacesales_2002online;其中,system表空间数据文件不得移动。
(3)修改表空间的缺省存储参数
SQL>altertablespacesales_2002defaultstorage(initial1mnext1mminextents2maxextents200pctincrease50);3、删除表空间SQL>Droptablespace表空间名;//空的表空间。SQL>Droptablespace表空间名INCLUDINGCONTENTS;//如果表空间中已经建表,必须加Includingcontents参数。
删除表空间后,再物理删除相应的表空间文件,一定要确认是否删除了正确的物理文件,在UNIX下,任何文件对root用户来说都没有保护措施,可以随便删除。
三、Oracle8i启用本地化管理(LocallyManagedTablespaces):表空间类型:数据字典管理表空间,本地化管理表空间
本地化管理表空间自动消除磁盘碎片
SQL>createtablespaceaccountdatafile'd:/oracle/oradata/ora8i/acc01.dbf'10mdefaultstorage(initial40knext40kminextents1maxextents121pctincrease0);SQL>Alterdatabasedatafile'd:/oracle/oradata/ora8i/acc01.dbf'resize50m;
SQL>Altertablespaceaccountcoalesce;//磁盘碎片合并命令。
1、区大小相同SQL>Createtablespaceaccountdatafile'd:/oracle/oradata/ora8i/acc01.dbf'size10m,'d:/oracle/oradata/ora8i/acc02.dbf'size10mextentmanagementlocaluniformsize50k;//extentmanagementlocal:区本地化管理;uniform:每个区大小相同,如果不指定size,size默认是1m
对于实行本地化管理的数据文件仍然可以使用autoextendonnext,maxsize等参数。
查询表空间类型及区管理方式:SQL>selecttablespace_name,extent_management,allocation_typefromdba_tablespaces;
2、区大小由系统自动分配相同(系统缺省方式)SQL>Createtablespacefinancedatafile'd:/oracle/oradata/ora8i/fina01.dbf'size10mextentmanagementlocalautoallocate;//缺省状况是autoallocate,如果只写extentmanagementlocal。
<=等价=>SQL>Createtablespacefinancedatafile'd:/oracle/oradata/ora8i/fina01.dbf'size10mextentmanagementlocal;表大小区大小64K64K1m1m64m8m1000m64m
3、创建本地化管理临时表空间SQL>Createtemporarytablespacetemp1tempfile'd:/oracle/oradata/ora8i/temp1_01.dbf'size10mextentmanagementlocaluniformsize10k;[临时表空间不得使用AutoAllocate选项,就算不写uniform,默认也是uniform]SQL>selecttablespace_name,extent_management,allocation_typefromdba_tablespaces;
[2002.05.16]//=====================================================================================================================四、回退段管理1、创建回退段:rbs
[*]手动创建数据库后,必须先创建回退段表空间:SQL>createtablespacerbsdatafile'd:/oracle/oradata/ora8i/rbs01.dbf'size50m;
[*]创建回退段:SQL>Createrollbacksegmentrs01tablespacerbsstorage(initial40knext40kminextents2//最少是2,不能是1maxextents121optimal120k);//optimal值的大小至少比2个区的大小要大才有意义,在本例中要大于80K。回退段的工作过程:(80K不够用了)扩张->(使用结束)回缩到Optimal值->(120K不够用了)再扩张。
新建回退段的缺省状态是offline.
[*]查询回退段信息:SQL>selectsegment_name,tablespace_name,statusfromdba_rollback_segs;
[*]回退段的设计方法:A.使用createrollbacksegment创建多个回退段,至少四个事务平均一个回退段B.修改参数文件,将创建的回退段写入下列参数:rollback_segments=(rs01,rs02,...)C.重新启动数据库
[*]创建公共回退段:SQL>createpublicrollbacksegmentrs10tablespacerbs;
修改公共回退段,使公共回退段online:SQL>alterrollbacksegmentrs10online;
公共回退段不需要修改参数文件即可online。
查询:SQL>selectsegment_name,tablespace_name,status,ownerfromdba_rollback_segs;
2、修改回退段
SQL>Alterrollbacksegment回退段名online/offline;//对于私有回退段来说,只是临时修改,下次数据库启动时,只有参数文件中的回退段是online
3、删除回退段A.offlineB.SQL>droprollbacksegment段名;C.如果是私有回退段,需要将其从参数文件中去掉。
//无论是公共回退段还是私有回退段,都是系统共用的回退段。即作用相同。
[第五章Oracle数据库用户管理]
//PowerPoint讲义:DBA_用户.PPT
二、创建用户SQL>CreateUserusernameIdentifiedbypasswordDefaultTablespacetablespaceTemporaryTablespacetablespaceProfileprofileQuotainteger/unlimitedontablespace;
例:SQL>Createuseracc01identifiedbyacc01//如果密码是数字,请用双引号括起来defaulttablespaceaccounttemporarytablespacetempprofiledefaultquota50monaccount;SQL>grantconnect,resourcetoacc01;
[*]查询用户缺省表空间、临时表空间SQL>selectusername,default_tablespace,temporary_tablespacefromdba_users;
[*]查询系统资源文件名:SQL>select*fromdba_profiles;资源文件类似表,一旦创建就会保存在数据库中。
/********************************************************************************************SQL>selectusername,profile,default_tablespace,temporary_tablespacefromdba_users;
SQL>createprofilecommonlimitfailed_login_attempts5idle_time5;SQL>Alteruseracc01profilecommon;
**********************************************************************************************/
三、修改用户:SQL>AlterUser用户名Identified口令DefaultTablespacetablespaceTemporaryTablespacetablespaceProfileprofileQuotainteger/unlimitedontablespace;1、修改口令字:SQL>Alteruseracc01identifiedby"12345";
2、修改用户缺省表空间:SQL>Alteruseracc01defaulttablespaceusers;
3、修改用户临时表空间SQL>Alteruseracc01temporarytablespacetemp_data;
4、强制用户修改口令字:SQL>Alteruseracc01passwordexpire;
5、将用户加锁SQL>Alteruseracc01accountlock;//加锁SQL>Alteruseracc01accountunlock;//解锁
四、删除用户SQL>dropuser用户名;//用户没有建任何实体SQL>dropuser用户名CASCADE;//将用户及其所建实体全部删除
*1.当前正连接的用户不得删除。
五、监视用户:1、查询用户会话信息:SQL>selectusername,sid,serial#,machinefromv$session;
2、删除用户会话信息:SQL>Altersystemkillsession'sid,serial#';
3、查询用户SQL语句:SQL>selectuser_name,sql_textfromv$open_cursor;
/***************************************************************************************************************************SQL>ALTERSESSIONSETNLS_LANGUAGE='SIMPLIFIEDCHINESE'NLS_TERRITORY='CHINA'NLS_CURRENCY='RMB'NLS_ISO_CURRENCY='CHINA'NLS_NUMERIC_CHARACTERS='.,'NLS_CALENDAR='GREGORIAN'NLS_DATE_FORMAT='yyyy-mm-dddy'NLS_DATE_LANGUAGE='SIMPLIFIEDCHINESE'NLS_SORT='BINARY'TIME_ZONE='+08:00'NLS_DUAL_CURRENCY='RMB'NLS_TIME_FORMAT='HH.MI.SSXFFAM'NLS_TIMESTAMP_FORMAT='DD-MON-RRHH.MI.SSXFFAM'NLS_TIME_TZ_FORMAT='HH.MI.SSXFFAMTZH:TZM'NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RRHH.MI.SSXFFAMTZH:TZM'***************************************************************************************************************************/
[第六章Oracle权限与角色管理]
一、Oracle权限管理SQL>grantconnect,resource,dbatoacc01;
SQL>revokeconnect,resourcefromacc01;
二、Oracle角色管理(参考讲义)
SQL>CreateRole
SQL>Grant
SQL>Grant
SQL>SetRole
[第七章Oracle数据库备份与恢复]
一、Oracle归档方式
确认数据库归档方式:
SVRMGR>archiveloglist;
SQL>selectlog_modefromv$database;
二、Oracle归档方式配置步骤:
1、启动自动归档进程ARCHlog_archive_start=true2、确定归档日志文件存储目录log_archive_dest=目录名
3、确定归档日志文件存储格式log_archive_format=%t_%s.arc
4、确定归档日志文件镜像目录:log_archive_duplex_dest=镜像目录名
5、以MOUNT方式启动数据库,修改数据库归档方式:SVRMGR>connectinternalSVRMGR>startupmountSVRMGR>alterdatabasearchivelog;SVRMGR>alterdatabaseopen;//前面1、2、3、4四个参数都在参数文件中。
[*]在Oracle8i以后,可以使用多个镜像目录:[8i最多是5个,9i是10个,与duplex方式不能混用]log_archive_dest_1='location=d:/oracle/archive1'log_archive_dest_2='location=d:/oracle/archive2'log_archive_dest_3='location=d:/oracle/archive3'
[*]归档文件的格式为二进制,可以没有后缀。
实际操作:1、在d:/oracle目录下建立archive1,archive2两个目录2、修改init.ora文件,增加下面四行:log_archive_start=truelog_archive_format=%t_%s.arclog_archive_dest=d:/oracle/archive1log_archive_duplex_dest=d:/oracle/archive2
3、进入svrmgrlSVRMGR>connectinternal/oracleSVRMGR>shutdownimmediateSVRMGR>startupmountSVRMGR>alterdatabasearchivelog;SVRMGR>alterdatabaseopen;
4、进入SQL*PlusSQL>altersystemswitchlogfile;
//检查d:/oracle/archive1及archive2目录下是否有归档的日志文件。
[*]在线启动或关闭归档方式SQL>Altersystemarchivelogstart;SQL>Altersystemarchivelogstop;
三、数据库物理备份[*]为了最大限度地进行恢复,应选择最合理的备份方法来防止介质失败导致的数据丢失。(1)非归档的操作系统备份(2)归档的操作系统备份(3)Export工具备份注释:。用归档的操作系统备份的方法来恢复到介质失败后的失败点。。用其它的恢复方法恢复到介质失败后的最后一次备份点。。用Export工具创建一个直接的数据库备份文件,它不能与归档log文件组合使用。
1、完全数据库脱机备份:可以在归档及非归档两种模式下使用。操作步骤:(1)编写一个要备份的最新的文件列表。(2)用SHUTDOWN命令关闭Oracle例程。(3)用操作系统的备份工具,备份所有的数据文件、RedoLog文件、控制文件、参数文件。(4)重启Oracle例程。
2、部分数据库联机备份:备份步骤如下:(1)确认数据库运行在ARCHIVELOG下。(2)对于某一个表空间进行备份:SQL>Altertablespace表空间名beginbackup;
(3)操作系统备份相应数据文件
(4)设置表空间备份结束标识:SQL>Altertablespace表空间名endbackup;
恢复数据文件:SVRMGR>AlterdatabaseRECOVERdatafile'数据库文件名及路径';
<=等价=>
SVRMGR>RECOVERdatafile'数据库文件名及路径';
3、部分数据库脱机备份:备份步骤如下:(1)确认数据库运行在ARCHIVELOG下。(2)将某一个表空间脱机:SQL>Altertablespace表空间名offline;
(4)将表空间联机:SQL>Altertablespace表空间名online;
恢复时也需要进行恢复数据文件:SVRMGR>AlterdatabaseRECOVERdatafile'数据库文件名及路径';
四、完全数据库恢复应用实例[*]完全数据库恢复的语法:在数据库关闭时,数据库恢复语法(可以Mount):
SVRMGR>Alterdatabaserecoverdatafile'filespec';SVRMGR>Alterdatabaserecoverdatabase;SVRMGR>Recoverdatafile'filespec';SVRMGR>recoverdatabase;
第1、3及第2、4条命令分别等价。
在数据库运行时,数据库恢复语法(OPEN):SVRMGR>recovertablespace表空间名;SVRMGR>recoverdatafile'filespec';
1、数据库文件被删除,数据库关闭时,数据库恢复方法:A、复制数据文件的备份文件B、以mount方式启动数据库C、恢复数据文件SVRMGR>alterdatabaserecoverdatafile'数据文件名';D、打开数据库SVRMGR>alterdatabaseopen;
2、数据库在运行时,数据文件被删除的数据库恢复方法:A、将数据文件设置为offline:SVRMGR>alterdatabasedatafile'数据文件名'offline;
B、复制数据文件的备份文件C、恢复数据文件SVRMGR>alterdatabaserecoverdatafile'数据文件名';
D、将数据文件设置为online:SVRMGR>alterdatabasedatafile'数据文件名'online;
3、数据文件被删除,该数据文件没有备份,数据库恢复方法:A、以mount方式启动数据库B、运行以下命令:SVRMGR>Alterdatabasecreatedatafile'被删除数据文件名及路径'as'被删除数据文件名及路径';
C、恢复数据文件SVRMGR>alterdatabaserecoverdatafile'数据文件名';
D、打开数据库SVRMGR>alterdatabaseopen;
五、不完全数据库恢复实例:
1、恢复一个被Dropped的基表:A、关闭数据库B、拷贝全部的数据文件(不拷贝日志及控制文件)注:这些拷贝的数据文件是以前做的数据文件的备份,现在拷贝回数据库数据文件所在目录,覆盖掉原来的。当然,最好在覆盖之前将现在的数据文件及归档日志做好备份。
B、关闭数据库,复制未删除表空间前的全部数据文件及控制文件,不复制日志文件。
D、打开数据库SVRMGR>AlterdatabaseopenRESETLOGS;
六、数据库逻辑备份:(Export/Import)
1、expuser01/user01file=user01//用户方式:将user01用户的所有数据导出到user01.dmp文件中2、expuser01/user01file=user01_tabletables=(emp,dept,pay,...)//表方式,将指定用户的指定表导出。3、exp//交互方式4、卸出(导出)大表:expuser/passwordfile=filenamedirect=y...//加上direct=y,表明用直接路径卸出数据,不通过内存,直接卸出到磁盘,效率高,节省内存。
4、全部数据库卸出:expsystem/managerfile=fulldbfull=ydirect=y
//加上full=y,表示将整个数据库全部卸出。
七、卸出表空间:1、检验表空间自包含性:检查表空间是不是与其它表空间有外键约束,有外键约束的不能卸出。SQL>execute...
2、将表空间设为只读
3、使用export卸出表空间exptransport_tablespace=ytablespaces=misfile=expdat.dmp
4、使用Import装入表空间imptransport_tablespace=ydatafile='d:/oracle/oradata/x.dbf'tablespaces=misfile=expdat.dmp
八、Windows计划任务备份数据文件1、C:/>netstartschedule//启动计划服务netstopschedule//停止计划服务2、AT命令安排计划:C:/>at22:00/every:m,t,w,th,f,s,sud:/fullback.bat//每周一到周日的晚上十点运行d:/fullback.bat批处理文件
C:/>at/delete/yes//删除全部计划
3、fullback.batsvrmgrl@d:/fullback.sql
4、fullback.sqlconnectinternal/oracleshutdownimmediatehostcopyd:/oracle/oradata/ora8i/*.*e:/backstartup
还可以为数据库在线备份建立脚本通过AT调用执行,实现数据库的联机备份。
[第八章Oracle数据库的优化与调整]
一、下面三个参数属于SGA区的设置,主要看服务器内存是不是需要扩充。
1、数据缓冲区计算:(DB_BLOCK_BUFFERS)
SQL>select1-(phy.value/(blk.value+con.value))"HitRatio"fromv$sysstatphy,v$sysstatblk,v$sysstatconwherephy.name='physicalreads'andblk.name='dbblockgets'andcon.name='consistentgets'HitRatio最好是大于90%,需要在数据库在最繁忙的时候的命中率,否则需要增加内存。
2、日志缓冲区计算(log_buffer)v$latch
sum(misses)越接近于零越好。
3、共享池大小计算(shared_pool_size)(1)v$librarycach:PINS(命中),Reloads(失败)
Reloads/(pins+reloads)*100->失败率->应小于1%,否则需要扩内存。
(2)v$rowcache:GETS(取到),GETMISSES(失败)
二、排序区参数计算(SORT_AREA_SIZE):v$sysstat
sorts(disk)/sorts(memory)+sorts(disk)失败率<10%
三、磁盘存储参数测算:计算以下存储参数:initialnextminextentsmaxextentspctincrease
如果使用本地化管理,不需要计算以上参数。
四、数据库参数自动统计计算1、修改参数文件:timed_statistics=true,重启数据库
2、在数据库最繁忙的时段运行下面两个SQL程序(在Oracle目录中搜索这两个文件)
SVRMGR>@d:/oracle/ora81/rdbms/admin/utlbstat.sqlSVRMGR>@d:/oracle/ora81/rdbms/admin/utlestat.sql
3、查询d:/report.txt来看统计结果。
五、回退段优化设计1、对于大事务,设计大回退段,提高数据操作速度。
步骤如下:A、创建一个专用的回退段表空间。例如:rb100B、在回退段表空间rbs100上创建大的回退段。SQL>createrollbacksegmentrbs100tablespacerbs100storage(initial50m);C、使回退段表空间onlineSQL>Alterrollbacksegmentrbs100online;
D、指定用户使用专用的回退段表空间:SQL>settransactionuserollbacksegmentrbs100;//必须在事务开始前指定
E、事务结束后,删除回退段及表空间。
教师操作实例:System用户操作:SQL>createtablespacerbs1datafile'd:/oracle/oradata/ora8i/rbs1_01.dbf'size10m
SQL>createrollbacksegmentrbs100tablespacerbs1;
SQL>alterrollbacksegmentrbs100online;
SCOTT用户操作:CREATEtablebb(s1char(20));
insertintobbvalues('abcdefghi');
commit;//必须在事务开始之前设置回退段
settransactionuserollbacksegmentrbs100;
system用户操作:
alterrollbacksegmentrbs100offline;
droprollbacksegmentrbs100
droptablespacerbs1;
2、回退段I/O调整,具体步骤:A、创建多个回退段表空间,对就不同物理磁盘,以平衡磁盘I/OB、在多个表空间上分别创建回退段。例如:rbs1:rbs01,rbs02,rbs03,rbs04,rbs05rbs2:rbs06,rbs07,rbs08,rbs09,rbs10
C、修改参数文件,使回退段交叉排放。例如:rollback_segments=(rbs01,rbs06,rbs02,rbs07,rbs03,rbs08,...)
[OracleDeveloper/2000系统开发工具]
简介:Form:开发基于Form应用系统,是Developer/2000的主要开发工具。Report:报表开发工具,开发设计各种报表。Graphics:图形设计工具,开发基于数据库的图形界面
Form包括以下三个工具:。FormBuilder设计与开发组件。Formcompiler编译组件。FormRuntime运行组件
[FormBuilder设计]
一、创建一个简单的Form应用
表在FormBuilder中称为数据块。
在新建的Form中的表格字段中可以输入查询条件,按F8按条件查询。
另外,可以在字段中输入变量,例如:在emp表中的sal(工资)字段输入变量:x,在执行查询时,输入:x>2000and:x<3000,则表示查询工资在2000及3000之间的人员。如果要查询1981年的人员,则在date字段输入:x,条件为:To_Char(:x,'yyyy)='1981'
查询最大工资::x=(selectmax(sal)fromemp)
二、创建主从型Form应用:1、使用主表创建主块2、使用子表创建子块3、建立主表与子表之间的关联
三、布局设计(Layout)
四、域属性表(Properties):双击某字段即可调出属性表
格式掩码
五、创建文本项(TextItem):
文本项:用于显示数据库的统计结果
名称数据类型格式掩码计算模式汇总函数:总和数据块:emp数据项:fullsal
公式:水平计算汇总:垂直计算
工资及奖金合计::sal+nvl(:comm,0)
数据->用项同步化
记录->显示的项数:0->1
六、创建值列表Lov(ListofValue):
七、创建按钮(PushButton):
1、创建文本类型按钮:数据查询,条件查询,工资总和,报表打印、退出系统2、创建图标类型按钮:(1)常用缺省图标:save:数据提交rt_rdel:数据删除rt_radd:数据插入rt_rec4:>>rt_rec3:>rt_rec2: (2)更改按钮属性图标化:是图标文件名: (3)增加按钮提示保存删除插入数据第一条记录下一条记录上一条记录最后一条记录 八、创建显示项(DisplayItem):显示项:只读数据项,用于显示数据库的统计结果。 九、创建单选按钮(RadioButton): (1)增加了单选按钮后,先到“对象导航器”中修改“RadioGroup”的属性 名称:鼠标导航:否数据类型:数值初始值:10 财务部(10)、销售部(20)、开发部(30)、网络中心(40) 示//数据->需要:如果选择“是”,则表明数据为非空,不允许为空,如果不在表中输入查询条件,则不允许移动光标焦点,应选“否”。 十、复选框(CheckBox) 增加一个复选框,修改其属性:名称:标签文本:复选时的值:y未复选时的值:n鼠标导航:否显示的项数:1数据库项:否 [Trigger触发器设计]一、按钮触发器设计:触发器类型:WEHN-BUTTON-PRESSED触发器代码:使用PL/SQL及函数编写程序代码。 Execute_Query;//执行查询的函数,这是写在相应按钮上的PL/SQL执行语句的脚本 编译,关闭,执行。 Enter_Query;//条件查询函数 Exit_Form;//退出系统函数 常用的对于数据库操作的函数:Create_Record;//数据插入Delete_Record;//数据删除Commit_Form;//数据提交Execute_Query;//无条件数据查询Enter_Query;//条件查询Next_Record;//下一条记录Previous_Record;//上一条记录First_Record;//第一条记录Last_Record;//最后一条记录Scroll_Up;//上滚一屏Scroll_Down;//下滚一屏Exit_Form;//退出系统 这些函数名不区分大小写。 如果在执行查询时提示Oracle错误,不能查询,有可能就是因为Form中一个与数据库字段无关的对象的“数据库项”设置成了“是”,将其改成“否”即可。 工资总和按钮的WHEN-BUTTON-Pressed的pl/sql脚本:selectsum(sal)into:Display_sumsalfromemp; 二、创建Form级触发器完成数据库的自动查询与统计:A.在Form启动时,进行自动查询 触发器名称:WHEN-NEW-FROM-INSTANCE对象导航器->表格->Form1->触发器->新增 脚本内容:Execute_Query; B.在Form启动时,进行自动统计计算 触发器名称:POST-QUERY对象导航器->表格->Form1->触发器->新增selectsum(sal)into:Display_sumsalfromemp; [C*]在编辑触发器脚本中汉字不能正确显示的解决办法:先退出FormBuilder。然后:regedit->HKLM->Software->Oracle->新建字串de20_plain_edit,键值为1。再重新进入FormBuilder即可解决所有的汉字显示问题。 D.Form启动时,MDI窗口最大化及标题设置,同样在FORM的POST-QUERY触发器中设置:SET_Window_Property(FORMS_MDI_WINDOW,WINDOW_STATE,maximize);Set_Window_property(FORMS_MDI_WINDOW,TITLE,'公司员工工资情况一览表'); 设置MDI子窗口Window1:SET_Window_Property('window1',WINDOW_STATE,maximize);Set_Window_property('window1',TITLE,'员工管理信息系统Version200205Build1'); [*]进入Form1模块的属性设置->菜单模块->default&smartbar,default表示菜单,smartbar表示工具栏,去掉就表示没有这些东西。 [*]Window1属性->模式->是。意味着这是mdi窗口中的最后一个窗口。还可以取消最大最小化等按钮,实现mdi子窗口看上去与主窗口好象一个窗口。 三、单选按钮触发器:触发器类型:WHEN-RADIO-CHANGED脚本:Declarestringvarchar2(50);v_dnamedept.dname%type;Beginselectsum(sal),count(*)into:Display_item2,:Display_item3fromempwheredeptno=:select_deptno;selectdnameintov_dnamefromdeptwheredeptno=:select_deptno;string:=v_dname||'部门统计结果';Message(string); ExceptionwhenNO_DATA_FOUNDTHENMessage('数据库中没有编码为'||:select_deptno||'的部门。');End; --selectTo_Char(sysdate,'yyyy"年"mm"月"dd"日"hh24"时"mi"分"ss"秒")into:DisplayTimefromdual;End;Endif;End; 五、复选按钮触发器:触发器类型:WHEN-CHECKBOX-CHANGED脚本:Beginif:ifprint='y'thenSet_Item_Property('print_report',ENABLED,PROPERTY_TRUE);--//使打印按钮生效ELSESet_Item_Property('print_report',ENABLED,PROPERTY_FALSE);--//使打印按钮无效endif;end; 六、菜单设计在c:/orawin95目录下查找menudef.mmb,然后打开该文件,双击MENUDEF编辑原来的菜单(删除不要的,添加需要的),然后另存为自己的菜单menu1.mmb,然后编译(文件->管理->编译文件CTRL+T)。。然后在Form1的属性设置中,将菜单模块直接设置成菜单文件的名称及路径,例如:e:/xyf/menu1 七、基于数据库的图象字段存储:1、在数据库中创建一个含有图象字段的基表。SQL>Createtableemployeeasselect*fromemp;SQL>altertableemployeeadd(photolongraw);--//加上longraw字段后,该表就不能再用select*去查询 2、对图象文件进行唯一性编码 SQL>Spoole:/empnoSQL>selectempnofromemp;SQL>Spooloff; 生成e:/empno.lst文件,存储了所有雇员的empno列表作为图象文件的唯一性编码如:7788.jpg... 3、创建Form,编写触发器调用图象文件:photo.fmbphoto属性->大小风格->调整 empno字段的触发器:WHEN-NEW-ITEM-INSTANCEDeclarephoto_namevarchar2(50);Beginphoto_name:='e:/xyf/'||To_Char(:empno)||'.jpg';Read_Image_File(photo_name,'jpg','photo');End; 4、图象数据提交数据库。 5、删除本机图象,删除触发器。 八、标签画布(Page):不使用数据块向导,直接在“表格”处新增一个Form,然后进入布局编辑器,选择左边工具栏中的“标签画布”新建一个标签画布。然后回到对象导航器,删除原来的画布。 在布局编辑器中,在标签位置按鼠标右键->属性选项板,可以进入标签画布的根的属性设置中,而在某个标签的中间部位按鼠标右键->属性选项板,则可以进入这个标签页的属性设置。 对象(导航器)->数据块->关系->新建:dept.deptno=employee.deptno 各个标签页的显示顺序,由在各个页上的数据块在对象导航器中的排列先后顺序确定,可以通过鼠标拖动来直接调整其排列顺序。 [OracleApplicationServer应用服务器]试验环境:OracleServer:IP:75.64.23.30SID:orcl OracleApplicationServer:IP:75.64.23.40HostName:ntsvr1 用户:user01/user01,...user40/user40 一、WWW原理简介 URL:UniformResourceLocatorHTTP:HyperTextTransfrerProtocolHTML:HyperTextMarkupLanguage 二、OracleApplicationServer概述 三、OracleApplicationServer服务器启动在操作系统下命令启动:$owsctlstart//启动OAS服务器$owsctlstart-nodemgr//启动OAS管理节点 管理节点:IP:75.64.23.40:8888//管理节点的端口号为8888管理员用户:Admin OAS实用程序->安装->PL/SQL工具包->数据库连接串->sys用户口令->应用。 如果OAS与Oracle服务器在一台机器上,则使用Oracle_SID,否则要使用连接串。 2、创建HTTP监听进程在创建HTTP监听进程时,需要确定的信息:监听进程的名称端口号:(1-16653之间)主机名称: 3、创建DAD(DataAccessDescription)数据存取描述器,建立OAS与数据库之间的连接OracleApplicationServer=>DB存取描述 需要确定的信息:。名称:。合法的数据库用户名及口令。数据库位置:。网络连接串名 4、创建应用: 选择应用程序所使用的语言:PL/SQL应用程序名:mis01 应用的状态标志一般为红旗,没有关系。 5、创建插件。确定信息如下:。插件名称:mis01。显示名称:人员工资信息。虚拟路径:/cgi/plsql//这里怎么设置,用户在输入时就要怎样输入URL。物理路径:%ORAWEB_HOME%/bin。所连接的数据库信息:通过DAD确定(下拉菜单选择) [***]所有配置结束后,重新加载OAS。 六、使用PL/SQL开始Web页面 1、标记函数:htp.htmlOpenhtp.htmlClosehtp.headOpen
2、PL/SQL过程、函数、包:owa_cookieowa_imageowa_utilowa_opt_lockowa_patternowa_secowa_text
3、HTML:
欢迎使用OracleApplicationServer!
对应的PL/SQL程序:CreateorReplaceProcedureP_ShowExampleASBEGINhtp.htmlopen;htp.headopen;htp.title('OracleApplicationServer4.0!');htp.headclose;htp.bodyopen;htp.strong('欢迎使用OracleApplicationServer!');htp.bodyclose;htp.htmlclose;END;
在SQL*Plus中运行上面的程序创建相应的存储过程。
6、webalchy.exe://可以将标准的html文件转换成PL/SQL程序。
[C*]owa_util.TablePrint函数用法owa_util.tablePrint(c1,c2,c3,c4,c5,c6,c7,c8)
其中:c1:表名。例如:'emp'c2:是否有表格线。'BORDER'C3:表格的格式。owa_util.html_tablec4:基表中的列名。缺省为'*',即所有列c5:where语句:例如:'wheredeptno='||v_deptno||'orsal>'||v_sal||'orderbysal',c6:列名的别名c7:最少显示多少行,0(全部显示)c8:最大显示多少行,缺省为NULL。
8、输入员工编码,显示员工信息:P_empno.sql
9、多个选择项:列表项及文本框输入:P_Mselect.sql
10、使用无线组(RadioGroup)显示部门信息:P_rselect.sql
11、向数据库中录入员工信息:P_input.sql
[ReportBuilder报表设计]一、创建一个简单的报表:ReportBuilder->工具->报表编辑器->新建查询
然后布局向导创建布局。
预览界面->点左上角图标->数据模型->再点左上角图标->预览界面
二、创建分组报表在数据模型界面拖动要分组的列到列外即可创建分组。
1、增加公式列(水平方向计算):数据模型->左边工具栏中公式计算图标。return:sal+nvl(:comm,0);
2、增加汇总列(垂直方向计算):
每次有新列(域)增加后,都要在数据模型主窗口->鼠标右键->报表向导中进行适当的修改。
三、布局设计(Layout)1、报表向导->标签:修改标签为中文
2、视图->布局模型编辑->选择全部左边工具栏->添充颜色,格式->字体
页边距:相当于页眉,顶部工具栏中按钮。
在增加文本框时,如果默认字体不是中文,请先在格式->字体中设置为中文字体,然后再输入。
双击域可以设置字段属性。
四、创建主从型报表:使用主从型藏青创建主从型报表
1、在对象导航器->报表->新建->手动,进入数据模型窗口。
2、SQL:(1)select*fromdept(2)select*fromemp
(3)点击左边纵向工具栏中“数据链接”:从dept.deptno拖动到emp.deptno1放开,建立数据链接。
(4)报表向导。风格:上边分组。。组:两个组均是纵向。域:除了重复的deptno1之外都要。模板:无模板。
3、在布局模型中调整表格结构
五、创建矩阵报表:1、构造矩阵报表至少需要四个组:一个横向显示数据的组一个纵向显示数据的组一个在交叉点显示数据的组一个矩阵单元组
2、操作步骤:
(1)手动创建一个报表。
(2)SQL1:selectdeptno,job,sum(sal)fromempgroupbydeptno,job;
(3)将deptno和job拖出成为两个分组的条件。
(4)点击左方工具栏交叉单元按钮,将G_2.DEPTNO与G_3.job括起来,这样成为一个G_4交叉组。
(5)报表向导风格:矩阵单元:sum_sal总计:总和(sum_sal)模板:无
(6)布局模型重新布局。
六、分组矩阵报表:
(1)手动创建一个报表。
(2)SQL1:selectTo_Char(hiredate,'yyyy')year,deptno,job,sum(sal)fromempgroupbyTo_Char(hiredate,'yyyy'),deptno,job;
Q_emp,G1
(3)将Year,deptno和job拖出成为三个分组的条件。G_year,G_deptno,G_sulsal,G_job,G_cross
(4)点击左方工具栏交叉单元按钮,将G_3.DEPTNO与G_4.job括起来,这样成为一个G_5交叉组。
(5)报表向导风格:分组矩阵
[GraphicsBuilder图表设计]一、创建饼图(Pie):1、打开GraphicsBuilder,连接数据库。菜单:图表->创建图表
2、输入SQL语句确定数据源:selectdeptno,sum(sal)fromempgroupbydeptno;->执行->确定
3、图表:饼图,名称:Pie
4、菜单:图表->框架->饼框架->显示数据值,显示百分比值
可以修改所显示数据值的字体、颜色等。可以修改饼图的框架、侧面及阴影的填充颜色等。
二、创建列图(Column):
1.SQL:selectename,salfromemp
2.名称:column
图表框架:深度尺寸,阴影尺寸,阴影方向。显示绘图框架(选中),显示图例(去掉)。
侧面、顶部、阴影的填充颜色,不要修改正面的填充颜色。
双击两个坐标轴可以设置坐标轴属性,去掉“显示坐标轴标签”
3.画一个矩形将图表括起来,填充颜色然后置后,给图表加上标题。
三、创建主从型图表(Drill-Down):1、创建主图:pieselectdeptno,sum(sal)fromempgroupbydeptno
2、创建参数导航器->参数->新增名称:n类型:数字初始值:103、使用参数创建子图新建图表->新建查询->selectename,salfromempwheredeptno=:n;//将参数n放入第二个查询中。子图名:column
4、建立两个图表之间的关系选饼图中心双击->对象属性->细化:设置参数:N对于值:DEPTNO执行查询:query1(新建的子查询)
5、运行
四、图表切割:选饼图中心双击->对象属性
过程->编辑
rrownumber;
chartog_object;
BEGINchart:=Og_Get_Object('pie');//将名为pie的图表放到chart变量中。rrow:=Og_Get_Row(HITOBJ);Og_Set_Explosion(chart,rrow,'deptno',50);//切割的距离为50个小数点Og_update_Chart(Chart,OG_ALL_CHUPDA);End;
[Developer/2000集成]一、Form调用Report:1、创建一个含有参数的报表:r112、在Form中调用Report:(Form以前面建立的Form1(Form3)为例)。
报表打印按钮的WHEN-BUTTON-PRESSED脚本:Declarepl_idparamlist;Beginpl_id:=Create_Parameter_List('tmpdata');Add_Parameter(pl_id,'dno',TEXT_PARAMETER,To_Char(:deptno));Add_Parameter(pl_id,'paramform',TEXT_PARAMETER,'no');Run_Product(REPORTS,'e:/xyf/r11.rdf',ASYNCHRONOUS,RUNTIME,FILESYSTEM,pl_id,null);Destroy_Parameter_List(pl_id);End;
二、Form调用Graphics:1、创建一个含有参数的图表selectename,salfromempwheredeptno=:dpt;
2、在Form中创建图表项3、编写触发器调用图表
访问表空间权限控制:去掉用户对某个表空间的访问权限ALTERUSERZYIBSSQUOTA0ONIBMS_DATA_DATA;ALTERUSERZYIBSSQUOTA0ONIBMS_DATA_IDX;
增加用户对某个表空间的访问权限ALTERUSERZYIBSSQUOTAUNLIMITEDONIBMS_DF_DATA;
移动表空间:altertabletcm-usermovetablespaceibms-data-data
append是优化提示器,这个最好不用,你可以用并行提供来做insert/*+parallel(emp,2)*/intoempnologging2是代表什么啊?2是用2个CPU来并发做事这个有什么好处,可以加快速度?还是
select*from(selectrownumasaa,a.*fromtcm_userawhererownum<100)whereaa>10
(to_date('2003-8-118:20','yyyy-mm-ddHH24:MI')-to_date('2003-7-318:35','yyyy-mm-ddHH24:MI'))*24*60
(dateA-dateB)*1440=N分(dateA-dateB)*86400=N秒
round()四舍五入ceil()大于n的最小整数
如果不小心把表给delete掉了并且commit了,不要紧,你可以用如下语句进行恢复select*fromtfm_action_listasoftimestamp(systimestamp-interval'4000'second)
zhuanzi:blog.csdn.net/jxnucsb2008/article/details/557827