Oracle time_zone

1. How to check the session time zone ?
=======================================
Answer
——
The new SESSIONTIMEZONE built-in SQL function returns the value of the current session’s time zone.
SQL> SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE
—————
+01:00
2. How to set the session time zone ?
=====================================
Answer
——
The session time zone can be set to:
– O/S local time zone
– Database time zone
– An absolute offset
– A named region
1. The first method consists to use one of the following ALTER SESSION SET TIME_ZONE statements:
SQL> ALTER SESSION SET TIME_ZONE = local;
SQL> ALTER SESSION SET TIME_ZONE = dbtimezone;
SQL> ALTER SESSION SET TIME_ZONE = ‘-05:00’;
SQL> ALTER SESSION SET TIME_ZONE = ‘Europe/London’;
2. As an alternative, the operating system environment variable ORA_SDTZ can also be used to set the session time zone:
ORA_SDTZ = ‘OS_TZ’ | ‘DB_TZ’ | ‘[+ | -] hh:mm’ | ‘timezone_region’
Example:
$ ORA_SDTZ=’OS_TZ’
$ export ORA_SDTZ
$ ORA_SDTZ=’-05:00′
$ export ORA_SDTZ
3. How to check the database time zone ?
========================================
Answer
——
The DBTIMEZONE SQL function returns the value of the database time zone.
SQL> SELECT DBTIMEZONE FROM DUAL;
DBTIMEZONE
————–
Europe/Lisbon
Note that the database timezone is also included in both database_properties and props$ views:
SQL> SELECT property_name, property_value
FROM database_properties
WHERE property_name=’DBTIMEZONE’;
and
SQL> SELECT name, value$
FROM props$
WHERE name=’DBTIMEZONE’;
Be aware that you should not rely on these views because in case of db time zone change, these views reflect the new db time zone too early: they should reflect
it only after database shutdown and restart.
4. How to set the database time zone ?
======================================
Answer
——
Note that the database time zone is only relevant for TIMESTAMP WITH LOCAL TIME ZONE columns.
1. At creation time
SQL> CREATE DATABASE …
SET TIME_ZONE=’Europe/London’;
If not specified with the CREATE DATABASE statement, the database time zone defaults to the server抯 O/S timezone offset.
2. After database creation, use the ALTER DATABASE SET TIME_ZONE statement and then shut down and restart the database.
SQL> ALTER DATABASE SET TIME_ZONE = ‘-05:00’;
SQL> ALTER DATABASE SET TIME_ZONE = ‘Europe/Lisbon’;
The change will not take effect until the database is bounced.
5. How to list the valid time zone regions ?
============================================
Answer
——
SQL> SELECT * FROM v$timezone_names;
TZNAME TZABBREV
—————————— ———-
Pacific/Tahiti LMT
Poland LMT
US/Pacific PST
Europe/Zurich CET
The result will depend on which timezone file is currently in use.
See Q&A 7-8 for further details.
6. How to retrieve the time zone offset corresponding to a time zone region ?
=============================================================================
The new 9i TZ_OFFSET() SQL function returns the time zone offset displacement to the input time zone region.
SQL> SELECT TZ_OFFSET(‘Europe/London’) FROM DUAL;
TZ_OFFS
——-
+01:00
The returned offset depends on the date this statement is executed. For example, in the ‘US/Pacific’ time zone, it may return ‘-07:00’ or ‘-08:00’ whether daylight saving is in effect or not.
SQL> SELECT TZ_OFFSET(SESSIONTIMEZONE), TZ_OFFSET(DBTIMEZONE) FROM DUAL;
returns the time zone offset corresponding to the time zone set for session and database.
TZ_OFFS TZ_OFFS
——- ——-
+01:00 +00:00
7. How to use a larger set of defined time zones ?
==================================================
2 different time zone files contain for each zone the offset from UTC,the transition times for daylight savings and abbreviation :
– ORACLE_HOME/oracore/zoneinfo/timezone.dat
This is the default and contains the most commonly used time zones.
This is the smallest file.
– ORACLE_HOME/oracore/zoneinfo/timezlrg.dat
This file contains the larger set of defined time zones and can be used
if you require time zones that are not defined in the default time zone file.
To enable the use of this larger time zone data file :
1. Shutdown the database
2.1 On UNIX platforms :
set the ORA_TZFILE environment variable to the full pathname of
the location for the timezlrg.dat. By default, this should be
$ORACLE_HOME/oracore/zoneinfo/timezlrg.dat:
$ setenv ORA_TZFILE $ORACLE_HOME/oracore/zoneinfo/timezlrg.dat
2.2 On Windows systems :
You should add an ORA_TZFILE registry subkey for each of your Oracle Homes
with the Windows Registry Editor:
Start -> Run…
Type “regedit”, and click “ok”
Add or edit the following registry entry:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID\ORA_TZFILE
where ID is the unique number identifying the Oracle home.
Set the ORA_TZFILE to the full pathname of the location for the timezlrg.dat: By default, the value should be %ORACLE_HOME%\oracore\zoneinfo\timezlrg.dat
3. Restart the database
Once the larger timezlrg.dat is used, it must continue to be used unless the user is sure that none of the non-default zones are used for data that is stored in the database.
Also, all databases that share information should use the same time zone data file.
Be aware that you can neither create nore alter these timezone definition files !
8. Which timezone-set is currently used ?
=========================================
Beside checking the UNIX ORA_TZFILE parameter or the Windows registry subkey,you can easily check whether you are using the large or the default timezone file with the following query:
SQL> SELECT COUNT(*) FROM v$timezone_names;
If the default-smallest timezone region file is in use, it will return:
COUNT(*)
———-
616 (in 9.0.1.x and 9.2.x)
or
COUNT(*)
———-
1250 (in 9.0.1.x and 9.2.x)
if the largest file is in use.
9. Can customers rely on Oracle time zones ?
============================================
Timezone.dat and timezlrg.dat are based on information maintained by the U.S. Navy Observatory.

1. How to check the session time zone ?

=======================================

Answer

——

The new SESSIONTIMEZONE built-in SQL function returns the value of the current session’s time zone.

SQL> SELECT SESSIONTIMEZONE FROM DUAL;

SESSIONTIMEZONE

—————

+01:00

2. How to set the session time zone ?

=====================================

Answer

——

The session time zone can be set to:

– O/S local time zone

– Database time zone

– An absolute offset

– A named region

1. The first method consists to use one of the following ALTER SESSION SET TIME_ZONE statements:

SQL> ALTER SESSION SET TIME_ZONE = local;

SQL> ALTER SESSION SET TIME_ZONE = dbtimezone;

SQL> ALTER SESSION SET TIME_ZONE = ‘-05:00’;

SQL> ALTER SESSION SET TIME_ZONE = ‘Europe/London’;

2. As an alternative, the operating system environment variable ORA_SDTZ can also be used to set the session time zone:

ORA_SDTZ = ‘OS_TZ’ | ‘DB_TZ’ | ‘[+ | -] hh:mm’ | ‘timezone_region’

Example:

$ ORA_SDTZ=’OS_TZ’

$ export ORA_SDTZ

$ ORA_SDTZ=’-05:00′

$ export ORA_SDTZ

3. How to check the database time zone ?

========================================

Answer

——

The DBTIMEZONE SQL function returns the value of the database time zone.

SQL> SELECT DBTIMEZONE FROM DUAL;

DBTIMEZONE

————–

Europe/Lisbon

Note that the database timezone is also included in both database_properties and props$ views:

SQL> SELECT property_name, property_value

FROM database_properties

WHERE property_name=’DBTIMEZONE’;

and

SQL> SELECT name, value$

FROM props$

WHERE name=’DBTIMEZONE’;

Be aware that you should not rely on these views because in case of db time zone change, these views reflect the new db time zone too early: they should reflect

it only after database shutdown and restart.

4. How to set the database time zone ?

======================================

Answer

——

Note that the database time zone is only relevant for TIMESTAMP WITH LOCAL TIME ZONE columns.

1. At creation time

SQL> CREATE DATABASE …

SET TIME_ZONE=’Europe/London’;

If not specified with the CREATE DATABASE statement, the database time zone defaults to the server抯 O/S timezone offset.

2. After database creation, use the ALTER DATABASE SET TIME_ZONE statement and then shut down and restart the database.

SQL> ALTER DATABASE SET TIME_ZONE = ‘-05:00’;

SQL> ALTER DATABASE SET TIME_ZONE = ‘Europe/Lisbon’;

The change will not take effect until the database is bounced.

5. How to list the valid time zone regions ?

============================================

Answer

——

SQL> SELECT * FROM v$timezone_names;

TZNAME TZABBREV

—————————— ———-

Pacific/Tahiti LMT

Poland LMT

US/Pacific PST

Europe/Zurich CET

The result will depend on which timezone file is currently in use.

See Q&A 7-8 for further details.

6. How to retrieve the time zone offset corresponding to a time zone region ?

======================================================

The new 9i TZ_OFFSET() SQL function returns the time zone offset displacement to the input time zone region.

SQL> SELECT TZ_OFFSET(‘Europe/London’) FROM DUAL;

TZ_OFFS

——-

+01:00

The returned offset depends on the date this statement is executed. For example, in the ‘US/Pacific’ time zone, it may return ‘-07:00’ or ‘-08:00’ whether daylight saving is in effect or not.

SQL> SELECT TZ_OFFSET(SESSIONTIMEZONE), TZ_OFFSET(DBTIMEZONE) FROM DUAL;

returns the time zone offset corresponding to the time zone set for session and database.

TZ_OFFS TZ_OFFS

——- ——-

+01:00 +00:00

7. How to use a larger set of defined time zones ?

==================================================

2 different time zone files contain for each zone the offset from UTC,the transition times for daylight savings and abbreviation :

– ORACLE_HOME/oracore/zoneinfo/timezone.dat

This is the default and contains the most commonly used time zones.

This is the smallest file.

– ORACLE_HOME/oracore/zoneinfo/timezlrg.dat

This file contains the larger set of defined time zones and can be used

if you require time zones that are not defined in the default time zone file.

To enable the use of this larger time zone data file :

1. Shutdown the database

2.1 On UNIX platforms :

set the ORA_TZFILE environment variable to the full pathname of

the location for the timezlrg.dat. By default, this should be

$ORACLE_HOME/oracore/zoneinfo/timezlrg.dat:

$ setenv ORA_TZFILE $ORACLE_HOME/oracore/zoneinfo/timezlrg.dat

2.2 On Windows systems :

You should add an ORA_TZFILE registry subkey for each of your Oracle Homes

with the Windows Registry Editor:

Start -> Run…

Type “regedit”, and click “ok”

Add or edit the following registry entry:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID\ORA_TZFILE

where ID is the unique number identifying the Oracle home.

Set the ORA_TZFILE to the full pathname of the location for the timezlrg.dat: By default, the value should be %ORACLE_HOME%\oracore\zoneinfo\timezlrg.dat

3. Restart the database

Once the larger timezlrg.dat is used, it must continue to be used unless the user is sure that none of the non-default zones are used for data that is stored in the database.

Also, all databases that share information should use the same time zone data file.

Be aware that you can neither create nore alter these timezone definition files !

8. Which timezone-set is currently used ?

=========================================

Beside checking the UNIX ORA_TZFILE parameter or the Windows registry subkey,you can easily check whether you are using the large or the default timezone file with the following query:

SQL> SELECT COUNT(*) FROM v$timezone_names;

If the default-smallest timezone region file is in use, it will return:

COUNT(*)

———-

616 (in 9.0.1.x and 9.2.x)

or

COUNT(*)

———-

1250 (in 9.0.1.x and 9.2.x)

if the largest file is in use.

9. Can customers rely on Oracle time zones ?

============================================

Timezone.dat and timezlrg.dat are based on information maintained by the U.S. Navy Observatory.

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

今天下午,在一天RHEL as 5.4的PC server上,安装完Oracle软件之后,利用DBCA创建oracle 10g数据库的时候,报错:

触发ORA-00600[keltnfy-ldmInit][46]类似这样的错误。

以前,在红帽Linux系统上创建Oracle数据库向来都是轻车熟路的。今天,怎么回事儿?

不得已,Google,很快定位到问题的根源:

我在安装Oracle软件之后,创建数据库之前,修改了主机的/etc/hosts配置文件中的关于hostname的配置信息。

于是,修改/etc/hosts文件与/etc/sysconfig/network同步更新hostname。

然后,不管是执行Net Configuration Assistant配置网络,还是利用Database Configuration Assistant来建库,均无报错!

千万记得,在配置主机IP,或者修改主机名的时候,稍有不慎,往往会给Oracle数据库带来麻烦!

How to solve No termcap nor curses library found

Linux平台下,想在Oracle数据库的SQL*PLUS的命令行提示符下,利用键盘上的上下箭头,调出历史执行的SQL命令,可以考虑采用rlwrap这一开源工具

现,简单记录一下安装过程(Red Hat Enterprise Linux as 5.4环境)。以前在4版本的操作系统上安装时很顺利,就不再记录。

①解压并安装rlwrap工具:

[root@server1 ~]# tar -zxvf rlwrap-0.30.tar.gz

.......

.......

[root@server1 ~]# cd rlwrap-0.30 && ll

total 464

-rw-rw-r-- 1 hekan hekan  32266 Jan  8  2008 aclocal.m4

-rw-r--r-- 1 hekan hekan    638 Aug 15  2006 AUTHORS

-rw-r--r-- 1 hekan hekan   4740 Nov 10  2007 BUGS

-rw-r--r-- 1 hekan hekan    105 Aug 10  2003 ChangeLog

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 completions

-rw-rw-r-- 1 hekan hekan   5489 Jan  8  2008 config.h.in

-rwxr-xr-x 1 hekan hekan 217282 Jan  8  2008 configure

-rw-r--r-- 1 hekan hekan   9860 Jan  8  2008 configure.ac

-rw-r--r-- 1 hekan hekan  17992 Aug  8  2006 COPYING

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 distribution

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 doc

-rw-r--r-- 1 hekan hekan   1927 Nov 10  2007 INSTALL

-rw-r--r-- 1 hekan hekan    436 Nov 10  2007 Makefile.am

-rw-rw-r-- 1 hekan hekan  22987 Jan  8  2008 Makefile.in

-rw-r--r-- 1 hekan hekan  11187 Jan  3  2008 NEWS

-rw-r--r-- 1 hekan hekan   2745 Nov 10  2007 README

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 src

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 test

-rw-r--r-- 1 hekan hekan    480 Nov 10  2007 TODO

drwxrwxrwx 2 hekan hekan   4096 Jan  8  2008 tools

[root@server1 rlwrap-0.30]# ./configure

......

checking for tgetent... no

checking for tgetent in -lcurses... no

checking for tgetent in -lncurses... no

checking for tgetent in -ltermcap... no

configure: WARNING: No termcap nor curses library found

checking for readline in -lreadline... no

configure: error:

You need the GNU readline library(ftp://ftp.gnu.org/gnu/readline/ ) to build

this program!

[root@server1 rlwrap-0.30]#

报错!提示需要安装readline-devel-5.1-1.1.i386.rpm包。
② 安装readline-devel-5.1-1.1.i386.rpm 包:

[root@server1 ~]# rpm -ivh readline-devel-5.1-1.1.i386.rpm

warning: readline-devel-5.1-1.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

error: Failed dependencies:

libtermcap-devel is needed by readline-devel-5.1-1.1.i386

[root@server1 ~]#

又报错提示缺失libtermcap-devel包!

继续安装:

[root@server1 ~]# rpm -ivh libtermcap-devel-2.0.8-46.1.i386.rpm

warning: libtermcap-devel-2.0.8-46.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

Preparing...                ########################################### [100%]

1:libtermcap-devel       ########################################### [100%]

[root@server1 ~]# rpm -ivh readline-devel-5.1-1.1.i386.rpm

warning: readline-devel-5.1-1.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

Preparing...                ########################################### [100%]

1:readline-devel         ########################################### [100%]

[root@server1 ~]# cd rlwrap-0.30

[root@server1 rlwrap-0.30]# ./configure

checking build system type... i686-pc-linux-gnu

checking host system type... i686-pc-linux-gnu

checking for a BSD-compatible install... /usr/bin/install -c

checking whether build environment is sane... yes

checking for a thread-safe mkdir -p... /bin/mkdir -p

checking for gawk... gawk

checking whether make sets $(MAKE)... yes

............

............

configure: creating ./config.status

config.status: creating Makefile

config.status: creating doc/Makefile

config.status: creating src/Makefile

config.status: creating doc/rlwrap.man

config.status: creating distribution/rlwrap.spec

config.status: creating config.h

config.status: executing depfiles commands

Now do:

make (or gmake)  to build rlwrap

make check       for instructions how to test it

make install     to install it

[root@server1 rlwrap-0.30]#

③ 根据执行执行,make,make install:

[root@server1 rlwrap-0.30]# make

make  all-recursive

......

[root@server1 rlwrap-0.30]# make install

Making install in doc

......

make[2]: Leaving directory `/root/rlwrap-0.30'

make[1]: Leaving directory `/root/rlwrap-0.30'

[root@server1 rlwrap-0.30]#

④ 修改oracle 用户的配置文件,

[oracle@server1 ~]$ pwd

/home/oracle

[oracle@server1 ~]$ vi .bash_profile

在其中,添加类似配置信息:

alias sqlplus='rlwrap sqlplus /nolog'

⑤至此,oracle在SHELL提示符下,只需要执行sqlplus就可以进入SQL*PLUS的命令行提示符,并且可以利用键盘的上下箭头调出之前执行过的历史命令。

这是在RHEL 5.4版本的操作系统上安装时的简单记录,而之前没遇到过类似的问题,故简单记录之。

即先安装libtermcap-devel-2.0.8-46.1.i386.rpm

然后安装 readline-devel-5.1-1.1.i386.rpm

最后安装rlwrap工具包。


How to solve ORA-12560 Error ?

记得,前几日,在一台RHEL as 5.4 server上,用Windows下的Oracle客户端访问该服务器上的Oracle服务时,遭遇ORA-12560级别的错误。当时,很是费解: ①确认Windows客户端可以正常与该服务器正常通信; ②确认该服务器上的Oracle监听程序已经正确开启; ③采用SSH2协议通过22端口连接到该服务器上去的时候,可以正常操纵数据库; 犹豫之际,难到Linux服务器上的防火墙问题? 果不其然,就是Oracle所在服务器上开启防火墙,并且没有开放1521端口。 给出解决办法: ①直接编辑(以root用户执行)/etc/sysconfig/system-config-securitylevel 配置文件: 如下是已经编辑之后的该文件:

[oracle@JM ~]$ cat /etc/sysconfig/system-config-securitylevel
# Configuration file for system-config-securitylevel
–enabled
–port=1521:tcp
[oracle@JM ~]$
[oracle@JM ~]$ cat /etc/sysconfig/system-config-securitylevel

# Configuration file for system-config-securitylevel

--enabled

--port=1521:tcp

[oracle@JM ~]$

如果,想要禁用防火墙,需要将该文件中的–enabled改成–disabled.如上,是启用防火墙,但是放开1521端口号,允许的协议是TCP协议,需要注意的是,该文件中的格式问题,即以–开始。 ②进入Linux的图形界面,进行操作。图形操作较为简单,在此不再赘述。 最终,Windows客户端可以正常访问该Linux服务器上的Oracle数据库!

云南云南,彩云之南

有个美丽的传说:昆明有爱情!就为这一句,哥就“冲动”的搭乘K230次列车,由厦门始发去昆明寻找我的爱情之旅… 其实,自己心里早已清楚,根本不是为了那所谓的爱情!对于我这个已经就快要隐瞒年龄的男人来说,爱情只存在于心底,爱情只待留作回忆用,我还去寻觅什么呢?这次西行南下是为了沿途的风景,感受彩云之南的美

9月30号下午踏上西去的列车,就认识了两个华侨大学的大学生朋友,我们一路买牌斗地主、分享彼此的零食、谈天侃地、吹牛,仿佛找回了大学宿舍卧谈会的感觉。比较有意思的是,一哥们儿让下手中的扑克牌去抽烟的时候,发现了列车乘务员耍流氓的行为:把一特漂亮的女孩让到乘务席,其实,这也没什么的,就在那哥们儿过会儿去抽第二颗烟的时候,只听那女子说:“你别老是这样看人家嘛!”乘务员说:“我没看你,我在看时间,是不是到站了,我得开门去。”哥们回到座位上讲的时候,顿时牌兴全无,就连坐隔壁的几位打瞌睡的乘客都乐了。就在祖国生日的早上7点,那哥们在广州下火车的时候还跟我说:“兄弟啊,你可是到终点昆明站滴,你要保护好那个小女孩啊!”。我说:“你没发现那小女孩手上纹了朵玫瑰么?她有玫瑰护身,你就放心的去吧!”哈哈一乐,道别两位不知名的年轻朋友。我是一路看风景,吃泡面,睡觉,看随身携带的一本儿Linux书,倒是坐对面的,邻座的乘客是换了一拨儿又一拨儿。原来铁老大真的比较屌,就连乘务员也流氓…. 2号早上8点抵达春城昆明,一出站就觉得比较凉,昆明给人的第一印象还好,生活节奏不太快,污染也不怎么严重。无心留恋,就随团找旅行社,以单程120RMB谈妥随车去大理古城。9点发车,下午2点多的时候,结束了343公里的车程,到了大理,天高云淡,秋高气爽,一座经济不是特发达的城市,让人觉得特舒服!当地人都特别热情好客,在热心的指导下,乘坐8路公共汽车,沿洱海边线一路向北行驶,到达大理古城。放照片,手机拍的,Nokia 6120C,还算清晰。

大理古城
那一片天高云淡,那一片气爽秋意。据传,这就是大理国,天龙八部里,金老爷子有提到过。当时,正好赶上,空山新雨后,天气晚来秋的景象,一抹矫弱的斜阳透破薄薄的云层,叹一声:No Camera( ⊙ o ⊙ )啊!不然,山间的那抹斜阳破云的景象就可以定格永恒了!

斜阳破云
沿着古城古道可以一直走到山脚下,靠山越近也越发觉得秋意越浓了。就连呼吸一口新鲜空气的时候,肺都觉得清凉至极!是夜,告别大理古城,辗转上了一部小公共,奔赴心仪已久的蝴蝶泉。当晚,入住蝴蝶泉酒店,在酒店外的小镇上的一家白族特色风味菜馆里饱餐一顿。连日来的奔波,让我一觉睡到3号上午11点,也或许是这儿清新自然、环境优雅的缘故,都能让每一位远行至此的游人都能养精蓄锐感到无穷的自然之魅力!

在进入蝴蝶泉之前,就能看到,“蝴蝶圆梦”的字样,顿时整个人的兴致就上来了,慢慢一看,细细一读那石头上的小字,才明白了蝴蝶泉的来源,的确很美很美!相传:很久以前,山边有一汪潭水,特别深,叫做无底潭。山上住了一位美丽善良的白族姑娘,叫雯姑,她和一位叫做霞郎的年轻猎人相爱了。可是就在大理国的虞王偏偏这时候出现了,他派人把雯姑抢走了。霞郎只身一人连夜孤军奋战,从大理城中救出了雯姑,终因寡不敌众,他和雯姑被逼到无底潭边,无路可逃时,霞郎雯姑相抱着跃入无底潭。第二天,从潭中飞起一对大彩蝶,不一会儿,从远处飞来了非常多的小蝶,都围绕着这一对儿大彩蝶翩翩起舞,不肯离去。此后,人们为了纪念霞郎、雯姑的凄美爱情,就把无底潭改名为蝴蝶泉。

蝴蝶圆梦
进入之后,沿着郁郁葱葱的竹林小石路向上走去,就能看到一座镌有郭沫若手书”蝴蝶泉”大字的大理石牌坊,再继续前行,便能看到有一泓用大理石围砌的泉池,池底汩汩地涌流着几股清碧的泉水。泉水清冽甘美,捧起一两把泉水品尝。为传当地有谵曰:“喝点蝶泉水,够你万年醉”。

蝴蝶泉
穿过这幅大理石牌坊,踏着排出蝴蝶图案的碎石小路…..

蝴蝶
还有不同漂亮图案的蝴蝶,

butterfly
穿越这竹林小石路

石林小路
继续前行…..
来到蝴蝶泉边。《红楼梦》里有”任凭弱水三千,我只取一瓢饮”的宝玉之词,而我想说的是“蝴蝶泉美,我只带走一瓶”。买来农夫山泉一瓶,饮之,未尽,弃之,取其瓶盛取这甜美的蝴蝶泉….

泉水至清至澈,手机无法抓拍,反光太严重,只好作罢。蝴蝶泉下,有一鸳鸯池,拍的还算清晰,自然。

鸳鸯池

蝴蝶泉唯美,蝴蝶泉的爱情故事更美。那一刻,真的觉得好美好美,流连忘返。

不知觉间,已接近傍晚了,去丽江看玉龙雪山的念想也被远处高速公路上的“蜗牛车队”给断了,火车票又买不到,只好作罢。返回大理,却幸运地买到了一张3号晚上从大理回昆明的卧铺票。值得一提的是,大理站建立在高山之上,原本是西南边陲的终点站,也就是说,火车最远也就只能至此,无法前行,到达终点!随着云南省三颗高原明珠昆明、大理、丽江旅游业的发展,现在大理也有了直达丽江的火车了,火车通了以后,这三颗明珠就显得更为亲近、璀璨了。然而,大理站我只发现售票厅开设了两个售票窗口,还是挺有趣的,应该来说是我见过的海拔最高的规模最小的一个火车站了。

趁着发车前的几个小时,在大理城悠闲的走走,沿大理火车站直行至民族广场,附近找了一家叫做“挖色”的鱼馆,进去之后,才知道挖色是大理白族的一家具有几百年传统的小吃。果不其然,要了一条7两的鱼,红烧制作,独自美餐。服务员告诉我,这鱼就取自山后面的那一片碧绿洱海。

夜晚,登上高原明珠–大理城的标志性建筑。放眼望去,环顾全城,一览无余,那遥远的闪烁灯火,似乎就在同夜空中的星星交相辉映。徐徐而来的清风拂面,天高云淡的夜空。在那一刻,你会感到超然。偶尔看见对面山上的铁轨上的列车在缓缓前行,顿时,一声巨响的火车汽笛声穿透云层,送到耳边。那时那情那景真的会醉人!

回头,挥手告别明珠,钻进大理至昆明的列车卧铺车厢,倒头便睡。一早醒来的时候,已经是4号凌晨6点多了,到达昆明,立马出站,到昆明翠湖公园转了一圈,不过不太好玩儿,只有冬春的时候,才可以见到红嘴鸥来觅食。迅速闪了,抱着巨大的热情,花掉身上最后的100块买了门票,钻进昆明世博园,那真的叫一个失望,花草树木,全部全部都是假的。听说全部逛完世博园得2-3个小时,我一个小时都没用完,就不玩儿了。其间,还包括在园内吃了一份10元的失望米线,买了一包13元的假阿诗玛,靠!直接到火车站候车,打道回府。

嘿,在回厦门的车山,觉得昆明之行,没看到大石林风景,没去成丽江玉龙雪山觉得是两大遗憾。失误就是去了昆明的翠湖公园和世博园,尤其是去世博园,对我(不太喜爱园林建筑)而言绝对是一个大大的失误。就在火车即将驶抵广州的时候,依然觉得自己未尽兴,遂于羊城下车了,买了张广州去深圳的D车,5号晚上九点的时候,已经准时出现在深圳了。车站,见了时隔4年未见的大学挚友。6号在深圳梅林简单休息了一下,梅林水库大坝上走了走。随即,由深圳返回广州,继续踏上那趟由昆明发往厦门的车….于7号上午出现在了暂别8天的厦门岛!

就这样,非常充实的一个国庆假期,特有意义的一次西南之旅!

只是,昆明有爱情,那是别人的!

厦门-昆明的2K多公里的火车行程:旅途线路图!

从一个男人关注的事情上,可以看出他的修养和抱负

整天关注娱乐版的男人,你指望它有什么成就么?整天玩游戏的男人,整体打麻将的男人,你 指望它有什么成就么?

一、拥有自信和风度

男人到了二十几岁后,就要开始学 着用心去经营自己了,它体现在自己的思想与涵养上。自信是一个男人最重要的品质,自信的男人就你像一只在暴风雨中战斗的海鸥。海鸥所要说的只有一句话“让 暴风雨来的再猛烈些吧”,只因为它无所畏惧。一个自信的男人,总是能够感染别人,无论这些人是朋友还是敌人。要使别人对你有信心,就必须要先对自己充满信 心。自信的男人可以战胜一切困难。
一个有风度的男人就像一片大海,不拒点滴,又包容江河。有风度使男人得到更多的青睐,不争眼前才能够放眼世 界,给予别人才能够受益无穷。正所谓“宰相肚里能撑船”,一个心如大海的男人,肚中不知能撑多少船呀!风度偏偏让男人看上去潇洒万千。

二、养成看书和写作的习惯

男人到了二十几岁后,就开始要走入社会了,在与别人交往的过程 中,谈吐与修养是最能征服别人的。一个有知识的男人一定是常看书的,一个有智慧的男人一定是常写作的。无论自己多忙,都要抽出时间来看看书,写写文章。因 为这样做能够改变一个男人的思想与行为。一个男人要改变自己思想首先要做的就是读一本好书,读一本书就像交了一个好朋友,他能够帮助你走好自己的路。读书 的生活是最丰富多彩的,写作的时光是最能启迪智慧的。
喜欢看书和写作的男人,一定能够培养出一个好的心态。因为知识与智慧的海洋是无边无际的, 但喜欢看书和写作的男人却能做到执着追求。追求是一个男人的思想,也是一个男人的行动,永不放弃地追求,无时不刻的在激励的男人去战斗。在这种战斗中,使 一个男人能够经历风雨的洗礼,成长为一棵参天大树。读书使男人变得的冷静,写作使男人变得成熟。

三、要试着发现 生活里的真、善、美

男人到了二十几岁后,就要学会如何去面对生活。什么是“真”,现在的男人越来越不懂,那是因为 现在的男人都很浮躁,他们不懂什么才是“真心”地去生活。“真”,就是对自己实事求是,不要骗自己,也不要骗别人。“真”,就是诚实做人,诚实做事,诚实 的男人最可爱。“善”,自然是善良的意思了。善待别人,就是在善待自己的生活。“善”其实就在我们每一个人的身边,不要为难别人,不要挖苦别人,不要侮辱 别人,就是善良的行为。有时你的一点点善意就能结出一个善果,使你的生活因此而变得幸福。
哲人说,“生活中本不缺少美,缺少的是发现美的眼 睛”。是的,生活也的确是如此。不要总在惦记着自己的不幸,这样做只能使你生活的更加不幸。你觉得“不幸”是因为你无法乐观的面对生活,生活总是充满着希 望的。只要你常常抬抬头,看看阳光,你就能感受到温暖。在温暖中乐观地去追美好的人生,你自然能够发现美。

四、 与有思想的人交朋友

男人到了二十几岁后,就要开始有目的性的去选择朋友了。社会中的人脉关系是非常重要的,你的朋 友圈子将对你的人生起着很大的影响。男人要广交朋友,多交诤友,不交损友。所谓诤友就是那些对你有帮助的朋友,而这些人往往自身也很优秀。多交诤友对一个 人的生活、工作都是非常有益的。但真正的诤友也不易结交,因为这种朋友需要你付出极大的真诚,发自内心的真诚。
有思想的朋友,他很清楚你有没有 把他当作朋友。如果你只是在利用他,他在心中是不会把你当作朋友来看待的。交朋友有时并没有什么目的性,你只是觉得这个人很有思想,值得你与之相交。但往 往就是这些有思想的朋友,在你最困难的时候向你伸出他的手。朋友,是一个男人生命中最重要的元素的之一。一个男人要想使自己像一人真正的男人那样活着,就 一定要广交朋友,多交诤友。

五、必须改掉自身的不良习惯

男人到了二十几 岁后,就必须要改掉自身的不良习惯。不良的习惯是养成的,良好的习惯也是养成。培养自己拥有良好的习惯,就是在改掉自身的不良习惯。如果一个男人到了二十 几岁后,身上还有这样那样的不良习惯,那就是一件非常糟糕的事情了。这些不良的习惯会阻碍你人生的发展,生活会因此而失去不少光彩,事业也会因此难以取得 更大的成功。

如果你到现在还爱睡懒觉,那么清晨的第一抹阳光永远也不会照到你的笑脸上。如果你到现在还总是拖拖拉拉 的,那么你将永远也无法站在冠军的位置上。如果你到现在还不会主动的去学习和工作,那么你的前途只能是一片暗淡无光的灰色。我相信没有哪一个男人想要灰色 的人生,所有的男人都期望自己能有一个绚丽多彩的人生。所以为了使自己的人生绚丽多彩,男人到了二十几岁后,就必须要改掉自身的不良习惯。

六、学会忍耐与宽容

男人到了二十几岁后,就要学会忍耐与宽容。在社会中常有许多你无法 接受的事情,但这些事情你又不得不接受时,这就需要你的忍耐。忍耐别人其实也是在宽容别人,一个能够宽容别人的男人会显得很大度。成功的男人往往也是一个 能够忍辱负重的男人。耐得住寂寞的男人从不甘寂寞,男人的忍耐是为了更好的爆发。
对那些说我们是傻瓜的人,说一句“我就是傻瓜”,使他们不知所 措吧!对于那些无故指责我们的人,不要与他们争论,因为这样只会使自己变的愤怒。与其去伤害别人,不如去宽容别人,宽容是治疗他人伤口最好的灵丹圣药。

七、保持良好的心态,重视自己的身体

男人到了二十几岁后,就要学会调节自 己的心态,重视自己的身体。身体是革命的本钱,心态是验钞机。男人要想获取更多的财富就要拥有一副强健的体魄,男人要想长久的做首富就要拥有一种积极乐观 的心态。注意饮食,经常锻练,充足的睡眼,是健康身体的保证。不要患得患失,勤奋拼搏,让心态决定一切。
你可以不用天天去晨跑,其实那也不会占 用你多长的时间,需要的只是恒心和毅力。但你一定要时常去运动一下你的身体,散步是一种不错的选择,这样做会使你充满力量。你在冬天可以不用冷水洗澡,其 实那也没有什么大不了的,因为我也曾坚持过一个冬天。但你在冬天一定要经常用冷水洗洗脸,这样做不仅可以防止感冒,还能保持一个清醒的头脑。你可以失败, 但你永远要保持一种求胜的心态,战胜自己你就没有敌人。

八、时刻保持你的微笑,让礼貌成为你的名片

男人到了二十几岁后,要时刻保持你的微笑。笑脸迎人,说明你是一个善良的人,所有的人都愿意与善良的人打交道。不要把苦闷写在 你的脸上,这样只会使别人远离你。你是什么样的人,别人通过你是否微笑着与他打招呼来判断。而这种判断对你在人家心中的印象起着很重要的作用。
人 们常说“细节决定成败”,而这细节往往就反应在你是不是一个有礼貌的人。有礼貌的人,知道关心别人。别人也会因为你的礼貌与关心,而给你走向成功的机会。 男人的名片是微笑与礼貌,它是男人成就事业的通行证。

九、追求一个自己真正爱的女人,你一辈子也不会后悔

男人到了二十几岁后,慢慢地就会极渴望爱情。这是非常正常的事情,千万不压抑自己这种发自内心的情感。一个男人最傻最可爱的 时候就是当他爱上了一个女人的时候。当你爱上一个女人却不知道她会不会爱上你的时候,你一定要选择一个恰当的时间向他表白。至于她是选择接受还选择拒绝那 就要看你们之间的缘份和你的努力了。男人一定要明白,女人最渴望的一定是一个深爱着她的男人。
爱情这种事不能强求,男人一定要明白。千万不要因 为得不到你的爱情就让你的友情轻易的失去,能与一个自己曾经爱过的女人成为朋友是一件不可多得的好事。爱情之所以神圣不可侵犯,是因为它是人最心甘情愿的 选择,它体现的人与人之间的尊重与信任。所以男人一定要尊重你爱着的那个女人的选择,相信她的选择是为了她自己的幸福而做出的决定。只要你曾经追求一个自 己真正爱的女人,那么你一辈子也不会后悔。

十、为了自己的事业付出一切

男人到了二十几岁后,一定要为了自己的事业去努力拼搏。男人最重要的就是事业,没有事业的男人不能算作真正的男人。男人的事业不定要轰轰烈烈,但一定要有 所成就,能使自己感到骄傲和自豪。一个事业心强的男人,也是一个求胜心与责任心同样强的男人。求胜心强的男人,从不甘平庸。责任心强的男人,从不惧困难。 男人因自己成功的事业而变得高大,从而获得别人的尊重和信任。
作为一个男人,就要为了自己的事业付出一切。要想成功你必须付出,而付出就意味你 要失去一些东西。如果你不想为事业付出任何代价,那么你只能失去更多的东西,而且最后还一无所获。

十一、爱情跟事业是可以共同 拥有的

男人到了二十几岁后,就应该努力做到爱情跟事业的双丰收。人们常说一个男人如果选择了爱情就会失去事业,如 果选择了事业就得不到爱情。我却偏偏不这样认为,我反而觉得爱情越甜蜜的男人,事业越成功。其实爱情和事业本就是两回事,爱得轰轰烈烈的男人,一点也不会 妨碍其获得成功的事业。一个有爱情滋润的男人一定比一个不知爱情是什么味道的男人更成熟,更有魅力,更有干一番事业的决心。

二十几岁的男人们,千万不要相信那些偏激的人所说的话。就像人们常说的“婚姻是爱情的坟墓”,这种说法太偏激了。婚姻与爱情的区别只是多了一些“柴米油 盐”,可以说婚姻才是一种完整的爱情,之前的爱情只是处在一种恋爱的阶段。也只有通过婚姻才能使男人和女人彻底的认识什么是爱情。爱情就是相互理解,相互 鼓励,相互支持。在生活上彼此帮助,在事业上彼此帮助,让爱情跟事业可以双丰收。

十二、一定要努力比女人做的更 好

男人到了二十几岁后,在任何事上一定要努力比女人做的更好。即使在一些不可能比女人做的更好的事情上,也要努力 做的和女人一样好。在这里这不是想说男人天生就应该比女人强,而是要说男人天生就应该比女人做的更好。因为只要女人努力了,就很容易超越男人,所以男人应 该知道努力比女人做的更好是天经地义的事情。在如今的社会,女人的地位越来越高了,女人第一次有了选择男人的权力。所以如果作为男人的你,不能比女人做的 更好,那么女人凭什么选择你呢?
女人们常说“女子能顶半边天”,而且现在的女人在本属于男人的某些领域里比男人做的更出色。所以男人不仅要在属 于自己的领域里做的非常出色,而且也要能在本属于女人的领域里做得一样的出色。

十三、努力帮自己的妻子实现她的 梦想

男人到了二十几岁后,如果你已经结婚了,那就请你一定要努力帮自己的妻子实现她的梦想。人们学说“男人靠征服 世界来征服女人,女人靠征服男人来征服世界”,所以一个已经征服了你的女人,你一定要努力帮她征服世界。女人的梦想从不会因为和一个男人生活在一起了而消 失掉,只会因此而变得更加强烈。女人这种强烈的愿望和梦想也许不会表现在你的面前,但你的心中一定要明白。
妻子是一个男人生命的核心,妻子生活 得是否幸福,男人一定要关心。不要以为妻子取回家,就是来为你服务的。每一个男人的妻子都会关心自己的丈夫,每一个男人也要学会关心自己的妻子。而最关心 妻子的事,莫过于关心她的梦想是什么,怎么做才能帮妻子实现她的梦想。

十四、学会勇敢一些,去承担起自己肩上的 责任

男人到了二十几岁后,要学会勇敢一些,挻起自己的肩膀去承担起属于自己的那份义不容辞的责任。孝顺父母是一个 男人责任,疼爱妻儿是一个男人的责任,成就事业也是一个男人的责任。男人的责任不外乎家庭和事业。这些责任的确比较沉重,但作为一个男人你必须挻起自己的 肩膀去承担。没有什么原因,只因为你是一个男人。
男人一样有权力哭泣,但却没有权力哭出声音来。男人一样有权力流泪,但却没有权力在父母妻 儿面前流泪。男人一样有权力放弃,但却没有权力放弃家庭与事业上的责任。作为一个男人,你别无选择,你只能选择承担,用你的肩膀去承担。

十五、永远不要放弃自己,相信自己一定能行

男人到了二十几岁后,就必须做到永远不要放弃 自己。别人之所以放弃你,那就因为你已经先放弃了自己。相信只要你不放弃自己,没有哪个人会放弃你或者说没有哪个人能放弃你。相信自己是一个男人战胜一切 的力量之源,不相信自己的男人没有成功的理由,因为他的一脚已经跨到了失败的坟墓中。
有一句广告语,这样说“相信自己,力量在心中”。还有一句 广告语,这样说“我能”。是的,我想,我也相信只要每一个男人能够做到相信自己,你就一定能行。

转帖一封邮件:[Unix-Center.Net] 会员通讯 — 2010.09.07

发件人        Unix-Center.Net <bbs@unix-center.net>
发送至        member@unix-center.net
日期        2010年9月7日 下午12:12
主题        [Unix-Center.Net] 会员通讯 — 2010.09.07
邮送域        unix-center.net
尊敬的Unix-Center.Net用户

感谢您注册成为Unix-Center.Net的一员。我们一直在努力为各位注册会员提供更好的Unix/Linux学习与体验环境。此会员通讯的目的就 是向各位介绍我们最近取得的一些新进展,希望能够得到各位更进一步的支持。

自2007年2 月Unix-Center.Net正式开通以来,我们已经不间断运行了三年半的时间。在这里我们需要向中国最大的开发者社区CSDN表示衷心的感谢。 CSDN在本站遇到财务困难的时候为本站支付了2009年4 月到2010年4 月的服务器托管费用,又于2010年4 月免费接纳本站所有服务器迁入CSDN的机房。正是由于CSDN的大力支持,本站才能够在坚持公益性和非盈利性的前提下继续为各位用户提供服务。在过去六 个月中,我们与CSDN一道与数家公司展开讨论,希望能够争取他们对Unix-Center.Net的支持。遗憾的是,大部分公司并不认可本站所坚持的公 益性和非盈利性原则,因此相关讨论并未取得实质性进展。

在过去18个月中,一共有243名用户通过向本站捐赠100元的方式成为本站的标准用户。为了表示我们对这些用户的感谢,我们为其提供了1 G的存储空间,MySQL数据库访问权限,以及基于ApacheMySQLPHPWeb 应用开发环境。

自从本人离开Sun 公司之后,很多朋友都很关心我的去向和近况。在这里我统一做一个说明。

首先,本人没有离开IT这个行业。我于09年底移居海南后,一直在思考如何利用信息技术来为农村做一点事情。经过接近一年时间的调研,我注意到生产技术低 下或者缺乏生产资料已经不再是阻碍农村发展的第一因素。与此相反,由于生产与销售环节严重脱钩,导致农户在风调雨顺的情况下还要亏本,严重打击了农户的生 产积极性。与此同时,仅仅是几十公里甚至是十几公里之外的城市,农产品价格高居不下,城市居民纷纷抱怨买不起菜吃不起饭。如果抛开农产品购销当中的仓储、 运输等因素,这是一个典型的信息不对称问题。让农户了解市场行情,让商户了解生产情况,虽然不能够彻底解决这个问题,但是能够在一定程度上促使其往正面的 方向发展。因此,我于最近接受海口市科学技术工业信息化局的邀请,与几位志同道合的朋友一起着手组建一家公司来开发与运营一个农产品信息类网站:电子农务 网。

电子农务网上线之后的第一件大事,是面向全国开展一次博客大赛,广泛征集关于农民、农村、农业等领域的信息、观点、评论、建议。目前我们已经争取到了海南 马自达公司提供的两辆海南马自达海福星轿车、金鹿集团提供的拖拉机四台、以及某计算机公司提供的笔记本电脑若干台作为大赛奖品。就我所知,这些年来国内各 种各样的博客大赛层出不穷,能够列出的如此级别奖品的,似乎还没有见过。在这里我郑重邀请各位朋友参与到此次博客大赛中来,为农村的发展出谋划策,说不准 就能够赢得一辆轿车或者是拖拉机开回家。另外如果各位朋友有做媒体的或者是做网站的,欢迎转载相关信息为我们扩大一下影响力,或者是派出记者来挖掘一下这 个事件的新闻价值。

各位可能觉得我们做IT的跟农村没什么关系,其实未必。且不说我们之中相当一部分人原本就来自农村,我们每天所消费的粮食、蔬菜、肉蛋、水果,无一不与农 村息息相关。耕地红线能不能保住,会直接影响农产品的价格,可以说是间接动了我们的钱包。不过这还不是最严重的,要是滥用激素和农药残留的问题管不好,简 直就是直接要我们的老命了。所以我希望各位都过来参加这个博客大赛,写一写记忆不远处的青山绿水,红桃黄橙,稻花的香,水牛的憨,父辈的汗水,还有村头小 妹鲜艳的笑脸。是不是真的能够赢得轿车或者是拖拉机,已经无关紧要了。重要的是,关心农村问题就是关心我们自己的钱包和健康。

广告做的好,不如海马轿车好。在这里给各位提供一下此次博客大赛的链接,很多细节尚在讨论当中,不过已经是呼之欲出了。

http://www.dznw.net/home/space.p … do=blog&id=2206

顺便说一声,如果你有淘汰下来的电脑,并且希望让它们有个地方发挥余热,请跟我联系。我能够把它们转送给那些没有电脑,但是又非常希望拥有一台电脑的农 民。如果你愿意的话,麻烦您问一问您身边的人有没有淘汰下来的电脑。或者,您还可以帮我问一问你所在公司的IT部门,是否愿意将公司淘汰下来的电脑赠送给 农民使用。只要是一台还能够运行Windows 2000的电脑,慢一点点没有关系,硬盘小点没有关系,没有显示器也没有关系,我们会设法解决。另外,也欢迎各位淘汰下来的数码相机。

说起农民,你可能觉得他们没文化,觉得他们根本不可能有使用电脑这样的需求。你所不知道的是,有很多农民,他们通过自学知道了如何操作电脑,也学会了如何 通过搜索来掌握最新的供求行情和价格信息,他们当中甚至有人开设了自己的博客。到我的电子农务网去看看,你就能发现,农村的信息化,正在悄悄地改变农村的 面貌。

如果您愿意向农民捐赠您淘汰下来的电脑,请将其发送到如下地址。如果您无力支付其运费,可以使用快递/物流公司的“运费到付\”业务,我们愿意支付由此发生 的快递/物流费用。

海南省海口市琼山区龙昆南路88号禧龙酒店902 室
电子农务运营中心
蒋清野  收

电话:15008959686
邮编:571100

最后,请允许我

感谢您花时间读完这封邮件。如果您认为它不是垃圾邮件的话,我们鼓励您将其转发到您常去的网站和社区。

感谢您对Unix-Center.Net的关心和支持。

感谢您对农村、农民和农业的支持。欢迎您注册成为电子农务网(http://www.dznw.net/home/)的用户,并且将qyjohn加为您的 好友。


蒋清野
Unix-Center.Net
2010年9 月7 日

SQL:Group Functions

不可否认SQL语句的功能非常强大,但是,在大多数的时候,我们还是会在使用SQL语句的过程中,调用数据库内嵌的函数,通过函数来强化我们SQL语句的功能,以达到我们预期的目的,尤其是在满足一些应用程序对统计报表的需求情况下。

首先,简单说说单行函数(Single-Row Functions)。在Oracle数据库里,单行函数大概可以细分为Character functionNumber functionDate function,Conversion function,General function。其实,Oracle数据库支持的函数足够多了,在这里不一一列举具体用法和使用规则了,我们应该清晰的一个概念就是:单行函数可以多次嵌套调用。

另外,大概说一下分组函数(Group Functions)。所谓分组函数跟单行函数的区别就是:单行函数是对数据源中的记录逐条分别作为函数的输入参数来处理,最终得到函数处理的结果。而分组函数就是把数据源中的记录按照某种特定的需求以分组的形式来作为函数的输入参数处理,最终得到处理的结果自然就是以组的形式区分开来。

来简单看一下,使用分组函数的语法规则:

SELECT    column, group_function(column)
FROM      table
[WHERE    condition]
[GROUP BY group_by_expression]
[ORDER BY column];

我们在使用分组函数的时候需要注意的几个地方就是:

①All columns in the SELECT list that are not in group functions must be in the GROUP BY clause.凡是出现在查询列表中的没有应用分组函数的字段必须要出现在GROUP BY子句中,否则报错。

②The GROUP BY column does not have to be in the SELECT list.反之,出现在GROUP BY从句中的字段并非一定要出现在查询列表中。并且,GROUP BY从句中可以出现排序列表,即可以对多列进行分组排序。

③You cannot use the WHERE clause to restrict groups.You cannot use group functions in the WHERE clause.You use the HAVING clause to restrict groups.我们不能在WHERE从句中对分组做限制,也不能在WHERE从句使用组函数,而应该通过在HAVING子句中使用分组函数来实现这一目的。

④ORDER BY从句同样可以使用分组函数,而且该分组函数同查询列表中使用的分组函数以及HAVING从句中的三类分组函数,均可以不同。

⑤分组函数只能嵌套调用一次。

10g utilities:How to use LogMiner II

在上一篇日志里:我们了解了怎么使用LogMiner工具的第一种使用方法。接着,我们来学习下LogMiner工具的第二种使用方式:
在使用LogMiner之前,我们要确定相关的参数,也就是简单配置一下LogMiner工具使用的“环境”
①配置一个用于将来存放LogMiner分析日志文件(online redo logs,archived logs)的结果路径和文件,这个路径和文件是映射在文件系统上的。这个文件可以认为是一个字典文件,但是这个字典文件跟数据库的数据字典文件完全是两码子事儿。对应的初始化参数是utl_file_dir,默认情况下,该参数没有配置。
②在调用LogMiner工具之前,在文件系统上生成这个字典文件。
③接下来调用LogMiner工具的方法跟第一种方法就完全类似了。
接下来,进入正式调用流程:
I 首先:以SYS用户登录数据库,检查utl_file_dir初始化参数是否设置,或者设置是否正确,捎带看下数据库版本,以及操作系统版本:

SQL> show user;
USER is "SYS"
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE    10.2.0.1.0      Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> !uname -a
Linux Oracle10g 2.6.9-55.ELsmp #1 SMP Wed May 2 14:28:44 EDT 2007 i686 i686 i386 GNU/Linux

确认初始化参数文件,utl_file_dir,并修改之,重启数据库使之生效,因为该参数不能直接动态修改:

SQL> show parameter utl_file_dir
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string
SQL> !mkdir -p /u01/app/logmnr
SQL> alter system set utl_file_dir='/u01/app/logmnr/' scope=spfile;
System altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area  343932928 bytes
Fixed Size                  1219304 bytes
Variable Size             125830424 bytes
Database Buffers          209715200 bytes
Redo Buffers                7168000 bytes
Database mounted.
Database opened.
SQL> show parameter utl_file_dir
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir                         string      /u01/app/logmnr/

II 好了,前期准备工作就绪。其次,开始调用dbms_logmnr_d函数包在操作系统生生成”字典文件”:

SQL> exec dbms_logmnr_d.build(dictionary_location=>'/u01/app/logmnr/',
dictionary_filename=>'dictionary.ora');
PL/SQL procedure successfully completed.
SQL>

至此,可以到操作系统上对应的路径上去瞅两眼,验证一下:

SQL> !
[oracle@Oracle10g ~]$ cd /u01/app/logmnr/ && ll
total 23724
-rw-r--r--  1 oracle oinstall 24257361 May 24 23:52 dictionary.ora
[oracle@Oracle10g logmnr]$

看到,达到预期目的。
III 然后,查看数据库当前日志文件情况,并开始调用LogMiner工具:

[oracle@Oracle10g logmnr]$ exit
exit
SQL> set linesize 120
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1          8   52428800          1 YES INACTIVE                738316 24-MAY-10
         2          1          7   52428800          1 YES INACTIVE                718138 24-MAY-10
         3          1          9   52428800          1 NO  CURRENT                 758625 24-MAY-10
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1          8   52428800          1 YES INACTIVE                738316 24-MAY-10
         2          1         10   52428800          1 NO  CURRENT                 759039 24-MAY-10
         3          1          9   52428800          1 YES ACTIVE                  758625 24-MAY-10
SQL> col member for a50
SQL> select * from v$logfile;
    GROUP# STATUS  TYPE    MEMBER                                             IS_
---------- ------- ------- -------------------------------------------------- ---
         3         ONLINE  /u01/app/oradata/helen/redo03.log                  NO
         2         ONLINE  /u01/app/oradata/helen/redo02.log                  NO
         1 STALE   ONLINE  /u01/app/oradata/helen/redo01.log                  NO
SQL>

上述操作中,发现当前日志组为第三组,强制日志切换到第二组,并验证日志成员为/u01/app/oradata/helen/redo02.log,这个信息时尤为重要的,因为在下面的操作中,我们要在数据库里另起一个会话,做DML操作,数据库会把日志记录到该日志文件里。这些信息供我们将来分析用。
IV 新开会话,做DML操作,产生日志信息,添加当前日志文件,并开始调用LogMiner分析日志文件:
新开回话:

SQL> show user;
USER is "HR"
SQL> select * from test2;
        ID
----------
         1
         2
SQL> delete from test2 where id=2;
1 row deleted.
SQL> insert into test2 values(3);
1 row created.
SQL>

返回原来的会话,执行下述操作:

SQL> exec dbms_logmnr.add_logfile
(logfilename=>'/u01/app/oradata/helen/redo02.log',
options=>dbms_logmnr.removefile);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.add_logfile
(logfilename=>'/u01/app/oradata/helen/redo02.log',
options=>dbms_logmnr.new);
PL/SQL procedure successfully completed.
SQL> exec dbms_logmnr.start_logmnr
(dictfilename=>'/u01/app/logmnr/dictionary.ora');
PL/SQL procedure successfully completed.
SQL> set linesize 160
SQL> col sql_redo for a40
SQL> col sql_undo for a40
SQL> col operation for a10
SQL> col table_name for a5
SQL> select table_name,sql_redo,sql_undo,operation from v$logmnr_contents where username='HR';

TABLE SQL_REDO                                 SQL_UNDO                                 OPERATION
----- ---------------------------------------- ---------------------------------------- ----------
      set transaction read write;                                                       START
TEST2 delete from "HR"."TEST2" where "ID" = '2 insert into "HR"."TEST2"("ID") values (' DELETE
      ' and ROWID = 'AAANB9AAEAAAAGHAAB';      2');

TEST2 insert into "HR"."TEST2"("ID") values (' delete from "HR"."TEST2" where "ID" = '3 INSERT
      3');                                     ' and ROWID = 'AAANB9AAEAAAAGFAAA';

SQL>

至此,达到最终目的。

How to use order by clause ?

在我们写SQL语句的时候,会经常用到order by子句来对查询结果进行排序。在这里对order by子句的使用,作一个简单的总结:

1 SQL语句中,order by从句永远并且一定是放在所有从句的最后位置处,也就是说,一个复杂的SQL语句中,可能会包含诸如group by子句,Where 子句等等。但是,不管有多少个从句跟在FROM关键字后面,order by从句一定是出现在所有子句的最后端,因为order by是对所有查询结果集的排序。如:

SQL> SHOW USER;
USER is "HR"
SQL> SELECT employee_id,last_name
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY employee_id
  5  ;
EMPLOYEE_ID LAST_NAME
----------- -------------------------
        201 Hartstein
        202 Fay
        203 Mavris
        204 Baer
        205 Higgins
        206 Gietz
6 rows selected.
SQL>

可以看到:ORDER BY 子句是出现在整个SQL语句的最后位置处。否则,ORDER BY子句不放在该SQL语句的最后,就会报错!
2  在oracle 数据库中,order by从句默认是升序(ASCend)排序的,如果想做降序排序,那么就需要显示声明关键字(DESCend).在升序排序的时候,Oracle对于NULL值的处理是放在最后的。因为Oracle认为NULL值是一个未知的,未分配的值,作为无穷大 对待,自然升序的时候就放在最后,反之,降序排列时就放在首位。如:

SQL> SELECT employee_id,last_name,manager_id
  2  FROM employees
  3  ORDER BY manager_id DESC
  4  ;
EMPLOYEE_ID LAST_NAME                 MANAGER_ID
----------- ------------------------- ----------
        100 King
        206 Gietz                            205
        202 Fay                              201
......

可以验证:查询结果集中,员工编号为100的员工是BOSS,没有manager,即其MANAGER_ID为NULL,降序排列的时候,自然会作为第一条返回记录出现在整个结果集中。
3 order by可以用于查询列表中的字段名,也可用于字段别名、表达式、字段名在列表中出现的顺序,如:

SQL> SELECT employee_id,last_name,salary*12 "Annual_Salary"
  2  FROM employees
  3  where employee_id>200
  4  order by salary*12
  5  ;
EMPLOYEE_ID LAST_NAME                 Annual_Salary
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.

上例是按表达式排序,看一个按字段别名排序的例子:

SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY Annual_Salary
  5  ;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.
SQL>

注:在该示例SQL语句中,如果salary*12的别名Annual_Salary,加了双引号”Annual_Salary”,那么按别名排序的时候也必须带有双引号:
order by “Annual_Salary”
接下来,再看一个按字段在查询列表中出现的先后顺序排列的例子:

SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY 3;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        202 Fay                               72000
        203 Mavris                            78000
        206 Gietz                             99600
        204 Baer                             120000
        205 Higgins                          144000
        201 Hartstein                        156000
6 rows selected.
SQL>

4 order by 子句甚至可以是对那些没有出现在查询列表中出现的字段进行排序:ORDER BY子句只对查询结果进行排序,而不关心按排序的字段是否出现在查询列表中。如:

SQL> SELECT last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE salary*12>150000
  4  ORDER BY employee_id
  5  ;
LAST_NAME                 ANNUAL_SALARY
------------------------- -------------
King                             288000
Kochhar                          204000
De Haan                          204000
Russell                          168000
Partners                         162000
Hartstein                        156000
6 rows selected.
SQL>
----------------------------------------------
SQL> SELECT employee_id,last_name,salary*12 Annual_Salary
  2  FROM employees
  3  WHERE salary*12>150000
  4  ORDER BY employee_id
  5  ;
EMPLOYEE_ID LAST_NAME                 ANNUAL_SALARY
----------- ------------------------- -------------
        100 King                             288000
        101 Kochhar                          204000
        102 De Haan                          204000
        145 Russell                          168000
        146 Partners                         162000
        201 Hartstein                        156000
6 rows selected.
SQL>

可以验证,其实,这两个SQL语句的排序效果是同样的!
5 ORDER BY子句中,同样支持对多个字段排序,如果需要对不同字段进行排序的方式(升序或者降序)不同,则需要显示声明。如:

SQL> SELECT employee_id,manager_id,department_id
  2  FROM employees
  3  WHERE employee_id>200
  4  ORDER BY manager_id ASC,department_id DESC
  5  ;
EMPLOYEE_ID MANAGER_ID DEPARTMENT_ID
----------- ---------- -------------
        201        100            20
        205        101           110
        204        101            70
        203        101            40
        202        201            20
        206        205           110
6 rows selected.
SQL>

ORDER BY 子句的用法很灵活,我们可以根据不同的应用场景,写出满足不同需求的排序SQL语句。