Oracle中如何返回两个日期之间的时间间隔?

我们知道在SQL SERVER中有datediff可以返回两个日期之间的时间间隔,但在 oracle 中却不存在这样的函数,那要怎么实现呢?我们分两种情况讨论:

1.只是粗略返回相隔的天数

我们知道在 oracle 中两个日期相减返回的就是相差的天数,当然这个天数未必是整数,它会把两个日期相差的时分秒折算成天数

SQL> SELECT SYSDATE-HIREDATE FROM EMP;

SYSDATE-HIREDATE
—————-
3.12123843
9316.66291
9314.66291
9275.66291
9096.66291
9246.66291
9207.66291
9046.66291
9116.66291
9030.66291
9030.66291
8979.66291

此时我们可以用TRUNC函数去获取我们所要得到的天数: (more…)

ORA-1555错误综述(转)

ORA-1555错误简单的说就是针对一个数据块产生一致读时发生了错误。一致读就是指 oracle 利用回滚段来临时重构一个和事务或查询开始时的块状态相同的快照块的过程。如果一个块改变了多次,可能就会有多个快照块的。

一个事务或查询开始执行时, oracle 会产生一个SCN来记录这个开始时刻点,这个SCN也就叫做SNAPSHOT SCN。 oracle 仅仅看基于SNAPSHOT SCN的快照记录。如果块中有活动的事务或BLOCK SCN> SNAPSHOT SCN时,就产生了一致读。如果是没有活动的事务但没有产生COMMIT SCN的块,先产生DELAY BLOCK CLEANOUT,再比较COMMIT SCN与SNAPSHOT SCN的大小,如果COMMIT SCN小于SNAPSHOT SCN则直接使用该块,否则要产生一致读。
产生ORA-1555的可能情况:
(1) 一个长时间运行的查询,并同时针对查询需要的块有DML处理
当一个长时间的查询开始执行时,查询所需要的一个数据块被修改并递交了,这个块是需要一致读的,但因为该DML事务已递交了,所以保留前映像的回滚段SLOT可以被另外的事务使用,这个查询事务耗时非常长,在这个时间段中,很可能该SLOT被另外的事务使用而把原值给覆盖了,所以当查询执行到该块时,该块的SNAPSHOT SCN时的值已经找不到了,报ORA-1555错误。 (more…)

oracle工作机制(转)

我们从一个用户请求开始讲, oracle 的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到 oracle 监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求,下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲:

专用服务器模式下:一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器进程,并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继承了监听进程的信息,然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开始给它发信息了,用户进程给这个新建的服务器进程发一个CONNECT包,服务器进程再以ACCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接。我们把这种连接叫做HAND-OFF连接,也叫转换连接。另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向服务器进程发送信息了。这种方式我们叫做重定向连接。HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE>SOFTWARE> oracle >HOMEX中设置USE_SHARED_SOCKET。 (more…)

SQL Server中生成某一用户的权限授权脚本

CREATE procedure ListUserPermission
(@UserName sysname)
AS
set nocount on
BEGIN
if (select object_id(’tempdb..#tt’)) is not null
drop table #tt
create table #tt
(owner sysname,
object sysname,
grantee sysname,
grantor sysname,
protecttype varchar(10),
actionname varchar(20),
columnname sysname
)
insert #tt execute sp_helprotect @username = @UserName
select
rtrim(protecttype) + ‘ ‘ + actionname + ” +
case object when ‘.’ then ” else ‘ on ‘ + ‘['+owner+'].['+object+']‘ +
case when columnname in(’(All+New)’,'(All)’,'(New)’,’.’) then ” else ‘(’+columnname+’)’ end end
+’ to ‘ + grantee
from #tt
union all
SELECT ‘EXEC sp_addsrvrolemember ”’+Users.name+”’,”’ +Roles.Name+””
FROM sysusers Users, sysusers Roles, sysmembers Members
WHERE Roles.uid = Members.groupuid
AND Roles.issqlrole = 1
AND Users.uid = Members.memberuid
AND Users.name = @UserName
END
GO

10gR2在Linux中出现Ora-600错误

今天同事告诉我 oracle 10g无法启动,我看了一下,启动的时候报如下错误:

ORA-00600: [keltnfy-ldmInit], [46]

大致了解了一下情况,由于办公室调整,服务器变更了位置,IP地址和hostname也变掉了。

在google上查了一下,发现跟xzh2000描述的很类似,于是修改hosts及network文件,将其中hostname的设定改成原来的hostname,然后再启动 oracle ,果然可以开启数据库了:)

这应该是 oracle 的一个bug,所以对于10gR2在Linux下不要随意修改hostname,如果要修改,一定要修改彻底,主要是修改/etc/hosts,/etc/sysconfig/network这两个文件。

SQL Server无法安装

今天一同事在安装SQL SERVER时出现如下错误:

以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机

之前也碰到过类似的问题,解决方式是:

打开注册表编辑器,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。这样就可以清除安装暂挂项目

然后再执行安装就可以了

Oracle中的rownum

Rownum:

rownum是 oracle 中的伪列,并不真正存在于表中,它只在查询的时候产生。也就是说表中的数据并没有一个真正的物理的列去表示一条记录是第几行,而只是在查询中才会对这些行进行标识。那到底rownum是什么时候赋给行的呢?

rownum是在where条件过滤之后,在任何排序(order by)或聚集(aggregation)之前赋给行的。

同时,只有当rownum被分配给行后才会递增。

rownum的初始值为1。rownum在查询中产生后就不再变化

rownum被分配的过程大致如下:

rownum = 1
for x in ( select * from A )
loop
if ( x satisifies the predicate )
then
OUTPUT the row
rownum = rownum + 1
end if;
end loop; (more…)

参考游标(refcursor)的使用

我们知道在sql server中可以直接在存储过程中使用select * from 来产生记录集,但在 oracle 的存储过程里却不可以。怎么办呢?可以用参考游标来实现。

参考游标(ref cursor)从 oracle 7.3开始引入,作用是允许在存储过程,函数,包中返回记录集。

oracle 9i之前,参考游标以如下方式定义:

首先定义一个参考游标:

TYPE ref_type_name IS REF CURSOR
[RETURN {cursor_name%ROWTYPE
|ref_cursor_name%ROWTYPE
|record_name%TYPE
|record_type_name
|table_name%ROWTYPE} ]; (more…)

稀疏文件与临时表空间文件

不知道大家有没有发现,当你往临时表空间里添加临时文件时速度很快,这是为什么呢?原来 oracle 采用了稀疏文件(Sparse Files )技术。那么什么是稀疏文件呢?

1。什么是稀疏文件

稀疏文件是指内部具有一个或多个未分派数据的区域的文件。程序将会发现这些未分派的包含零字节的区域,但是没有实际的磁盘空间用来代表这些零。换句话说,所有有意义或非零数据得到了分配,而所有无意义的数据(一大串由零组成的数据)没有得到分配。当读入稀疏文件时,已分配的数据以存储方式返回,在默认情况下,按照 C2 安全需求规范未分配的数据以零的方式返回。稀疏文件支持允许在文件的任意位置解除分配数据—-来自Windows在线帮助

A sparse file is a file where any ‘empty’ O/S blocks do not actually take up a full block but have a marker to show the block is empty. The operating system then finds a free block for use when the block is populated with data.—-来自 oracle 的解释

2。稀疏文件的优缺点

优点:通过稀疏文件, oracle 能快速创建临时文件

缺点:1。使用稀疏文件分配空间时如果空间不够会产生错误

2。容易产生磁盘碎片,因为在使用的过程中,有可能连续的空闲空间被其他文件使用,此时

oracle 只能去寻找另外的未使用块来供 oracle 填充数据

3。如何识别稀疏文件

在Linux下可以简单通过ls和df两个指令来辨别

临时文件的绝对文件号(AFN)

还是上次查询报错的例子:

ERROR:
ORA-01114: IO error writing block to file 201 (block # 1048178)
ORA-27069: skgfdisp: attempt to do I/O beyond the range of the file
OSD-04026: Invalid parameter passed. (OS 1048192)
ORA-01114: IO error writing block to file 201 (block # 1048178)
ORA-27069: skgfdisp: attempt to do I/O beyond the range of the file
OSD-04026: Invalid parameter passed. (OS 1048192)

我们看这里出现一个file 201,而查找数据字典就是找不到这个文件:

SQL> select file#,name from v$datafile; (more…)

  Recent Comments:

    搜索本站

    站点日历

    2月 2012
    « 4    
     12345
    6789101112
    13141516171819
    20212223242526
    272829  

    订阅本站

    文章分类

    最新日志

    热点文章

    日志存档

    常用标签