以下是小编为大家收集的临时表在Oracle数据库与SQL Server数据库中的异同,本文共10篇,希望对大家有所帮助。

篇1:临时表在Oracle数据库与SQL Server数据库中的异同
常见应用:
临时表在数据库设计中,有着举足轻重的作用,
如我们可以利用临时表的功能来限制同一个用户名多次登陆到同一个系统中去。例如现在有一个财务管理系统,企业希望同一个用户在同一时间里只能登陆一次,这主要是用来限制每位员工都以自己的用户名与密码登陆。如此限制的目的主要是为财务管理系统中的每张单据找到其主人。
原始方案:
在以前数据库设计的时候,也有人不用临时表进行这方面的限制,而用实体数据库表来登记相关的信息。如在用户信息表中有一列专门用来记录用户的当前登陆状态。当用户登陆系统后,该用户登陆状态的字段就改为Y,而当用户退出系统能后,该字段的内容又改为N。这个方案看起来是可行的,但是,其在实际应用中,有一个非常大的漏洞。若用户登陆到系统后,终端因为各种原因,如病毒、断电等突然状况,发生死机的话,此时,用户虽然没有登陆到系统中去,但是,因为其退出系统的时候,没有正常退出,这就导致在财务管理系统中的用户信息表中,显示该用户的登陆状态仍然为Y。此时,用户尝试登陆到财务管理系统中去的话,就会被系统拒绝,系统会认为该用户已经登陆了系统,不能重复登陆。
所以说,利用实体表来记录用户登陆的信息,存在着管理上的漏洞。
利用临时表实现用户重新登陆的限制:
后来,数据库设计师们想,能否把该用户登陆信息记录在一张临时性的表中呢?当用户结束会话,无论是正常的退出还是因为意外情况的退出,只要用户结束一个会话后,那么该临时表中的内容就会清空。
若跟这个需求结合的话,数据库设计师就希望能够实现如下功能。
当用户登陆系统开始一个会话后,数据库系统就建立一张临时表,该表中至少有一个内容,就是用户的帐号(或者该帐号对应的ID)。当有其他用户登陆到系统的时候,系统会先从这张临时表中查询,是否有相同的用户记录。若有的话,就会拒绝用户的登陆,警告用户已经有相同的用户登陆了。当用户正常退出系统或者因为以外情况退出系统结束当前会话的时候,那么数据库系统就会清除这张表的内容。如此,当用户下次登陆系统的话,即使是在意外情况下登陆系统的,也可以正常的登陆,
可见,数据库的临时表在企业实际应用中有着举足轻重的作用。
在ORACLE数据库与SQL SERVER数据库中,都实现了临时表的功能。不过两者实现的方式有差异。而不同的实现方式又赋予了其不同的特点,这是我们在数据库选型中不得不重视的一方面内容。
两个数据库临时表实现方式的异同:
SQL SERVER临时表跟ORACLE数据库临时表的差异,可以利用一句话来概括。SQL SERVER 临时表是在需要用到的时候创建;而ORACLE 数据库的临时表,则是在数据库初始化中就开始创建,在具体的会话或者事务开始后进行操作,结束一个会话或者结束一个事务后该数据库的内容就会被清空。
1、在创建时的异同。
SQL SERVER 数据库的临时表,是在实际需要时创建的。具体的来说,可以利用SELECT语句与CREAT语句创建临时表。如可以利用SELECT * INTO #USER_TEMP FROM USER;通过这条语句就可以在需要的时间创建一张临时表。除此之外,还可以利用CREATE语句,在需要的时候创建临时表。
而ORACLE数据库,是在数据库系统初始化的过程中,就需要建立临时表。也就是在用户安装财务管理软件系统时,初始化数据库系统时,系统就会创建临时表。而不是在临时表需要用到的时候,才被创建。故,ORACLE数据库的临时表创建方式只有一种,在数据库初始化的时候,利用CREATE创建数据库临时表。所以,ORACLE数据库临时表,又有另一种说法。我们一般称ORACLE数据库的临时表是永久性的,只是临时表的内容是临时的,在需要用到临时表时,只要直接调用即可,而不用临时创建。这不像SQL SERVER数据库那样,只有在用到时,才创建该临时表;当结束会话时,不仅表中的数据被清空了,而且该表也被删除了。
笔者评论:
笔者还是比较喜欢ORACLE数据库临时表的实现方式。为什么呢?因为我们都知道,数据库定义语言,如CREATE等,比较占用系统资源。若在数据库SQL SERVER数据库系统设计的过程中,前台程序频繁的使用CREATE等数据库定义语言创建临时表的话,会对SQL server数据库系统的运行效率产生很大的不利影响;而且,每次运行的话,都会有类似的不利影响,因为每次运行都会有一个创建临时表的过程。而ORCLE数据库中,则是在系统初始化的时候才利用CREATE语句,所以,只是在系统初始化的时候,可能性能会受到影响,而在以后的数据库运行中,就不会为这个老是运行CREATE语句而困饶。所以,我个人还是比较喜欢采用ORACLE系统的临时表处理方案。
篇2:项目实施中oracle数据库表空间问题
问题描述:前一段时间,项目部署到客户机房服务器上的时候,我们发现我们的测试数据库的表都放在system或者users表空间下面,相应的表并没有放到对应的表空间下,比如我创建一个cncb的表空间和数据库用户,当我们导入数据的时候数据并没有导入到相应的表空间下,如下图所示:
为此在网上查了一些资料,进行了如下处理:
Sql代码
--首先需要备份一下数据库
exp cncb/join@orcl file=f:\cncb0331.dmp wner=(cncb)
revoke unlimited tablespace from cncb;
alter user cncb quota 0 on 表空间名;
--补充,凡是其他表空间中存在cncb的表的都执行上边语句,绝对保障其他表空间存储cncb的空间额度设置为0
alter user cncb quota unlimited on cncb;
--执行完之后,再倒入刚才备份的数据库
刷新可以看到,如下图所示:
顺便总结一下:
Windows下创建表空间命令:(windows和Linux稍微不同)
首先以dba的角色登陆,或者使用sqlplus或者使用plsql
Sql代码
sqlplus /nolog
connect system/admin@ORCL as sysdba
drop tablespace test including contents;
create tablespace test datafile 'F:\oracle\product\10.2.0\oradata\ORCL\ test.ora' size 100m reuse
autoextend on maxsize unlimited
default storage(initial 320k
next 320k
minextents 1
maxextents unlimited
pctincrease 0);
--创建用户
create user 数据库用户名 identified by 密码 default tablespace 表空间名 temporary tablespace temp;
--授权,一般为了方便,我们直接赋权dba
grant dba to 数据库用户;
Linux下创建表空间命令:
Sql代码
--创建临时表空间
create temporary tablespace test_temp
tempfile '/opt/oracle/oradata/orcl /test_temp01.dbf'
size 64m
autoextend on
next 65m maxsize 2048m
extent management local;
--创建表空间
create tablespace test_data
logging
datafile '/opt/oracle/oradata/orcl/test_data01.dbf'
size 64m
autoextend on
next 65m maxsize 2048m
extent management local;
作者 laoli5290
篇3:VB6.0与SQLServer――有源数据库连接
VB6.0中数据访问接口有三种:ActiveX数据库对象(ADO)、远程数据对象(RDO)和数据访问对象(DAO),ADO(ActiveX Data Objects)是用于存取数据源的COM组件是Microsoft数据库应用程序开发的接口,是建立在OLEDB之上的高层数据库访问技术。它封装了OLEDB所提供的接口,比起OLEDB的提供者,ADO接口可以使程序员在更高级别上进行数据交互。它提供了统一数据库访问方式OLEDB(Object Linking and Embedding Database)的一个中间层。VB6.0与SQL Server建立连接有两种方法:有源数据库连接和无源数据库连接,区别他们看是否使用了DSN连接。无源数据库连接是不需要配置ODBC数据源,利用ADO就可以通过代码编写的。
下面主要介绍一下有源数据库连接。首先要注册数据源名称(DSN),通过配置ODBC环境进行数据源注册。
数据源分三类:
(1)用户DSN:只有创建数据源的用户才可以使用他们自己创建的数据源而且只能在当前计算机上使用。
(2)系统DSN:任何使用计算机的用户和程序都可以使用,
(3)文件DSN:除了具有系统DSN的功能外,还能被其他用户在其他计算机上使用。
首先,我们选择创建文件DSN,并单击添加。
www.2cto.com
其次,在创建新数据源中选择SQL Server驱动程序。
第三步,输入想要保存此链接的文件数据源的名称。
第四步,选择服务器
然后,设置登录认证
如下选项可以根据需要选择
最后,进行测试数据源。
显示成功,点击确定,文件DSN设置成功!
ODBC(Open Database Connectivity)开放数据库互联,是一种接口规范。利用ODBC可以在应用程序中同时访问多个数据库系统,ODBC最大优点是能以统一的方式处理所有的数据库。
作者 康立贤
篇4:不要让临时表空间影响Oracle数据库性能数据库教程
在Oracle数据库中进行排序、分组汇总、索引等到作时,会产生很多的临时数据,如有一张员工信息表,数据库中是安装记录建立的时间来保存的。如果用户查询时,使用Order BY排序语句指定按员工编号来排序,那么排序后产生的所有记录就是临时数据。对于这些临时数据,Oracle数据库是如何处理的呢?
通常情况下,Oracle数据库会先将这些临时数据存放到内存的PGA(程序全局区)内。在这个程序全局区中有一个叫做排序区的地方,专门用来存放这些因为排序操作而产生的临时数据。但是这个分区的容量是有限的。当这个分区的大小不足以容纳排序后所产生的记录时,数据库系统就会将临时数据存放到临时表空间中。这就是临时表空间的来历。看起来好像这个临时表空间是个临时工,对于数据库的影响不会有多大。其实大家这是误解这个临时表空间了。在用户进行数据库操作时,排序、分组汇总、索引这些作业是少不了,其会产生大量的临时数据。为此基本上每个数据库都需要用到临时表空间。而如果这个临时表空间设置不当的话,则会给数据库性能带来很大的负面影响。为此管理员在维护这个临时表空间的时候,不能够掉以轻心。要避免因为临时表空间设置不当影响数据库的性能。具体来说,主要需要注意如下几个方面的内容。
一、创建用户时要记得为用户创建临时表空间。
最好在创建用户时为用户指定临时表空间。如可以利用语句default temporary table space语句来为数据库设置默认的临时表空间。不过在Oracle数据库中这个不是强制的。但是笔者强烈建议这么做。因为如果没有为用户指定默认临时表空间的话,那么当这个用户因为排序等操作需要使用到临时表空间的话,数据库系统就会“自作聪明”的利用系统表空间SYSTEM来创建临时段。众所周知,这是一个系统表空间。由于在这个表空间中存放着系统运行相关的数据,一般的建议是用户的数据不能够保存在这个表空间中。那么如果将用户的临时表空间防止在这个系统表空间之内,会产生什么负面影响呢?
由于临时表空间中的数据是临时的。为此数据库系统需要频繁的分配和释放临时段。这些频繁的操作会在系统表空间中产生大量的存储碎片。当这些存储碎片比较多时,就会影响系统读取硬盘的效率,从而影响数据库的性能。其次系统表空间的大小往往是有限制的。此时临时段也来插一脚,就会占用系统表空间的大小。
为此数据库管理员需要注意一点,当没有为用户指定临时表空间时,用户排序等操作仍然需要用到临时段。此时数据库系统就会将临时段放入到系统表空间中。为此就会对数据库的性能产生不利的影响。所以笔者建议各位读者与数据库管理员,在创建用户的时候同时为用户指定一个默认的表空间,以减少临时段对系统表空间的占用。
二、合理设置PGA,减少临时表空间使用的几率。
当排序操作产生临时数据时,数据库并不是马上将其存储在临时表空间中。通常情况下,会先将这些临时数据存储在内存的PGA程序全局区内。只有当这个程序全局区无法容纳全部数据时,数据库系统才会启用临时表空间中的临时段来保存这些数据。但是众所周知,操作系统从内存中读取数据要比从硬盘中读取数据块几千倍。为此比较理想的情况是,这个程序全局区足够的大,可以容纳所有的临时数据。此时数据库系统就永远用不到临时表空间了,
从而可以提高数据库的性能。
但是这毕竟只是一个理想。由于内存大小等多方面的限制,这个PGA程序区的大小往往是有限制的。所以在进行一些大型的排序操作时,这个临时表空间仍然少不了。现在数据库管理员可以做的就是合理设置这个PGA程序全局区的大小,尽量减少临时表空间使用的几率。如在实际工作中,数据库管理员可以根据需要来设置初始化参数SORT_AREA_SIZE参数。这个参数主要控制这个PGA程序全局区内排序区的大小。通常情况下,如果这个数据库系统主要用来查询并且需要大量的排序、分组汇总、索引等操作时,那么可以适当调整这个参数,来扩大PGA分区的大小。相反,如果这个系统主要用于更新操作,或者在这个数据库服务器上还部署由其他的应用程序,那么这个PGA分区就不能够占用太多的内存,以防止对其他应用程序产生不利的影响。所以说,数据库官员不能够一刀切,需要根据实际情况来调整。在必要的情况下,可以增加系统内存来增加PGA分区的大小,从而降低临时表空间的使用几率,以提高数据库的排序、分组汇总等操作的性能。
总之,如果临时段被频繁使用的话,由于内存与硬盘在性能上的差异,从而会降低数据库的性能。为此在平时工作中,数据库管理员还需要监控临时表空间的使用情况,以判断是否需要采取措施来减少临时表空间的使用来提高数据库的查询性能。为了实现这个目的,笔者建议数据库管理员可以查看v0_segment这张动态性能视图。通过这张动态性能视图可以查看系统排序段(临时段的一种)的使用情况。另外通过动态性能视图v0_usage还可以查询使用排序段的用户与会话信息。从而为数据库管理员优化数据库性能提供数据上的支持。对于这个排序段,笔者还要说明一点。对于排序段来说,同一个例程的所有SQL语句(如果需要排序操作的话)都将共享同一个排序段。并且排序段在第一次需要用到时被创建。排序完成后这个排序段不会被释放,只有在这个历程关闭后排序段才会被释放。为此以上两张视图要综合起来分析,才能够得到数据库管理员想要的信息。
三、要为临时表空间保留足够的硬盘空间。
其他表空间对应的数据文件,在其创建时就会被完全分配和初始化,即在其创建时就会被分配存储空间。但是临时表空间对应的临时文件则不同。如在Linux操作系统中,临时表空间创建时系统是不会分配和初始化临时文件的。也就是说,不会为临时文件分配存储空间。只有临时数据出现需要用到临时文件的时候,系统才会在硬盘上分配一块地方用来保存临时文件。此时就可能会产生一个问题,即当需要用到临时文件系统为其分配空间的时候,才会先系统分区中没有足够的存储空间了。此时就会产生一些难以预料的后果。
为此对于这些临时文件,数据库管理员最好能够预先为其保留足够的空间。如在Linux操作系统中,可以将其防止在一个独立的分区内,不允许其他应用程序使用。如此的话,就不用担心临时文件没有地方存储了。另外由于临时表空间主要用来存放一些排序用的临时文件。为此如果能够将这个临时表空间存放在性能比较好的分区中,还可以提高数据库系统读取临时表空间中数据的速度。另外由于系统需要频繁分配临时表空间中的数据,为此临时表空间所在的分区会出现比较多的碎片。此时如果将临时表空间存放在一个独立的分区内,那么数据库管理员就可以单独对这个分区进行碎片整理,从而提高这个分区的性能。所以无论出于什么原因,将临时表空间防止在一个独立的分区内,是一个不错的想法。不仅可以保证临时文件有存储的空间,而且还可以提高数据库的性能。
对于临时表空间最后需要说明的是,默认情况下这个临时表空间对各个用户都是共享的。也就是说每个连接到数据库的用户都可以使用默认的临时表空间。数据库管理员可以为其指定其他的临时表空间。一般来说,只需要一个临时表空间即可
篇5:更改Oracle数据库表的表空间数据库教程
oracle|数据|数据库
在Oracle数据库管理系统中,创建库表(table)时要分配一个表空间(tablespace),如果未指定表空间,则使用系统用户确省的表空间,
在Oracle实际应用中,我们可能会遇到这样的问题。处于性能或者其他方面的考虑,需要改变某个表或者是某个用户的所有表的表空间。通常的做法就是首先将表删除,然后重新建表,在新建表时将表空间指定到我们需要改变的表空间。如果该用户已经保存了大量数据,这种办法就就显得不是很方便,因为有大量数据需要提前备份出来。下面介绍一种利用数据库的导出/导入功能来实现重新组织数据库表空间的方法。
下面是一个简单的例子,假定要将用户oa下的全部表从表空间A转换到表空间B,具体步骤(在Oracle 9i for linux环境)如下:
1.1. 导出db_zgxt下的所有表(Dos控制台下) 导出db_zgxt下的所有表(Dos控制台下)1. 导出db_zgxt下的所有表(Dos控制台下)
EXP oa/password@pararmount_server FILE=d:\10_27_oa.dmp LOG=d:\10_27_oa.LOG
2. 删除oa下的所有表(在SQL/PLUS中)
可以采用批处理的方式删除掉db_zgxt下的所有表,生成批处理的语句如下:
--其中set head off将表头信息去掉
SET HEAD OFF
SPOOL c:\drop_tables.sql
select 'drop table '||table_name||';' from user_tables;
spool off;
@c:\drop_tables.sql;
sql >@drop_tables.sql
3. 采用导入参数 INDEXFILE导入oa用户下的所有表(Dos控制台下)
把建表和索引的语句导出到文件,其中建表语句是加注释的,并没有实际导入
IMP oa/password@paramount_server FULL=Y FILE=d:\10_27_oa.dmp INDEXFILE=d:\altertablespace_table_index.SQL LOG=d:\altertablespace.LOG
其中,指定参数INDEXFILE后,系统就将创建表和索引的语句写到一个文件,这里是altertablespace_table_index.SQL 中,
该文件中包含了所有创建索引(CREATE INDEX)语句和创建表(CREATETABLE)语句,但是这里所有创建表的语句均加了注释标志。在任何文本编辑器中打开并编辑该文件,去掉所有创建表语句的注释标志,将所有的表空间名称由A替换为B,同时对所有的创建索引语句加上注释标志。这些工作作完以后,在SQL/PLUS中运行该脚本文件,这些表就被创建,其表空间由A变为B。
采用导入参数INDEXES=N 和IGNORE=Y将db_zgxt用户的表数据导入库中(Dos控制台下)
4. 采用导入参数INDEXES=N 和IGNORE=Y将oa用户的表数据导入库中(Dos控制台下)
IMP oa/password@paramount_server FULL=Y INDEXES=N FILE=d:\10_27_oa.dmp IGNORE=Y LOG=d:\altertablespace.LOG
其中,参数INDEXES=N是指将数据导入数据库中时不加索引。IGNORE=Y是指在导入数据过程中,忽略表已经存在(table already exists)的错误。这样Oralce就将数据和一些约束条件导入到第3步创建的表中。
5. 创建索引
在文本编辑器中重新打开在第3步中创建的altertablespace_table_index.SQL 脚本文件,这次,将所有创建表(CREATE TABLE)的语句加上注释标志,然后将所有的创建索引(CREATE INDEX)语句去掉注释标志。在SQL/PLUS中再次运行该脚本文件。
至此,我们就成功完成了将oa用户下的全部表从表空间A转换到表空间B的工作。当然你可以只导入一部分表。
篇6:浅析Oracle和SqlServer存储过程的调试、出错处理数据库
在大型数据库中,因为 开发 的需要,经常地需要调用Procedure,开发Procedure在 Oracle 和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上, 首先说调试: 1、对于Oracle的调试,可以借助于第三方的工具,比
在大型数据库中,因为开发的需要,经常地需要调用Procedure,开发Procedure在Oracle和Sqlserver上因为语法不同,而有所区别,但是在调试上,都是比较的不容易,尤其是在一些错误处理上。
首先说调试:
1、对于Oracle的调试,可以借助于第三方的工具,比如Pl/Sql Developer,我在用的版本是6.0.5.926;首先对该Procedure右键处理,添加“add debug information”,然后选择“test”,打开新的测试窗口,在下方对应的输入输出变量地方,添加相应的测试数据,注意:这里的数据输入,不需要引号,输出参数不需要输入然后点击“start debugger”,或者按F9,进行测试,可以选择测试的步骤如“step into”等,然后可以在下面的script窗口看到,中间变量;
2、对于SqlServer调试,我还没有找到比较好的第三方工具,目前是采用将中间的变量值或者sql语句插入到另一个表中,或者直接print出来的方式。第一种需要借助 exec('') 方法,注意里面的取变量值的写法,可参考下面的例子:
exec('update SupplyplanLack set Completedate = GetDate
from supplyPlanLack a where '+ @ssTmp +' and
'+@iCompleteQty+'>= (select s.RequestQty * a.RationQty as ReqQty
from Balance a, SupplyPlan s where a.Vehicle = s.Vehicle
and a.Part=s.Part and a.SupplyPlanNo = s.SupplyPlanNo
and '+ @ssTmp +')')
在print中,需要注意类型的转换,一般是借用 convert(varchar(11),@spNOTo) 方法来实现,否则会提示类型转换错误!
3、错误处理上,对于Sqlserver可以采用开始自定义变量,然后根据不同判断,改变该值然后推出的方法来处理,见下例
set @exec_num=0
if (@spNOFrom=0 or @spNOTo=0 or @reuseUser=NULL)
begin
set @exec_num=1
goto the_end
end
the_end:
return
或者是这种:
set nocount on
if (@property is null) or (@property = '')
begin
raiserror('Must specify a property name.',-1,-1)
return (1)
end
或者是对该错误全局变量 @@error 数值的判断上,
原文转自:www.ltesting.net
篇7:系统从oracle版本转化为sqlserver版本数据库教程
oracle|server|sqlserver
Waterxp 从oracle版本转化为sqlserver版本1,系统安排
为了oracle版本和sqlserver版本能很方便的转化,也为了两个版本能同步修改,特别是业务逻辑层,现决定如下:
A,两个版本的业务逻辑层都放在source目录下。在该目录下有两个目录:
sql 和ora。这两个目录有三个文件:
common.pbl ,water_modi.pbl,dw_version.pbl。
这三个 文件里面绝大部分是数据窗口,主要是因为sql server 和oracle的语法有差别。如果只是因为数据窗口有双引号在sql server里不能用,那么把数据窗口的select语法的字段引号去掉即可,因为没有引号的select语句在sql server和oracle下面都是可用的。修改的过程中注意update属性。
B,不同的数据库将使用不同的目录。
2,系统环境的建立
每台机器上建立下面的磁盘映射:
P 指向 \\oraservr\p237
V 指向 \\oraservr ql237 或者是 \\oraserver\ora237
源代码在 \\oraserver\code\water237 ource 里面。
P盘是肯定要有的, V盘由使用什么版本决定。
3,源代码的修改
业务层的修改尽可能的在源代码处,因为这样修改能让两个版本同时修改。
P盘是类库可以不需要修改。
V盘里的数据窗口都需要改。
改sql237里面的数据窗口,要修改和要注意的地方:
替换的方法
oracle里面使用 sql server 里面使用
to_char(readingdate,’yyyymm’) convert(char(6),readingdate,111)
to_char(readingdate,’yyyy/mm’) convert(char(7),readingdate,112)
decode( , , , ,) case when then end 或者 isnull(x,0)
左右连接 (+) left outer join
修改过程中要注意数据窗口的update属性,
4,工作计划
4,1先修改sql237目录下的三个pbl里面的数据窗口的语法。为了照顾数据窗口的update属性,建议使用edit source的方法,而且select语法字段的引号在sql server版本建议去掉。使用pb的replace功能即可。
4,2 修改某些数据窗口的内嵌式sql 的语法。因为有一些内嵌式sql 也使用了decode() ,或者是to_char(),这些语法在sqlserver也是必须代替的。
修改方法:
if gs_database = ‘ORACLE’ then
………………decode()……………;
else
…………………case when then end ………..;
end if
4,3 最后的工作是测试。这是最繁琐的最重要的。在测试的过程会发现有一些数据窗口在sql server不能用:修改方法是将字段的引号去掉或者是移到sql 和ora目录里面的dw_version.pbl文件里面,在那里进行修改。
4,4主要的数据表都已经迁移过来了,名字一样,可能在sql server有一些表的字段不够那么请重新导入一次。主要的存储过程都已经翻译过来,名字不一样。在测试的过程会发现有一些视图没有存在,那么请从oracle把语法拷贝出来,在sql server查询分析器里生成之。
篇8:快速检测Oracle数据库可用性和表空间容量
很多人都有这样的了解,检测Oracle的可用性所需要的命令比简单的ping或者ps -ef | grep 等Oracle的命令要多得多,
快速检测Oracle数据库可用性和表空间容量
,
有观点认为它需要一个使用SQL*Net 来验证 已经开启并运行的测试访问Oracle――这是用户经常用到的访问。通过实际地登录到实际环境中,你可以确认这个实例环境可以接受登录的,如果你只是做了以上的检测的话,你如何才能知道是否登录没有被接受,只是因为需要等待文档日志?
篇9:oracle数据库中关于null排序的问题
问题描述:
在处理一般的数据记录中,对于数字类型的字段,在oracle的排序中,默认把null值做为大于任何数字的类型,当然对于varchar2类型的字段,默认也是该处理方式,但是客户要求排序的过程中,需要把null的字段默认排在前边(从小-->大),一般的order by xxxx,无法解决。
问题解决:
方案1:
可以使用复杂的使用sql:
select * from
(select a.*,rownum as my_sys_rownum from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,nvl(ZBTS, '0'),
nvl(FZR,'0'),nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where rownum<
and ZBRL is null
) a
union
select b.*,rownum+(select count(*) from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,nvl(ZBTS, '0'),
nvl(FZR,'0'),nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where rownum<2000
and ZBRL is null
)) as my_sys_rownum from (
select deptid,nvl(BDZNAME,' '),nvl(VOLLEVEL,'0'),ZBRL,
nvl(ZBTS, '0'),nvl(FZR,'0'),
nvl(DEPTIDDES,' '),nvl(TEL,' '),nvl(RUNSTATEDES,' '),
nvl(ADDRESS,' '),BDZID from V_BDZ where rownum<2000
and ZBRL is not null order by ZBRL
) b
)
order by my_sys_rownum desc
方案2:
可以利用oracle中可以对order by中对比较字段做设置的方式来实现:
如: ……order by nvl( aaa,'-1')
篇10:Mysql和Oracle数据库中的分页查询
方法一:mysql数据库分页
<%
//定义每一页显示的记录
int pageSize = 3;
String strPageNo = request.getParameter(“pageNo”);
//记录当前页面
int pageNo;
//如果传入的当前页码为空,停留在第一页
if(strPageNo == null || strPageNo.equals(“”))
{
pageNo = 1;
}
else
{
try
//把传进来的字符串转化成数字
{
pageNo = Integer.parseInt(strPageNo.trim());
}
catch(NumberFormatException e)
{
pageNo = 1;
}
//如果页码小于或者等于0停留在第一页
if(pageNo<=0)
{
pageNo=1;
}
}
//连接数据库
Class.forName(“com.mysql.jdbc.Driver”);
Connection conn = DriverManager.getConnection
(“jdbc:mysql://localhost/bbs?user=root&password=mingming”);
Statement stCount = conn.createStatement();
ResultSet rsCount = stCount.executeQuery
(“select count(*) from article where pid=0”);//查询共有多少个根节点
rsCount.next();
int totalRecord = rsCount.getInt(1); //拿到所有的子节点,计算出总共有多少条记录
// 第一种方法 计算得到总的页数,如果能被整数,页数就是商,否则就是商+1
int totalPage =
totalRecord%pageSize==0 ? totalRecord/pageSize : totalRecord/pageSize +1;
//第二种方法 计算得到总的页数,在 总记录上+加一个pageSize然后减去1除页面的大小pageSize,取商
int totalRecords = rsCount.getInt(1);
totalPages = (totalRecords + PAGE_SIZE - 1)/PAGE_SIZE;
//如果当前页码大于总的页数,停在最后一页
if(pageNo>totalPage)
{
pageNo = totalPage;
}
//计算每一次分页时 的起始位置,注意起始是从0开始;
int startPos = (pageNo-1)*pageSize;
Statement st = conn.createStatement();
//进行分页查询,startPos是每一次分页的起始位置; pageSize是这一页要显示记录的大小
ResultSet rs = st.executeQuery
(“select * from article where pid =0 order by pdate desc limit ”+startPos+“,”+pageSize);
%>
分页后在页面的不同的显示方式:
方式一:在一个table中正常的显示:
<%
while(rs.next()){
%>
<%= rs.getString(“title”) %>//只显示每一个记录的title
<%
}
//关闭流
rs.close();
st.close();
conn.close();
%>
首页<%=1 %> 共<%=totalPage %>页 第<%=pageNo %>页 末页<%=totalPage %>
“>上一页
”>下一页
方式二:可以选择的显示:可以实现页面的跳转
<%
for(int i = 1;i<=totalPage;i++){
%>
<%=i %><%= pageNo==i?“selected”:“”%>>第<%=i %>页
<%
}
%>
方式三:可以直接进行页面的查找:
//提交到当前页面
<%=pageNo%>/>
方法二:Oracle数据库下的分页操作
分页查询
姓名
薪水
<%
//连接数据库,加载驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
Connection ct = DriverManager.getConnection
(“jdbc:oracle:thin:@127.0.0.1:1521:ORCL”,“scott”,“tiger”);
Statement sm = ct.createStatement();
//总共有多少页
int pageCount = 0;
//总共有多少行记录
int rowCount = 0;
//每页有3行记录
int pageSize = 3;
//接收pageNow
String s_pageNow = (String)request.getParameter(“pageNow”);
//当前在第一页
int pageNow = 1;
if(s_pageNow != null)
{
//把s_pageNow转化为数值型
pageNow = Integer.parseInt(s_pageNow);
}
//查询表中共有多少条记录www.dnzg.cn
ResultSet rs = sm.executeQuery(“select count(*) from emp”);
if(rs.next())
{
rowCount = rs.getInt(1);
//如果整除就是商,否则就是商加上1 可以用三元表达式代替 rowCount%pageSize==0 ? rowCount/pageSize : rowCount/pageSize +1
if(rowCount%pageSize == 0)
{
pageCount = rowCount/pageSize;
}
else
{
pageCount = rowCount/pageSize +1;
}
}
//执行分页查询
rs = sm.executeQuery
(“select * from (select a1.*,rownum rn from(select * from emp) a1 where rownum<=”+pageNow*pageSize+“)where rn>=”+((pageNow-1)*pageSize+1)+“ ”);
while(rs.next())
{
out.println(“”);
out.println(“”+rs.getString(2)+“”);
out.println(“”+rs.getString(6)+“”);
out.println(“”);
}
//输出每一页要查找的连接
for(int i=1; i<=pageCount; i++)
{
out.print(“[”+i+“]”);
}
%>
★SQLServer 附加数据库之后出现只读或失败的解决方法
文档为doc格式