阳光男孩

Never give up!

Entries Tagged ‘Oracle’

Oracle 11g数据库使用XML Table的BUG解决

1顶一下 Oracle 11g开发项目时,使用XML Table出现了BUG,现总结如下:问题其实很简单,就是我们在项目中使用了很多超级长的SQL语句,之后导致SQL执行效率低下,并且貌似导致了Oracle的SQL编译空间溢出了。   出问题的SQL: 以下是代码片段: SELECT N1,N2 FROM A1 WHERE (N1=’1′ AND N2=’a1′) OR (N1=’2′ AND N2=’a2′) OR (N1=R...[阅读全文]

1
顶一下

 Oracle 11g开发项目时,使用XML Table出现了BUG,现总结如下:问题其实很简单,就是我们在项目中使用了很多超级长的SQL语句,之后导致SQL执行效率低下,并且貌似导致了Oracle的SQL编译空间溢出了。
  出问题的SQL:

以下是代码片段:

SELECT N1,N2
FROM A1
WHERE
(N1=’1′ AND N2=’a1′) OR
(N1=’2′ AND N2=’a2′) OR
(N1=’3′ AND N2=’a3′) OR
(N1=’4′ AND N2=’a4′) OR
….

  BUG解析
  当然了真实的SQL文是不可能这么简单的,比这个要复杂的多。不过出问题的部分基本就是这样了,其实原来没用AND/OR这种结构,用的是IN,但IN语句的参数不能超过2000个。所以就改成这个结构了,这个结构传东西到是没有限制了,但是会导致SQL文变长,而且由于数据的长度不定。这些1和a1是前面产生的结果,所以不一定有多少组。所以都是直接拼在SQL里了。问题很明显,后果很严重。
  BUG解决
  因为系统已经开发很长时间了,不能进行太大的改动。老系统就这样,改的越多,错的越多,狂改代码基本属于自虐行为。所以我们引入了XMLTable来解决这个问题,这还是一个DBA给的建议呢。

以下是代码片段:

SELECT N1,N2
FROM A1
WHERE (N1,N2) IN (
SELECT X1,X2 FROM
XMLTable(‘for $i in /T/REC return $i’ PASSING XMLType(#str:CLOB#)
COLUMNS X1 INTEGER PATH ‘X1′,
X2 CHAR(2) PATH ‘X2′)

  因为使用iBatis的缘故,所以我使用了一个叫str的参数,并且声明为CLOB类型的,但str里放什么呢?

以下是代码片段:

<T>
<REC><X1>1</X1><X2>a1</X2></REC>
<REC><X1>2</X1><X2>a2</X2></REC>
….
</T>

  这个很明白了吧,就是把需要的数据通过XML的形式变成一个表,之后再和主表进行子查询进行关联。这样做的好处就是把SQL文的长度变换为参数的长度了,虽然参数变长了,但SQL文本身变短了。

Leave a Comment

Oracle融合中间件11g为企业云环境提供动力

1顶一下传统的数据中心大多围绕单个应用或者多个应用孤岛而建立,专有技术和应用的维护占用了企业大量的创新资源,只有很少资源可以用来创造业务价值。云计算的产生改变了这种现状,它为企业提供了更多机会来创造更大的业务价值。云计算所拥有的良好虚拟化特征,可以根据企业业务所需进行伸缩性灵活部署,同时云计算的设计模式可以快速的进行不断优化和创新,从而大幅降低IT复杂性,帮助企业有效...[阅读全文]

1
顶一下

传统的数据中心大多围绕单个应用或者多个应用孤岛而建立,专有技术和应用的维护占用了企业大量的创新资源,只有很少资源可以用来创造业务价值。云计算的产生改变了这种现状,它为企业提供了更多机会来创造更大的业务价值。云计算所拥有的良好虚拟化特征,可以根据企业业务所需进行伸缩性灵活部署,同时云计算的设计模式可以快速的进行不断优化和创新,从而大幅降低IT复杂性,帮助企业有效改善IT成本结构,并满足日益增强的环保需求。

鉴于此,云计算在近年来受到国内外企业的广泛关注。据领先分析机构Forrester在2011年4月发布的报告显示,未来10年内,全球企业在云计算的投资将不断扩大,预计2020年的投入力度将在2011年的基础上增长6倍,超过2400亿美元。然而,企业若要真正实现云计算,其关键在于企业IT部门是否能够转变现有的IT架构和解决方案交付模式,以适应现阶段的IT需求。

甲骨文公司亚太及日本区融合中间件产品管理总监李国东表示:“为了最大化利用云计算所带来的发展契机,实现云计算的真正落地,企业需要通过四种方式完成IT模式的转变:组织和分配IT资源、构建应用和管理关键业务流程、协作和开发界面、保护和管理基础架构。全面、集成、开放的Oracle 融合中间件技术及产品可有效帮助企业适应云计算的发展、加快完成向云计算的模式转变,降低企业IT投入,从而提高云计算投资回报。

IT模式转变成为企业实现云计算的关键

•    组织和分配IT资源

信息孤岛是企业信息化过程中面临的最大难题。孤岛的存在限制了企业内部资源的共享,严重影响了各资源体系间的互联互通。通过重新组织、分配并有效整合其IT资源,企业能够打破原有的信息孤岛和信息系统过载的现状,实现资源共享和优化。

•    构建应用和管理关键业务流程

由于信息孤岛的存在,企业在解决应用问题和管理业务流程过程中极易产生资源浪费和交付延迟现象。面向服务式的应用架构,托管式和自助式的共享服务平台能够帮助企业轻松实现应用程序开发和关键业务流程管理,减少其IT投入成本和管理工作量。

•    协作和开发界面

传统的业务应用开发,往往处于一种业务线需求与IT开发者之间互相脱节的状态,极易导致应用功能不全面和不符合实际业务需求的现象。通过转变和强化协作和开发界面,如充分利用一些具有很强协作性的社交网络平台,企业可保持终端用户、业务线应用和IT开发部门之间的有效沟通,缩短应用和业务的上线时间,提升业务的市场粘合度和灵敏度。

•    保护和管理基础架构

随着IT应用的不断发展,尤其是云计算的发展,用户大量的远程地动态地访问和利用核心数据资源,对IT系统带来了非常大的安全威胁,综合全面的数据中心基础设施安全显得尤为重要,其中必不可少的是面向服务的安全服务层,这促使着企业数据中心基础设施要不断向高安全性和管理性转变。

针对企业实现云计算的一系列IT模式转变需求,甲骨文公司凭借最全面的解决方案和集成设计的系统为企业提供了云计算平台和管理体系,并贯彻既支持公有云又支持私有云的云计算战略目标,为客户提供全面、可供自由选择的云产品。其中,Oracle融合中间件11g套件是企业云计算部署的理想基础构件,为企业的私有云搭建和部署提供了强而有力的支持。

通过 Oracle 融合中间件迁移到云

Oracle融合中间件11g是业界领先的应用架构基础,并针对云计算进行了大量开发,可以帮助企业创建和运行灵活、智能的业务管理软件,同时通过优化集成的软硬件架构最大程度的提升其IT效率。Oracle 融合中间件11g拥有众多领先的组件,如Oracle Weblogic服务器、应用网格、Oracle Exalogic中间件云服务器、Oracle企业管理器、SOA、BPM、Oracle WebCenter,以及商务智能、身份管理、数据集成等。

作为目前世界上最强大的应用服务器, Oracle WebLogic服务器连同业界领先的数据存储网格产品Oracle Coherence,可帮助企业构建高性能、高可扩展、高灵活性的数据中心,并为应对云计算的大量事务处理奠定坚实的基础。Oracle WebLogic服务器与Oracle Coherence组合提供了无限制的可扩展性、无与伦比的性能以及绝对有保障的可靠性,在此基础上与其他Oracle产品一起部署,可帮助企业实现最高可扩展性、可伸缩和灵活性的云计算平台。

除了这种构建数据中心的方式外,在Oracle融合中间件Oracle Tuxedo、Oracle数据集成(Data Integration) 和Oracle GoldenGate的帮助下,那些投入大量资源利用大型机进行应用软件管理的企业,可以轻松将数据和数据逻辑迁移到开放平台及云环境并获得实时同步,实现虚拟化的数据中心。

有了坚实的数据基础,如何能在最合理的资源配置下开发出最佳应用,同时使所有应用充分利用数据,也是企业构建云计算的一个重要考量。甲骨文公司推出的Oracle Exalogic中间件云服务器,它包括最新高性能的硬件、行业领先的Oracle WebLogic 服务器和Exalogic软件,所有这些产品由甲骨文专门设计,旨在以最小成本获得最高的性能。由于是为大规模、关键任务部署而设计,Oracle Exalogic中间件云服务器能为企业级多种云应用提供基础。它可以对具有不同安全性、可靠性和性能要求的数千种应用程序提供支持 — 这使它成为企业级数据中心整合的理想平台。Oracle Exalogic中间件云服务器既可以运行企业Java、Oracle 融合中间件和Oracle 融合管理软件的优化产品,同时也可以支持部署了众多第三方和定制Linux 及Solaris 应用的优秀环境。

在Oracle融合中间件11g组件中,Oracle企业管理器是重要的管理类产品。它可以满足IT人员的所有管理需求,如自助服务、资源管理和资源测算等,以确保企业以最高的服务水平和最低运营成本来实现云计算。除此之外,Oracle企业管理器还能模拟云环境,管理用户体验和应用程序的性能,并提供全面的测试。通过Oracle企业管理器的集成化管理,企业可以快速获得对云计算的投资回报,并将投资回报率最大化。

安全性和协作性是云计算实施过程中非常重要的因素。今天的企业用户随着IT的发展提出了越来越细致的要求,例如网络应用能够具备类似社交网络和协作工作平日所能提供的用户体验等。Oracle WebCenter作为全面、标准化的用户交流平台满足了这一点,为企业用户提供了安全、灵活的用户体验。

此外,Oracle 融合中间件11g的其他组件也以优异的性能满足了企业各方面的需求,Oracle 身份和访问管理(IDM)在大量用户访问或网络威胁时提供了一个面向服务的安全服务层;Oracle SOA套件和Oracle SOA治理可帮助企业实现共享服务层;Oracle业务流程管理(BPM)套件能够帮助业务分析人员组合现有应用程序,从而帮助企业快速获得丰厚的投资回报,推动实现卓越的客户服务和运营。

总而言之,Oracle融合中间件11g为企业提供了从数据基础、运行、开发、管理到安全环境的多样化云计算产品,是其搭建云计算的理想基础构件。随着企业不断应用Oracle融合中间件产品,“甲骨文全面、开放、集成以及同类最佳”的产品战略优势将更加凸显,企业也将因构建高性能、高可扩展性、高灵活性的云计算而获得显著的IT投资回报,从而进一步推动企业业务创新,提升企业业务价值。

Comments (5)

ORACLE OLAP函数语法详细介绍

0顶一下  Oracle数据库的OLAP函数用途很广泛,本文主要从以下几个方面来对OLAP函数语法进行总结,以方便我们的理解。   OLAP函数语法四个部分:   1、function本身用于对窗口中的数据进行操作;   2、partitioning clause 用于将结果集分区;   3、order by clause 用于对分区中的数据进行排序;   4、windowing clause 用于定义function在其上操作的行的集合,即function所影响的范围。...[阅读全文]

0
顶一下

  Oracle数据库的OLAP函数用途很广泛,本文主要从以下几个方面来对OLAP函数语法进行总结,以方便我们的理解。
  OLAP函数语法四个部分:
  1、function本身用于对窗口中的数据进行操作;
  2、partitioning clause 用于将结果集分区;
  3、order by clause 用于对分区中的数据进行排序;
  4、windowing clause 用于定义function在其上操作的行的集合,即function所影响的范围。
  一、order by对窗口的影响
  不含order by的:

以下是代码片段:
SQL> select deptno,sal,sum(sal) over()
from emp;

  不含order by时,默认的窗口是从结果集的第一行直到末尾。
  含order by的:

以下是代码片段:
SQL> select deptno,sal,
sum(sal) over(order by deptno) as sumsal
from emp;

  当含有order by时,默认的窗口是从第一行直到当前分组的最后一行。
  二、用于排列的函数

以下是代码片段:
SQL> select empno, deptno, sal,
rank() over
(partition by deptno order by sal desc nulls last) as rank,
dense_rank() over
(partition by deptno order by sal desc nulls last) as dense_rank,
row_number() over
(partition by deptno order by sal desc nulls last) as row_number
from emp;

  三、用于合计的函数

以下是代码片段:
SQL> select deptno,sal,
sum(sal) over (partition by deptno) as sumsal,
avg(sal) over (partition by deptno) as avgsal,
count(*) over (partition by deptno) as count,
max(sal) over (partition by deptno) as maxsal
from emp;

  四、开窗语句
  1、rows窗口: “rows 5 preceding” 适用于任何类型而且可以order by多列。

以下是代码片段:
SQL> select deptno,ename,sal,
sum(sal) over (order by deptno rows 2 preceding) sumsal
from emp;

  rows 2 preceding:将当前行和它前面的两行划为一个窗口,因此sum函数就作 用在这三行上面。

以下是代码片段:
SQL> select deptno,ename,sal,
sum(sal) over
(partition by deptno order by ename rows 2 preceding) sumsal
from emp
order by deptno,ename;

  加了partiton by分区后之后,rows 2 preceding(窗口)只在当前分区内生效,不会影响分区之外的行。

以下是代码片段:
SQL> select ename,sal,hiredate,
first_value(ename)over
(order by hiredate asc rows 5 preceding) first_ename,
first_value(hiredate) over
(order by hiredate asc rows 5 preceding) first_hiredate
from emp
order by hiredate asc;

  order by hiredate asc rows 5 preceding: order by之后,取当前行的前5行+当前行作为窗口(共6行)。
  2、”range unbounded preceding”range unbounded preceding会把当前行之前的所有行都包含进来,但当partition by时:

以下是代码片段:
SQL> select deptno,ename,sal,
sum(sal) over
(partition by deptno order by deptno range unbounded preceding) sumsal
from emp;
SQL> select deptno,ename,sal,
sum(sal) over
(order by deptno range unbounded preceding) sumsal
from
emp;

  这SQL句子和下面这SQL是等价的:
  select deptno,ename,sal, sum(sal) over (order by deptno) sumsal from emp;
  因为order by的默认窗口总是从结果集的第一行开始到它分组的最后一行。
  而partiton by的默认窗口总是从分区的第一行开始。
  3、range窗口:
  ”range 100 preceding”这个子句只适用于number和date,而且只能order by一列。
  如果over()里asc排列,意思是[number-100,number]这样一个闭区间是它的窗口。
  如果over()里desc排列,意思是[number,number+100]这样一个闭区间是它的窗口。
  4、窗口总结:
  1、unbounded preceding:从当前分区的第一行开始,到当前行结束。
  2、current row:从当前行开始,也结束于当前行。
  3、[numeric expression] preceding:对于rows来说从当前行之前的第[numeric expression]行开始,到当前行结束。对range来说从小于数值表达式的值开始,到当前行结束。
  4、[numeric expression] following:与[numeric expression] preceding相反。

Comments (4)

Linux下Oracle数据库的启动和关闭

0顶一下一、启动 三个命令: 1、sqlplux /nolog 2、connect /as sysdba 3、startup 二、关闭 1、shutdown immediate; [oracle@zhao ~]$ sqlplus /nolog SQL*Plus: Release 9.2.0.4.0 – Production on Sun Nov 1 15:08:40 2009 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL》 connect /as sysdba Connected to an idle instance. SQL》 startup ORACLE ...[阅读全文]

0
顶一下

一、启动

三个命令:

1、sqlplux /nolog

2、connect /as sysdba

3、startup

二、关闭

1、shutdown immediate;

[oracle@zhao ~]$ sqlplus /nolog

SQL*Plus: Release 9.2.0.4.0 – Production on Sun Nov 1 15:08:40 2009

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

SQL》 connect /as sysdba

Connected to an idle instance.

SQL》 startup

ORACLE instance started.

Total System Global Area 236000356 bytes

Fixed Size 451684 bytes

Variable Size 201326592 bytes

Database Buffers 33554432 bytes

Redo Buffers 667648 bytes

Database mounted.

Database opened.

SQL》

惊叹号在 SQL》 ! 回车可以退出 sql命令行

查看oracle数据库运行启动的进程

SQL》 !

 

[oracle@zhao ~]$ ps -ef | grep oracle

root 4268 4235 0 15:08 pts/0 00:00:00 su – oracle

oracle 4269 4268 0 15:08 pts/0 00:00:00 -bash

oracle 4299 4269 0 15:08 pts/0 00:00:00 sqlplus

oracle 4302 1 0 15:09 ? 00:00:00 ora_pmon_lx92

oracle 4304 1 0 15:09 ? 00:00:00 ora_dbw0_lx92

oracle 4306 1 0 15:09 ? 00:00:00 ora_lgwr_lx92

oracle 4308 1 0 15:09 ? 00:00:00 ora_ckpt_lx92

oracle 4310 1 0 15:09 ? 00:00:00 ora_smon_lx92

oracle 4312 1 0 15:09 ? 00:00:00 ora_reco_lx92

oracle 4314 1 0 15:09 ? 00:00:00 ora_cjq0_lx92

oracle 4316 1 0 15:09 ? 00:00:00 ora_qmn0_lx92

oracle 4318 1 0 15:09 ? 00:00:00 ora_s000_lx92

oracle 4320 1 0 15:09 ? 00:00:00 ora_d000_lx92

oracle 4322 4299 0 15:09 ? 00:00:01 oraclelx92 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

oracle 4330 4299 0 15:12 pts/0 00:00:00 /bin/bash

oracle 4348 4330 0 15:14 pts/0 00:00:00 ps -ef

oracle 4349 4330 0 15:14 pts/0 00:00:00 grep oracle

[oracle@zhao ~]$ exit

exit

SQL》 shutdown immediate;

Database closed. Database dismounted. ORACLE instance shut down.

SQL》

SQL》 exit

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 – Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.4.0 – Production

[oracle@zhao ~]$

[oracle@zhao ~]$ ps -ef | grep oracle

root 4268 4235 0 15:08 pts/0 00:00:00 su – oracle

oracle 4269 4268 0 15:08 pts/0 00:00:00 -bash

oracle 4390 4269 0 15:22 pts/0 00:00:00 ps -ef

oracle 4391 4269 0 15:22 pts/0 00:00:00 grep oracle

 

Comments (39)

Oracle计划修复Java SE中的17个漏洞

0顶一下北京时间6月6日,据国外媒体报道,日前,Oracle公司发布了一则关于对Java SE平台进行漏洞修补的通知,在通知中,该公司声明,即将在6月7日发布的安全更新修复了SE平台中的17个安全漏洞,包括大量被列为“严重”等级的漏洞,这些漏洞在CVSS的漏洞评分中为10分,即最严重风险。这些漏洞可以让攻击者在用户毫无察觉的情况下远程执行代码。 受影响的产品包括Windows,Linux,和Solaris对应的J...[阅读全文]

0
顶一下

北京时间6月6日,据国外媒体报道,日前,Oracle公司发布了一则关于对Java SE平台进行漏洞修补的通知,在通知中,该公司声明,即将在6月7日发布的安全更新修复了SE平台中的17个安全漏洞,包括大量被列为“严重”等级的漏洞,这些漏洞在CVSS的漏洞评分中为10分,即最严重风险。这些漏洞可以让攻击者在用户毫无察觉的情况下远程执行代码。

受影响的产品包括Windows,Linux,和Solaris对应的JDK和JRE6和5.0,以及JRE和SDK1.4.2_31和早期发布的版本。Oracle强烈建议用户安装该更新,以修复漏洞。

另外,Oracle在近期公布了Java平台计划。上周公司宣布其JavaFX 2.0平台已经进入到测试阶段。该公司还发布了Java开发和维护计划。

 

Comments (267)

oracle数据库限制返回的记录数问题

0顶一下oracle数据库限制返回的记录数问题,setMaxRow的作用是限制最终的返回记录数,这个限制返回和sql执行的速度是基本没有什么关系。   今天yxg提了一张bug单中提到oracle的环境下告警查询非常慢,连上去看了一下发现是非常慢(十多秒钟),开始怀疑是setMaxRow没有生效,导致进行了全表查询,但是在页面确认返回的结果确实是set过的500条,但是如果在语句里直接加入rownum<500不用Quer...[阅读全文]

0
顶一下

oracle数据库限制返回的记录数问题,setMaxRow的作用是限制最终的返回记录数,这个限制返回和sql执行的速度是基本没有什么关系。

 

今天yxg提了一张bug单中提到oracle的环境下告警查询非常慢,连上去看了一下发现是非常慢(十多秒钟),开始怀疑是setMaxRow没有生效,导致进行了全表查询,但是在页面确认返回的结果确实是set过的500条,但是如果在语句里直接加入rownum<500不用QueryHelper.setMaxRow方法来限制查询条数的时候查询速度确是正常的(毫秒级),是不是jdbc的setMaxRow这个方法在性能上有些不足?

re:

setMaxRow的作用是限制最终的返回记录数,这个限制返回和sql执行的速度是基本没有什么关系。

你需要了解一下sql的运行机制,你可以set showplan on来看看sql的执行计划。

上面红色的最终意思是:数据库已经处理好返回的结果,然后从这些结构中获取指定的返回记录数。

特别是一些带有order by的操作,如果没有用到索引,则需要将查询结果放到临时表中进行排序,然后再从排序结果中返回指定的记录数。这个创建临时表和排序的过程也非常消耗数据库的cpu的。

setMaxRow作用主要是避免应用服务器这段需要处理过多的记录而导致出现IO的性能问题。

我们的web开发主要都是围绕数据库的开发,sql的性能直接影响系统的稳定性。sql的编写通常都需要一些经验和技巧的,关于这块开发中心可以考虑进行一次培训。

re:

我觉得这个接口只能限制你返回的数据,而不能限制你查出来多少数据,限制查出来多少条还是要程序自己控制。

想在这个接口里面控制查出来的结果集有难度。

以oracle为例,我就有个深刻教训。

从97接口表中查询1000条待处理数据,按照SO_NBR,ACT_TYPE排序,原来是这样写的

select * from interface_97 where STS=’D’ and rownum<=1000 order by SO_NBR,ACT_TYPE

这个语句是在oracle里是有问题的,虽然是排序了,也只返回了1000条,但是SO_NBR不连续了,因为oracle只是从STS=’D'的数据中抽取了1000条进行排序(抽取的规则不详,虽然大多数情况下没问题)

后来改成这样就没问题了

select * from (

select * from interface_97

where STS=’D’ order by SO_NBR,ACT_TYPE

)

where rownum<=1000

order by rownum asc

上面举的例子只是想说明,要想在setMaxRow里面把你想做的都做了,实现起来肯定有难度,而且可能和你的预期不一致,所以最好还是在你的代码中控制数据量。

re:

嗯,这个让 QueryHelper 来加或替换 set rowcount 或 rownum 或 top,随意性太大,甚至象魏巍这个例子一样,导致结果可能不是你想要的。

在DBA中,限制查询数据的返回条数,大家都写死 select maxrow=1000, * from table

然后 DBA对应 Sybase翻译成 set rowcount 1000,Oralce翻译成 rownum < 5000,自定义的一套SQL规则。比较土 :)

QueryHelper,仅仅是在 java.sql.* 上简单的包装了一层,做了日志和时间统计过程。和其名字相称,仅仅是一个简单的helper。

大家有没有什么比较好的,又不是太重量级的咚咚,来屏蔽这种数据库层面的差异?

做出来show show,大家都觉得好的话,肯定会加到openEAP上去。

呵呵,openEAP是大家的EAP,是open的….

就如老汤说的,目前用QueryHelper这个层面,很难把数据库的SQL差异给屏蔽掉:

如很常用的日期类型,很多查询中都会用到,如果不加 todate 函数,Oracle不会执行的,而Sybase则不需要。

Sybase用条件查询有 case,Oracle用 decode …

 

Comments (90)

在Oracle9i中FormBuilder使用树心得

0顶一下在Oracle9i中FormBuilder使用树心得,Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。 树的简介 Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。 树的特有属性中如下几个较为重要: 多项选择(Muti-Seection):是否允许一次选中树的...[阅读全文]

0
顶一下

在Oracle9i中FormBuilder使用树心得,Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。

树的简介

Deveoper6.0以上版本提供了hierarchytree(层次树)的概念,htree控件非常方便,只需要少量的编程即可实现显示层次结构的目的。

树的特有属性中如下几个较为重要:

多项选择(Muti-Seection):是否允许一次选中树的多个节点。如果不允许,那么选中第二个节点时,第一个被选中的节点会取消选择。

记录组(RecordGroup):指定生成树的记录组的名字。

简单介绍一下跟树相关的触发子(Buit-in):

FUNCTIONGET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeNODE,propertyNUMBER);

功能:取得树节点的属性:

◆其中property有如下几种:

◆NODE_STATE:EXPANDED_NODE(扩展节点)

◆COAPSED_NODE(收缩节点)

◆EAF_NODE(叶节点)–注:不能展开或收缩

◆NODE_DEPTH:既节点在树中的层级。

◆NODE_ABE:节点的显示文本

◆NODE_ICON:节点的图标

◆NODE_VAUE:节点的值。

例子:

DECARE

htreeITEM;

node_vaueVARCHAR2(100);

BEGIN

–得到树

htree:=Find_Item(‘tree_bock.htree3′);

–得到当前选中节点的值

node_vaue:=Ftree.Get_Tree_Node_Property

(htree,:SYSTEM.TRIGGER_NODE,Ftree.NODE_VAUE);

END;

注释:其中:SYSTEM.TRIGGER_NODE指当前选中的树节点。

FUNCTIONGET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER);

功能:取得树的属性:

其中property有如下几种:

DATASOURCE

RECORD_GROUP

QUERY_TEXT

NODE_COUNT:返回树中节点的个数。

SEECTION_COUNT

AOW_EMPTY_BRANCHES

AOW_MUTI-SEECT

PROCEDURESET_TREE_NODE_PROPERTY(item_nameVARCHAR2,nodeFTREE.NODE

,propertyNUMBER,vaueVARCHAR2);

功能:设置树节点的属性:

PROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,vaueVARCHAR2);

PROCEDURESET_TREE_PROPERTY(item_nameVARCHAR2,propertyNUMBER,vaueRECORDGROUP);

功能:设置树的属性PROCEDUREPOPUATE_TREE(item_nameVARCHAR2);。

功能:清空树中已有数据,并根据记录组或数据查询重新生成树。

PROCEDUREADD_TREE_DATA(item_nameVARCHAR2,nodeFTREE.NODE,

offset_typeNUMBER,offsetNUMBER,data_sourceNUMBER,dataVARCHAR2);

功能:在指定节点下添加树中数据:

注:使用比较麻烦。

FUNCTIONFIND_TREE_NODE

(item_nameVARCHAR2,earch_stringVARCHAR2,s

earch_typeNUMBER,search_byNUMBER,search_rootNODE,start_pointNODE);

功能:找到显示文本或值符合search_string的节点。

参数:

search_type:FIND_NEXT

FIND_NEXT_CHID

Search_by:NODE_ABE

NODE_VAUE

Search_root:查询的根节点,一般是Ftree.ROOT_NODE

Start_point:查找的开始节点,一般是Ftree.ROOT_NODE

FUNCTIONADD_TREE_NODE(item_nameVARCHAR2,nodeFTREE.NODE,

offset_typeNUMBER,offsetNUMBER,stateNUMBER,abeVARCHAR2,

iconVARCHAR2,vaueVARCHAR2);

功能:添加树节点:

Offset_type:指定节点的分支类型,PARENT_OFFSET和SIBING_OFFSET

Offset:指定新节点的位置,

PARENT_OFFSET:1..N

AST_CHID

SIBING_OFFSET:NEXT_NODE

PREVIOUS_NODE

State:EXPANDED_NODE(扩展节点)

COAPSED_NODE(收缩节点)

EAF_NODE(叶节点)

PROCEDUREDEETE_TREE_NODE(item_nameVARCHAR2,nodeNODE);

功能:删除树节点FUNCTIONGET_TREE_NODE_PARENT(item_nameVARCHAR2,nodeNODE);

功能:得到指定节点的父节点FUNCTIONGET_TREE_SEECTION(item_nameVARCHAR2,seectionNUMBER);

功能:得到处于选中状态的节点。PROCEDURESET_TREE_SEECTION(item_nameVARCHAR2,nodeNODE,seection_typeNUMBER);

功能:指定单个节点的选中状态:

参数:

seection_type:SEECT_ON

SEECT_OFF

SEECT_TOGGE

FORM运行态时有关的触发器:

When-Tree-Node-Activated:

用户双击节点或在节点选中时按[ENTER]键时触发。

When-Tree-Node-Expanded:

节点展开或收缩时触发

When-Tree-Node-Seected:

当节点选中或取消选择时触发

生成树的方式

树控件一般单独放在一个控制块中(注:不能放在数据块中),在画布(CANVAS)上放置树很容易,并且,如无必要,树的属性也不需要设置。

生成树的方式有几种:

◆运行前通过设置记录组或数据查询属性来生成

◆通过ADD_TREE_DATA触发子来实现

◆运行态,通过ADD_TREE_NODE等触发子来实现

◆运行态,通过添加或删除记录组的数据元素来实现

分析:

对树直接操作:

描述:Find_Tree_Node找到指定节点,Add_Tree_Node来添加其下级节点。

缺点:编程较为复杂,操作不灵活,而且易出错。

优点:可以对添加节点等过程进行控制,实现一些特殊要求。

例子:

–dept_cur为取单位的CURSOR,emp_cur为取雇员的CURSOR

htree:=Find_Item(‘tree_view.tree_emp’);

opendept_cur;

oop

fetchdept_curintoaa;

exitwhendept_cur%notfound;

de_node:=Ftree.Find_Tree_Node(htree,aa.kjmc,Ftree.FIND_NEXT,

Ftree.NODE_ABE,Ftree.ROOT_NODE,Ftree.ROOT_NODE);

–删除单位节点及其子节点

IFNOTFtree.ID_NU(de_node)then

Ftree.Deete_Tree_Node(htree,de_node);

ENDIF;

endoop;

cosedept_cur;

–根据用CURSOR取得的单位生成树的第一层节点

opendept_cur;

oop

fetchdept_curintoaa;

exitwhendept_cur%notfound;

new_node:=Ftree.Add_Tree_Node(htree,Ftree.ROOT_NODE,Ftree.parent_OFFSET,

Ftree.AST_CHID,Ftree.EXPANDED_NODE,aa.dname,”,aa.deptno);

endoop;

cosedept_cur;

–根据雇员CURSOR生成树的下层节点

openemp_cur;

oop

fetchemp_curintobb;

exitwhenemp_cur%notfound;

find_node:=Ftree.Find_Tree_Node(htree,bb.kjbh,Ftree.FIND_NEXT,

Ftree.NODE_vaue,Ftree.ROOT_node,Ftree.ROOT_NODE);

new_node:=Ftree.Add_Tree_Node(htree,find_node,Ftree.parent_OFFSET,

Ftree.AST_CHID,Ftree.EXPANDED_NODE,bb.ename,”,bb.empno);

endoop;

coseemp_cur;

–得到树的根节点

ss:=Ftree.get_tree_property(htree,FTREE.NODE_COUNT);

–循环,直到树的所有节点都展开

forjin1..ssOOP

exp_node:=Ftree.Find_Tree_Node(htree,”);

state:=Ftree.Get_Tree_Node_Property

(htree,j,Ftree.NODE_STATE);

IFstate=Ftree.COAPSED_NODETHEN

Ftree.Set_Tree_Node_Property

(htree,j,Ftree.NODE_STATE,Ftree.EXPANDED_NODE);

ENDIF;

ENDOOP;

动态记录组:

层次树所使用记录组的数据格式:

+—Car

|

-—Airpane

|—Boeing

|—Boeing

初始状态

层数

显示文本

图标

-1(收缩节点)

1

‘Car’

‘car’

0(叶节点)

2

‘Honda’

‘civic’

1(展开节点)

1

‘Airpane’

‘pane’

0

2

‘Boeing’

’747′

0

2

‘Boeing’

Comments (110)

使用Java编写Oracle存储过程

2顶一下Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过 是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径 如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要...[阅读全文]

2
顶一下

Java中使用的路径,分为两种:绝对路径和相对路径。归根结底,Java本质上只能使用绝对路径来寻找资源。所有的相对路径寻找资源的方法,都不过 是一些便利方法。不过是API在底层帮助我们构建了绝对路径,从而找到资源的!在开发Web方面的应用时, 经常需要获取 服务器中当前WebRoot的物理路径

如果是Servlet , Action , Controller, 或则Filter , Listener , 拦截器等相关类时, 我们只需要获得ServletContext, 然后通过ServletContext.getRealPath(“/”)来获取当前应用在服务器上的物理地址

如果在类中取不到ServletContext时, 有两种方式可以做到

1) 利用Java的类加载机制 调用 XXX.class.getClassLoader().getResource(“”); 方法来获取到ClassPath , 然后处理获得WebRoot目录

这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效, 如果该class被打包到一个jar文件中, 则该方法失效。这时就应该用下面一种方式

2) spring框架的思路, 在WEB-INF/web.xml中 , 创建一个webAppRootKey的param, 指定一个值(默认为webapp.root)作为键值, 然后通过Listener , 或者Filter , 或者Servlet 执行String webAppRootKey = getServletContext().getRealPath(“/”); 并将webAppRootKey对应的webapp.root 分别作为Key , Value写到System Properties系统属性中。之后在程序中通过System.getProperty(“webapp.root”)来获得WebRoot的物理路径

根据第二种的思路,我们还可以再扩展一下。不过对于在部署在一台服务器中的应用来说,若还不是你所需请再往下看。

下面是一些得到classpath和当前类的绝对路径的一些方法。你可使用其中的一些方法来得到你需要的资源的绝对路径:

1.DebitNoteAction.class.getResource(“”)

得到的是当前类FileTest.class文件的URI目录。不包括自己!

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

atacarnet/src/com/evi/modules/atacarnet/action/

2.DebitNoteAction.class.getResource(“/”)

得到的是当前的classpath的绝对URI路径。

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

3.Thread.currentThread().getContextClassLoader().getResource(“”)

得到的也是当前ClassPath的绝对URI路径

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

4.DebitNoteAction.class.getClassLoader().getResource(“”) 或ClassLoader.getSystemResource(“”)

得到的也是当前ClassPath的绝对URI路径。

如:file:/D:/eclipse/springTest/WebRoot/WEB-INF/classes/

5.取得服务器相对路径

System.getProperty(“user.dir”)

例如:E:\apache-tomcat-5.5.16\apache-tomcat-5.5.16\bin

我推荐使用Thread.currentThread().getContextClassLoader().getResource(“”) 来得到当前的classpath的绝对路径的URI表示法

6.取得项目中的绝对路径

一般用request.getRealPath(“/”)或request.getRealPath(“/config/”)

但现在不提倡使用request.getRealPath(“/”)了,大家可试用ServletContext.getRealPath(” /”)方法得到Web应用程序的根目录的绝对路径

要取得src的文件非常容易,因为src是默认的相对目录,比如你说要取得src下com目录的test.java文件,你只需要这样就够了

File f = new File(com/test.java);

但如果我要取得不在src目录或者WebRoot目录下的文件呢,而是要从src或者WebRoot同级的目录中取呢,比如说doc吧

我的硬方法是这样实现的:

String path = this.getServletContext().getRealPath(“/”);

Properties p = new Properties();

p.load(new FileInputStream(new File(path.substring(0,(path.lastIndexOf(“\\WebRoot”) + 1)) + “doc/db.properties”)));

System.out.println(p.getProperty(“driverName”));

Comments (250)

Oracle临时表用法的经验心得

2顶一下文章主要介绍的是Oracle临时表的实际用法的经验心得,我们目前所使用的 Oracle 是作为数据库支撑平台的实际应用,可以说其数据量还是算的上比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。 当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联 之后...[阅读全文]

2
顶一下

文章主要介绍的是Oracle临时表的实际用法的经验心得,我们目前所使用的 Oracle 是作为数据库支撑平台的实际应用,可以说其数据量还是算的上比较庞大的系统,即表的数据量一般情况下都是在百万级以上的数据量。

当然在 Oracle 中创建分区是一种不错的选择,但是当你发现你的应用有多张表关联的时候,并且这些表大部分都是比较庞大,而你关联的时候发现其中的某一张或者某几张表关联 之后得到的结果集非常小并且查询得到这个结果集的速度非常快,那么这个时候我考虑在 Oracle 中创建“临时表”。

我对临时表的理解:在 Oracle 中创建一张表,这个表不用于其他的什么功能,主要用于自己的软件系统一些特有功能才用的,而当你用完之后表中的数据就没用了。 Oracle 的临时表创建之后基本不占用表空间,如果你没有指定Oracle临时表(包括临时表的索引)存放的表空的时候,你插入到临时表的数据是存放在 Oracle 系统的临时表空间中( TEMP )。

临时表的创建

创建Oracle 临时表,可以有两种类型的临时表:

会话级的Oracle临时表

事务级的临时表 。

1) 会话级的临时表因为这这个临时表中的数据和你的当前会话有关系,当你当前SESSION 不退出的情况下,临时表中的数据就还存在,而当你退出当前SESSION 的时候,临时表中的数据就全部没有了,当然这个时候你如果以另外一个SESSION 登陆的时候是看不到另外一个SESSION 中插入到临时表中的数据的。

即两个不同的SESSION 所插入的数据是互不相干的。当某一个SESSION 退出之后临时表中的数据就被截断(truncate table ,即数据清空)了。会话级的临时表创建方法:

1.Create Global Temporary Table Table_Name

2.(Col1 Type1,Col2 Type2…) On Commit Preserve Rows ;

举例:

1.create global temporary table Student

2.(Stu_id Number(5),

3.Class_id Number(5),

4.Stu_Name Varchar2(8),

5.Stu_Memo varchar2(200)) on Commit Preserve Rows ;

2) 事务级临时表是指该临时表与事务相关,当进行事务提交或者事务回滚的时候,Oracle临时表中的数据将自行被截断,其他的内容和会话级的临时表的一致 (包括退出SESSION 的时候,事务级的临时表也会被自动截断)。事务级临时表的创建方法:

1.Create Global Temporary Table Table_Name

2.(Col1 Type1,Col2 Type2…) On Commit Delete Rows ;

举例:

1.create global temporary table Classes

2.(Class_id Number(5),

3.Class_Name Varchar2(8),

4.Class_Memo varchar2(200)) on Commit delete Rows ;

3) 两中类型临时表的区别

会话级临时表采用 on commit preserve rows ;而事务级则采用 on commit delete rows ;用法上,会话级别只有当会话结束临时表中的数据才会被截断,而且事务级临时表则不管是 commit 、 rollback 或者是会话结束,Oracle临时表中的数据都将被截断

4 )什么时候使用临时表

1 )、当某一个 SQL 语句关联的表在 2 张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中

2 )、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

3 . 例子:略

4 .临时表的不足之处

1 )不支持 lob 对象,这也许是设计者基于运行效率的考虑,但实际应用中确实需要此功能时就无法使用临时表了。

2 )不支持主外键关系

所以,由于以上原因,我们可以自己创建Oracle临时表,以弥补 Oracle 临时表的不足之处

上面的都是本人经过测试的,但下面是在网上搜索到的方法,本人具体没有测试过,不过觉得可行性很强,有时间测试下

创建方法:

1 、以常规表的形式创建临时数据表的表结构,但要在每一个表的主键中加入一个 SessionID <NUMBER> 列以区分不同的会话。(可以有 lob 列和主外键)

2 、写一个用户注销触发器,在用户结束会话的时候删除本次会话所插入的所有记录 (SessionID 等于本次会话 ID 的记录 ) 。

3 、程序写入数据时,要顺便将当前的会话 ID(SessionID) 写入表中。

4 、程序读取数据时,只读取与当前会话 ID 相同的记录即可。

功能增强的扩展设计:

1 、可以在数据表上建立一个视图,视图对记录的筛选条件就是当前会话的SessionID 。

2 、数据表中的SessionID 列可以通过Trigger 实现,以实现对应用层的透明性。

3 、高级用户可以访问全局数据,以实现更加复杂的功能。

扩展临时表的优点:

1 、实现了与Oracle 的基于会话的Oracle临时表相同的功能。

2 、支持SDO_GEOMETRY 等lob 数据类型。

3 、支持表间的主外键连接,且主外键连接也是基于会话的。

4 、高级用户可以访问全局数据,以实现更加复杂的功能

Comments (582)