吉日的HANDBOOK
===========================================================
===========================================================

看看下面两条,功能是随机得到数据表中的10条记录,效率可能是个问题,但是已经很方便了。

mysql: select * from tablename order by rand() limit 10
sqlserver: select top 10 * from tablename order by NEWID()


okone96 发表于:2007.10.29 12:14 ::分类: ( 数据库 ) ::阅读:(599次) :: 评论 (3)
===========================================================
===========================================================

mysql 创建 数据库时指定编码很重要,很多开发者都使用了默认编码,但是我使用的经验来看,制定数据库的编码可以很大程度上避免倒入导出带来的乱码问题。

我们遵循的标准是,数据库,表,字段和页面或文本的编码要统一起来
很多mysql数据库工具(除了phpmyadmin,我偶尔用,功能强速度慢)都不支持创建时指定数据库编码,当然可以改my.ini来解决这个问题,但是需要重新启动mysql,
不过用下面的语句会更有效

GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;

UTF8: CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci


okone96 发表于:2007.10.25 17:48 ::分类: ( 数据库 ) ::阅读:(1315次) :: 评论 (2)
===========================================================
===========================================================

用load data infile 来装载数据时出现乱码了,使用load 时 必须 数据库 表 字段的编码和 文件编码一致,但是数据库已经有数据不想重建,用命令修改编码是个不错的选择,下面是修改的方法。试过修改my.ini里character_set_database = uft8,但似乎不起作用。

1.如果安装mysql的编码已不能更改,很多朋友是购买虚拟主机建立网站,无权更改MYSQL的安装编码,这一关我们可以跳过,因为只要后面的步聚正确,一样能解决乱码问题
2.修改数据库编码,如果是数据库编码不正确: 可以在phpmyadmin 执行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将test数据库的编码设为utf8
3.修改表的编码:ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将一个表category的编码改为utf8
4.修改字段的编码:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是将test表中 dd的字段编码改为utf8


okone96 发表于:2007.10.09 11:21 ::分类: ( 数据库 ) ::阅读:(738次) :: 评论 (0)
===========================================================
===========================================================

http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#insert-speed

http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html#load-data


okone96 发表于:2007.10.08 18:28 ::分类: ( 数据库 ) ::阅读:(413次) :: 评论 (0)
===========================================================
===========================================================

1、创建保存备份文件的路径/mysqldata
#mkdir /mysqldata
2、创建/usr/sbin/bakmysql文件
#vi /usr/sbin/bakmysql
输入
rq=` date +%Y%m%d `
tar zcvf /mysqldata/mysql$rq.tar.gz /var/lib/mysql
或者写成
a=$(date +%Y%m%d)

mysqldump shequ -uroot -p123456 | gzip >/opt/baofeng_paihangbang/backup/mysql_$a.shequ.sql.tar.gz


/var/lib/mysql是你数据库文件的目录,部分用户是/usr/local/mysql/data,每个人可能不同
/mysqldata/表示保存备份文件的目录,这个每个人也可以根据自己的要求来做。
3、修改文件属性,使其可执行
# chmod +x /usr/sbin/bakmysql
4、修改/etc/crontab
#vi /etc/crontab
在下面添加
01 3 * * * root /usr/sbin/bakmysql
表示每天3点钟执行备份
5、重新启动crond
# /etc/rc.d/init.d/crond restart
完成。
这样每天你在/mysqldata可以看到这样的文件
mysql20040619.tar.gz
你直接下载就可以了。
在tar命令执行前,停止数据库服务进程或锁定数据库,
否则恢复数据时,会出现数据库损坏的情形,运气好时可修复,运气不好时就不可以了。


okone96 发表于:2007.09.27 15:11 ::分类: ( 数据库 ) ::阅读:(441次) :: 评论 (0)
===========================================================
===========================================================

java.sql.SQLException: Unable to connect to any hosts due to exception: java.lang.ArrayIndexOutOfBoundsException: 40
at com.mysql.jdbc.Connection.createNewIO(Connection.java:1797)
at com.mysql.jdbc.Connection.<init>(Connection.java:562)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:361)
at java.sql.DriverManager.getConnection(DriverManager.java:525)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:48)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:771)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
at com.community.util.ConnectionPool.getConnection(ConnectionPool.java:56)
at com.community.manager.ModelManager.getConnection(ModelManager.java:16)
at com.community.manager.MovieManager.main(MovieManager.java:48)

链接mysql的时候发现,数据库名称跟这个异常直接相关,

1 数据库名称里不能包含下划线等特殊字符。

2 数据库名称不能太长。

3 如果正常的数据库名称也出现这种问题,偶的解决方法是重装mysql,换数据库名称。

最主要的原因是:java的mysql驱动jar和当前的mysql版本不兼容造成的,稳定版是 mysql-connector-java-5.0.3.jar


okone96 发表于:2007.05.29 14:57 ::分类: ( 数据库 ) ::阅读:(466次) :: 评论 (2)
===========================================================
===========================================================

给个通俗的解释吧.
例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连接,要取出id相同的字段
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据.
此时的取出的是:
1 a1 b1
2 a2 b2
那么left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4

“Outer Join
这款的 Join 方式是一般人比较少用到的, 甚至有些 SQL 的管理者也从未用过, 这真是一件悲哀的代志, 因为善用 Outer Join 是可以简化一些查询的工作的, 先来看看 Outer Join 的语法
Select <要查询的字段> From
[Outer] Join On
语法中的 Outer 是可以省略的, 例如你可以用 Left Join 或是 Right Join, 在本质上, Outer Join 是 inclusive, 叫它做包容性吧! 不同于 Inner Join 的排他性, 因此在 Left Outer Join 的查询结果会包含所有 Left 资料表的资料, 颠倒过来讲, Right Outer Join 的查询就会包含所有 Right 资料表的资料。”


okone96 发表于:2007.05.14 18:01 ::分类: ( 数据库 ) ::阅读:(1292次) :: 评论 (0)
===========================================================
===========================================================

java 链接sql server 2000 总结

Context envContext = (Context)initCtx.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/jieba");
conn = ds.getConnection();

执行后总是出现:

java.lang.NoSuchMethodError: com.microsoft.util.UtilDebug.setPrintWriter(Ljava/io/PrintWriter;)V
at com.microsoft.jdbc.base.BaseDriver.setupDebugging(Unknown Source)
at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
at org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:37)
at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:290)
at org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:877)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:851)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at com.hero.analysis.service.base.DBConnection.getConnection(DBConnection.java:41)
at com.hero.analysis.service.base.JDBCFacade.getDataSource(JDBCFacade.java:72)
at com.hero.analysis.service.base.JDBCFacade.<init>(JDBCFacade.java:43)
at com.hero.analysis.dao.mysql.MysqlUserDAO.login(MysqlUserDAO.java:50)
at com.hero.analysis.service.UserBO.login(UserBO.java:27)
at com.hero.analysis.web.user.LoginAction.execute(LoginAction.java:39)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.hero.analysis.util.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:121)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at com.hero.analysis.util.CheckLoginFilter.doFilter(CheckLoginFilter.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:595)

跟着程序走了以下,确实没有这个方法,郁闷了一天

经过反复调试后发现有几种可能造成这个原因

1.驱动程序的版本不对

2 .sql server 2000没有打补丁 必须打补丁

3 .检查sql server 2000 的驱动程序mssql.jar,msbase.jar,mssqlserver.jar,msutil.jar存放位置对不对,一般放在tomact/commen/lib下就可以,或放进class_path,或webinfo/lib下,一般情况下,放一个地方就可以了

4 .位置方对了还不行 那可以考虑jdbc驱动程序的版本对不对,如果你打了 sp2补丁 那么也要用for sp2 driver


okone96 发表于:2007.04.23 11:57 ::分类: ( 数据库 ) ::阅读:(536次) :: 评论 (0)
===========================================================
===========================================================
  1. @@SERVERNAME : 返回运行SQL Server 2000本地服务器的名称。
  2. @@REMSERVER : 返回登录记录中记载的远程SQL Server服务器的名称。
  3. @@CONNECTIONS : 返回自上次启动SQL Server以来连接或试图连接的次数,用其可让管理人员方便地了解今天所有试图连接服务器的次数。
  4. @@CURSOR_ROWS : 返回最后连接上并打开的游标中当前存在的合格行的数量。
  5. @@ERROR : 返回最后执行的Transact-SQL语句的错误代码。
  6. @@ROWCOUNT : 返回受上一语句影响的行数,任何不返回行的语句将这一变量设置为0。
  7. @@VERSION : 返回SQL Server当前安装的日期、版本和处理器类型。
  8. @@CPU_BUSY : 返回自SQL Server最近一次启动以来CPU的工作时间其单位为毫秒。
  9. @@DATEFIRST : 返回使用SET DATEFIRST命令而被赋值的DATAFIRST参数值。SET DATEFIRST命令用来指定每周的第一天是星期几。
  10. @@DBTS : 返回当前数据库的时间戳值必须保证数据库中时间戳的值是惟一的。
  11. @@FETCH_STATUS : 返回上一次FETCH语句的状态值。
  12. @@IDENTITY : 返回最后插入行的标识列的列值。
  13. @@IDLE : 返回自SQL Server最近一次启动以来CPU处于空闭状态的时间长短,单位为毫秒。
  14. @@IO_BUSY : 返回自SQL Server最后一次启动以来CPU执行输入输出操作所花费的时间(毫秒)。
  15. @@LANGID : 返回当前所使用的语言ID值。
  16. @@LANGUAGE : 返回当前使用的语言名称。
  17. @@LOCK_TIMEOUT: 返回当前会话等待锁的时间长短其单位为毫秒。
  18. @@MAX_CONNECTIONS : 返回允许连接到SQL Server的最大连接数目。
  19. @@MAX_PRECISION : 返回decimal 和 numeric数据类型的精确度。
  20. @@NESTLEVEL : 返回当前执行的存储过程的嵌套级数,初始值为0。
  21. @@OPTIONS : 返回当前SET选项的信息。
  22. @@PACK_RECEIVED : 返回SQL Server通过网络读取的输入包的数目。
  23. @@PACK_SENT : 返回SQL Server写给网络的输出包的数目。
  24. @@PACKET_ERRORS : 返回网络包的错误数目。
  25. @@PROCID : 返回当前存储过程的ID值。
  26. @@SERVICENAME : 返回SQL Server正运行于哪种服务状态之下:如 MS SQLServer、MSDTC、SQLServerAgent。
  27. @@SPID : 返回当前用户处理的服务器处理ID值。
  28. @@TEXTSIZE : 返回SET语句的TEXTSIZE选项值SET语句定义了SELECT语句中text或image。数据类型的最大长度基本单位为字节。
  29. @@TIMETICKS : 返回每一时钟的微秒数。
  30. @@TOTAL_ERRORS : 返回磁盘读写错误数目。
  31. @@TOTAL_READ : 返回磁盘读操作的数目。
  32. @@TOTAL_WRITE : 返回磁盘写操作的数目。
  33. @@TRANCOUNT : 返回当前连接中处于激活状态的事务数目。

okone96 发表于:2007.03.13 14:23 ::分类: ( 数据库 ) ::阅读:(284次) :: 评论 (0)
===========================================================
===========================================================
HSQL DB 是一种基于Java的SQL数据库管理系统,可以从HSQL DB的网站上下载,实际上,你只许下在的包中的hsqldb.jar文件,并把这个文件放在开发文件夹的lib/目录下即可。
在开发的根目录下创建一个data目录--这是hsql db 存储数据文件的地方。此时在data目录中运行:
java -classpath ../lib/hsqldb.jar org.hsqldb.Server即可启动数据库,你可以在log中看到它的启动,以及邦定到Tcp/ip套结字。默认用户名sa,密码""。

查看数据:java -classpath ../lib/hsqldb.jar org.hsqldb.util.DatabaseManager


okone96 发表于:2007.03.10 14:57 ::分类: ( 数据库 ) ::阅读:(890次) :: 评论 (0)
===========================================================
===========================================================

SQL中的单记录函数
1.ASCII
返回与指定的字符对应的十进制数;
SQL> select ascii(’A’) A,ascii(’a’) a,ascii(’0’) zero,ascii(’ ’) space from dual;
A A ZERO SPACE
--------- --------- --------- ---------
65 97 48 32

2.CHR
给出整数,返回对应的字符;
SQL> select chr(54740) zhao,chr(65) chr65 from dual;
ZH C
-- -
赵 A
3.CONCAT
连接两个字符串;
SQL> select concat(’010-’,’88888888’)||’转23’ 高乾竞电话 from dual;
高乾竞电话
----------------
010-88888888转23
4.INITCAP
返回字符串并将字符串的第一个字母变为大写;
SQL> select initcap(’smith’) upp from dual;
UPP
-----
Smith

5.INSTR(C1,C2,I,J)
在一个字符串中搜索指定的字符,返回发现指定的字符的位置;
C1 被搜索的字符串
C2 希望搜索的字符串
I 搜索的开始位置,默认为1
J 出现的位置,默认为1
SQL> select instr(’oracle traning’,’ra’,1,2) instring from dual;
INSTRING
---------
9

6.LENGTH
返回字符串的长度;
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst;
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL))
------ ------------ ---------------- ------------ --------- --------------------
高乾竞 3 北京市海锭区 6 9999.99 7

7.LOWER
返回字符串,并将所有的字符小写
SQL> select lower(’AaBbCcDd’)AaBbCcDd from dual;
AABBCCDD
--------
aabbccdd

8.UPPER
返回字符串,并将所有的字符大写
SQL> select upper(’AaBbCcDd’) upper from dual;
UPPER
--------
AABBCCDD

9.RPAD和LPAD(粘贴字符)
RPAD 在列的右边粘贴字符
LPAD 在列的左边粘贴字符
SQL> select lpad(rpad(’gao’,10,’*’),17,’*’)from dual;
LPAD(RPAD(’GAO’,1
-----------------
*******gao*******
不够字符则用*来填满

10.LTRIM和RTRIM
LTRIM 删除左边出现的字符串
RTRIM 删除右边出现的字符串
SQL> select ltrim(rtrim(’ gao qian jing ’,’ ’),’ ’) from dual;
LTRIM(RTRIM(’
-------------
gao qian jing

11.SUBSTR(string,start,count)
取子字符串,从start开始,取count个
SQL> select substr(’13088888888’,3,8) from dual;
SUBSTR(’
--------
08888888

12.REPLACE(’string’,’s1’,’s2’)
string 希望被替换的字符或变量
s1 被替换的字符串
s2 要替换的字符串
SQL> select replace(’he love you’,’he’,’i’) from dual;
REPLACE(’H
----------
i love you

13.SOUNDEX
返回一个与给定的字符串读音相同的字符串
SQL> create table table1(xm varchar(8));
SQL> insert into table1 values(’weather’);
SQL> insert into table1 values(’wether’);
SQL> insert into table1 values(’gao’);
SQL> select xm from table1 where soundex(xm)=soundex(’weather’);
XM
--------
weather
wether

14.TRIM(’s’ from ’string’)
LEADING 剪掉前面的字符
TRAILING 剪掉后面的字符
如果不指定,默认为空格符
15.ABS
返回指定值的绝对值
SQL> select abs(100),abs(-100) from dual;
ABS(100) ABS(-100)
--------- ---------
100 100

16.ACOS
给出反余弦的值
SQL> select acos(-1) from dual;
ACOS(-1)
---------
3.1415927

17.ASIN
给出反正弦的值
SQL> select asin(0.5) from dual;
ASIN(0.5)
---------
.52359878

18.ATAN
返回一个数字的反正切值
SQL> select atan(1) from dual;
ATAN(1)
---------
.78539816

19.CEIL
返回大于或等于给出数字的最小整数
SQL> select ceil(3.1415927) from dual;
CEIL(3.1415927)
---------------
4

20.COS
返回一个给定数字的余弦
SQL> select cos(-3.1415927) from dual;
COS(-3.1415927)
---------------
-1
21.COSH
返回一个数字反余弦值
SQL> select cosh(20) from dual;
COSH(20)
---------
242582598

22.EXP
返回一个数字e的n次方根
SQL> select exp(2),exp(1) from dual;
EXP(2) EXP(1)
--------- ---------
7.3890561 2.7182818

23.FLOOR
对给定的数字取整数
SQL> select floor(2345.67) from dual;
FLOOR(2345.67)
--------------
2345

24.LN
返回一个数字的对数值
SQL> select ln(1),ln(2),ln(2.7182818) from dual;
LN(1) LN(2) LN(2.7182818)
--------- --------- -------------
0 .69314718 .99999999

25.LOG(n1,n2)
返回一个以n1为底n2的对数
SQL> select log(2,1),log(2,4) from dual;
LOG(2,1) LOG(2,4)
--------- ---------
0 2

26.MOD(n1,n2)
返回一个n1除以n2的余数
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual;
MOD(10,3) MOD(3,3) MOD(2,3)
--------- --------- ---------
1 0 2

27.POWER
返回n1的n2次方根
SQL> select power(2,10),power(3,3) from dual;
POWER(2,10) POWER(3,3)
----------- ----------
1024 27

28.ROUND和TRUNC
按照指定的精度进行舍入
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual;
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5)
----------- ------------ ----------- ------------
56 -55 55 -55

29.SIGN
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
SQL> select sign(123),sign(-100),sign(0) from dual;
SIGN(123) SIGN(-100) SIGN(0)
--------- ---------- ---------
1 -1 0

30.SIN
返回一个数字的正弦值
SQL> select sin(1.57079) from dual;
SIN(1.57079)
------------
1

31.SIGH
返回双曲正弦的值
SQL> select sin(20),sinh(20) from dual;
SIN(20) SINH(20)
--------- ---------
.91294525 242582598

32.SQRT
返回数字n的根
SQL> select sqrt(64),sqrt(10) from dual;
SQRT(64) SQRT(10)
--------- ---------
8 3.1622777

33.TAN
返回数字的正切值
SQL> select tan(20),tan(10) from dual;
TAN(20) TAN(10)
--------- ---------
2.2371609 .64836083

34.TANH
返回数字n的双曲正切值
SQL> select tanh(20),tan(20) from dual;
TANH(20) TAN(20)
--------- ---------
1 2.2371609

35.TRUNC
按照指定的精度截取一个数
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual;
TRUNC1 TRUNC(124.16666,2)
--------- ------------------
100 124.16

36.ADD_MONTHS
增加或减去月份
SQL> select to_char(add_months(to_date(’199912’,’yyyymm’),2),’yyyymm’) from dual;
TO_CHA
------
200002
SQL> select to_char(add_months(to_date(’199912’,’yyyymm’),-2),’yyyymm’) from dual;
TO_CHA
------
199910

37.LAST_DAY
返回日期的最后一天
SQL> select to_char(sysdate,’yyyy.mm.dd’),to_char((sysdate)+1,’yyyy.mm.dd’) from dual;
TO_CHAR(SY TO_CHAR((S
---------- ----------
2004.05.09 2004.05.10
SQL> select last_day(sysdate) from dual;
LAST_DAY(S
----------
31-5月 -04

38.MONTHS_BETWEEN(date2,date1)
给出date2-date1的月份
SQL> select months_between(’19-12月-1999’,’19-3月-1999’) mon_between from dual;
MON_BETWEEN
-----------
9
SQL>selectmonths_between(to_date(’2000.05.20’,’yyyy.mm.dd’),to_date(’2005.05.20’,’yyyy.mm.dd’)) mon_betw from dual;
MON_BETW
---------
-60

39.NEW_TIME(date,’this’,’that’)
给出在this时区=other时区的日期和时间
SQL> select to_char(sysdate,’yyyy.mm.dd hh24:mi:ss’) bj_time,to_char(new_time
2 (sysdate,’PDT’,’GMT’),’yyyy.mm.dd hh24:mi:ss’) los_angles from dual;
BJ_TIME LOS_ANGLES
------------------- -------------------
2004.05.09 11:05:32 2004.05.09 18:05:32

40.NEXT_DAY(date,’day’)
给出日期date和星期x之后计算下一个星期的日期
SQL> select next_day(’18-5月-2001’,’星期五’) next_day from dual;
NEXT_DAY
----------
25-5月 -01
41.SYSDATE
用来得到系统的当前日期
SQL> select to_char(sysdate,’dd-mm-yyyy day’) from dual;
TO_CHAR(SYSDATE,’
-----------------
09-05-2004 星期日
trunc(date,fmt)按照给出的要求将日期截断,如果fmt=’mi’表示保留分,截断秒
SQL> select to_char(trunc(sysdate,’hh’),’yyyy.mm.dd hh24:mi:ss’) hh,
2 to_char(trunc(sysdate,’mi’),’yyyy.mm.dd hh24:mi:ss’) hhmm from dual;
HH HHMM
------------------- -------------------
2004.05.09 11:00:00 2004.05.09 11:17:00

42.CHARTOROWID
将字符数据类型转换为ROWID类型
SQL> select rowid,rowidtochar(rowid),ename from scott.emp;
ROWID ROWIDTOCHAR(ROWID) ENAME
------------------ ------------------ ----------
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES

43.CONVERT(c,dset,sset)
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集
SQL> select convert(’strutz’,’we8hp’,’f7dec’) "conversion" from dual;
conver
------
strutz

44.HEXTORAW
将一个十六进制构成的字符串转换为二进制

45.RAWTOHEXT
将一个二进制构成的字符串转换为十六进制

46.ROWIDTOCHAR
将ROWID数据类型转换为字符类型

47.TO_CHAR(date,’format’)
SQL> select to_char(sysdate,’yyyy/mm/dd hh24:mi:ss’) from dual;
TO_CHAR(SYSDATE,’YY
-------------------
2004/05/09 21:14:41

48.TO_DATE(string,’format’)
将字符串转化为ORACLE中的一个日期

49.TO_MULTI_BYTE
将字符串中的单字节字符转化为多字节字符
SQL> select to_multi_byte(’高’) from dual;
TO
--

50.TO_NUMBER
将给出的字符转换为数字
SQL> select to_number(’1999’) year from dual;
YEAR
---------
1999

51.BFILENAME(dir,file)
指定一个外部二进制文件
SQL>insert into file_tb1 values(bfilename(’lob_dir1’,’image1.gif’));

52.CONVERT(’x’,’desc’,’source’)
将x字段或变量的源source转换为desc
SQL> select sid,serial#,username,decode(command,
2 0,’none’,
3 2,’insert’,
4 3,
5 ’select’,
6 6,’update’,
7 7,’delete’,
8 8,’drop’,
9 ’other’) cmd from v$session where type!=’background’;
SID SERIAL# USERNAME CMD
--------- --------- ------------------------------ ------
1 1 none
2 1 none
3 1 none
4 1 none
5 1 none
6 1 none
7 1275 none
8 1275 none
9 20 GAO select
10 40 GAO none

53.DUMP(s,fmt,start,length)
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值
SQL> col global_name for a30
SQL> col dump_string for a50
SQL> set lin 200
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name;
GLOBAL_NAME DUMP_STRING
------------------------------ --------------------------------------------------
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D

54.EMPTY_BLOB()和EMPTY_CLOB()
这两个函数都是用来对大数据类型字段进行初始化操作的函数

55.GREATEST
返回一组表达式中的最大值,即比较字符的编码大小.
SQL> select greatest(’AA’,’AB’,’AC’) from dual;
GR
--
AC
SQL> select greatest(’啊’,’安’,’天’) from dual;
GR
--

56.LEAST
返回一组表达式中的最小值
SQL> select least(’啊’,’安’,’天’) from dual;
LE
--

57.UID
返回标识当前用户的唯一整数
SQL> show user
USER 为"GAO"
SQL> select username,user_id from dba_users where user_id=uid;
USERNAME USER_ID
------------------------------ ---------
GAO 25

58.USER
返回当前用户的名字
SQL> select user from dual;
USER
------------------------------
GAO

59.USEREVN
返回当前用户环境的信息,opt可以是:
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE
ISDBA 查看当前用户是否是DBA如果是则返回true
SQL> select userenv(’isdba’) from dual;
USEREN
------
FALSE
SQL> select userenv(’isdba’) from dual;
USEREN
------
TRUE
SESSION
返回会话标志
SQL> select userenv(’sessionid’) from dual;
USERENV(’SESSIONID’)
--------------------
152
ENTRYID
返回会话人口标志
SQL> select userenv(’entryid’) from dual;
USERENV(’ENTRYID’)
------------------
0
INSTANCE
返回当前INSTANCE的标志
SQL> select userenv(’instance’) from dual;
USERENV(’INSTANCE’)
-------------------
1
LANGUAGE
返回当前环境变量
SQL> select userenv(’language’) from dual;
USERENV(’LANGUAGE’)
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.ZHS16GBK
LANG
返回当前环境的语言的缩写
SQL> select userenv(’lang’) from dual;
USERENV(’LANG’)
----------------------------------------------------
ZHS
TERMINAL
返回用户的终端或机器的标志
SQL> select userenv(’terminal’) from dual;
USERENV(’TERMINA
----------------
GAO
VSIZE(X)
返回X的大小(字节)数
SQL> select vsize(user),user from dual;
VSIZE(USER) USER
----------- ------------------------------
6 SYSTEM


60.AVG(DISTINCT|ALL)
all表示对所有的值求平均值,distinct只对不同的值求平均值
SQLWKS> create table table3(xm varchar(8),sal number(7,2));
语句已处理。
SQLWKS> insert into table3 values(’gao’,1111.11);
SQLWKS> insert into table3 values(’gao’,1111.11);
SQLWKS> insert into table3 values(’zhu’,5555.55);
SQLWKS> commit;
SQL> select avg(distinct sal) from gao.table3;
AVG(DISTINCTSAL)
----------------
3333.33
SQL> select avg(all sal) from gao.table3;
AVG(ALLSAL)
-----------
2592.59

61.MAX(DISTINCT|ALL)
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次
SQL> select max(distinct sal) from scott.emp;
MAX(DISTINCTSAL)
----------------
5000

62.MIN(DISTINCT|ALL)
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次
SQL> select min(all sal) from gao.table3;
MIN(ALLSAL)
-----------
1111.11

63.STDDEV(distinct|all)
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差
SQL> select stddev(sal) from scott.emp;
STDDEV(SAL)
-----------
1182.5032
SQL> select stddev(distinct sal) from scott.emp;
STDDEV(DISTINCTSAL)
-------------------
1229.951

64.VARIANCE(DISTINCT|ALL)
求协方差
SQL> select variance(sal) from scott.emp;
VARIANCE(SAL)
-------------
1398313.9

65.GROUP BY
主要用来对一组数进行统计
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno;
DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
10 3 8750
20 5 10875
30 6 9400

66.HAVING
对分组统计再加限制条件
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5;
DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ;
DEPTNO COUNT(*) SUM(SAL)
--------- --------- ---------
20 5 10875
30 6 9400

67.ORDER BY
用于对查询到的结果进行排序输出
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc;
DEPTNO ENAME SAL
--------- ---------- ---------
10 KING 5000
10 CLARK 2450
10 MILLER 1300
20 SCOTT 3000
20 FORD 3000
20 JONES 2975
20 ADAMS 1100
20 SMITH 800
30 BLAKE 2850
30 ALLEN 1600
30 TURNER 1500
30 WARD 1250
30 MARTIN 1250
30 JAMES 950


okone96 发表于:2007.02.17 13:16 ::分类: ( 数据库 ) ::阅读:(333次) :: 评论 (0)
===========================================================
===========================================================

Oracle弱智100问

1. Oracle安装完成后的初始口令?

 internal/oracle

  sys/change_on_install

  system/manager

  scott/tiger

  sysman/oem_temp

2. ORACLE9IAS WEB CACHE的初始默认用户和密码?

administrator/administrator

3. oracle 8.0.5怎么创建数据库?

用orainst。如果有motif界面,可以用orainst /m

4. oracle 8.1.7怎么创建数据库?

dbassist

5. oracle 9i 怎么创建数据库?

dbca

6. oracle中的裸设备指的是什么?

裸设备就是绕过文件系统直接访问的储存空间

7. oracle如何区分 64-bit/32bit 版本???

$ sqlplus '/ AS SYSDBA'
SQL*Plus: Release 9.0.1.0.0 - Production on Mon Jul 14 17:01:09 2003
(c) Copyright 2001 Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
With the Partitioning option
JServer Release 9.0.1.0.0 - Production
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.0.1.0.0 - Production
PL/SQL Release 9.0.1.0.0 - Production
CORE 9.0.1.0.0 Production
TNS for Solaris: Version 9.0.1.0.0 - Production
NLSRTL Version 9.0.1.0.0 - Production
SQL>

8. SVRMGR什么意思?

svrmgrl,Server Manager.
9i下没有,已经改为用SQLPLUS了
sqlplus /nolog
变为归档日志型的

9. 请问如何分辨某个用户是从哪台机器登陆ORACLE的?

SELECT machine , terminal FROM V$SESSION;

10. 用什么语句查询字段呢?

desc table_name 可以查询表的结构
select field_name,... from ... 可以查询字段的值

select * from all_tables where table_name like '%'
select * from all_tab_columns where table_name='??'

11. 怎样得到触发器、过程、函数的创建脚本?

desc user_source
user_triggers

12. 怎样计算一个表占用的空间的大小?

select owner,table_name,
NUM_ROWS,
BLOCKS*AAA/1024/1024 "Size M",
EMPTY_BLOCKS,
LAST_ANALYZED
from dba_tables
where table_name='XXX';

Here: AAA is the value of db_block_size ;
XXX is the table name you want to check

13. 如何查看最大会话数?

SELECT * FROM V$PARAMETER WHERE NAME LIKE 'proc%';

SQL>
SQL> show parameter processes

NAME TYPE VALUE
------------------------------------ ------- ------------------------------
aq_tm_processes integer 1
db_writer_processes integer 1
job_queue_processes integer 4
log_archive_max_processes integer 1
processes integer 200

这里为200个用户。

select * from v$license;
其中sessions_highwater纪录曾经到达的最大会话数

14. 如何查看系统被锁的事务时间?

select * from v$locked_object ;

15. 如何以archivelog的方式运行oracle。

init.ora
log_archive_start = true

RESTART DATABASE

16. 怎么获取有哪些用户在使用数据库

select username from v$session;

17. 数据表中的字段最大数是多少?

表或视图中的最大列数为 1000

18. 怎样查得数据库的SID ?

select name from v$database;
也可以直接查看 init.ora文件

19. 如何在Oracle服务器上通过SQLPLUS查看本机IP地址 ?

select sys_context('userenv','ip_address') from dual;

如果是登陆本机数据库,只能返回127.0.0.1,呵呵

20. unix 下怎么调整数据库的时间?

su -root
date -u 08010000

21. 在ORACLE TABLE中如何抓取MEMO类型栏位为空的资料记录?

select remark from oms_flowrec where trim(' ' from remark) is not null ;


22. 如何用BBB表的资料去更新AAA表的资料(有关联的字段)

UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) W
HERE BBB.DPT_NO IS NOT NULL;

23. P4电脑安装方法

将SYMCJIT.DLL改为SYSMCJIT.OLD

24. 何查询SERVER是不是OPS?

SELECT * FROM V$OPTION;

如果PARALLEL SERVER=TRUE则有OPS能

25. 何查询每个用户的权限?

SELECT * FROM DBA_SYS_PRIVS;

26. 如何将表移动表空间?

ALTER TABLE TABLE_NAME MOVE TABLESPACE_NAME;

27. 如何将索引移动表空间?

ALTER INDEX INDEX_NAME REBUILD TABLESPACE TABLESPACE_NAME;

28. 在LINUX,UNIX下如何启动DBA STUDIO?

OEMAPP DBASTUDIO

29. 查询锁的状况的对象有?

V$LOCK, V$LOCKED_OBJECT, V$SESSION, V$SQLAREA, V$PROCESS ;

查询锁的表的方法:

SELECT S.SID SESSION_ID, S.USERNAME, DECODE(LMODE, 0, 'None', 1, 'Null', 2, 'R
ow-S (SS)', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', T
O_CHAR(LMODE)) MODE_HELD, DECODE(REQUEST, 0, 'None', 1, 'Null', 2, 'Row-S (SS)
', 3, 'Row-X (SX)', 4, 'Share', 5, 'S/Row-X (SSX)', 6, 'Exclusive', TO_CHAR(RE
QUEST)) MODE_REQUESTED, O.OWNER||'.'||O.OBJECT_NAME||' ('||O.OBJECT_TYPE||')',
S.TYPE LOCK_TYPE, L.ID1 LOCK_ID1, L.ID2 LOCK_ID2 FROM V$LOCK L, SYS.DBA_OBJEC
TS O, V$SESSION S WHERE L.SID = S.SID AND L.ID1 = O.OBJECT_ID ;

30. 如何解锁?

ALTER SYSTEM KILL SESSION ‘SID,SERIR#’;

31. SQLPLUS下如何修改编辑器?

DEFINE _EDITOR="<编辑器的完整路经>" -- 必须加上双引号
来定义新的编辑器,也可以把这个写在$ORACLE_HOME/sqlplus/admin/glogin.sql里面使它
永久有效。

32. ORACLE产生随机函数是?

DBMS_RANDOM.RANDOM

33. LINUX下查询磁盘竞争状况命令?

Sar -d

33. LINUX下查询CPU竞争状况命令?

sar -r

34. 查询当前用户对像?

SELECT * FROM USER_OBJECTS;

SELECT * FROM DBA_SEGMENTS;

35. 如何获取错误信息?

SELECT * FROM USER_ERRORS;

36. 如何获取链接状况?

SELECT * FROM DBA_DB_LINKS;

37. 查看数据库字符状况?

SELECT * FROM NLS_DATABASE_PARAMETERS;

SELECT * FROM V$NLS_PARAMETERS;

38. 查询表空间信息?

SELECT * FROM DBA_DATA_FILES;

39. ORACLE的INTERAL用户要口令?

修改 SQLNET.ORA

SQLNET.AUTHENTICATION_SERVICES=(NTS)

40. 出现JAVA.EXE的解决办法?

一般是将ORACLEORAHOMEXIHTTPSERVER改成手工启动可以的

X是8或9

41. 如何给表、列加注释?

SQL>comment on table 表 is '表注释';

注释已创建。

SQL>comment on column 表.列 is '列注释';

注释已创建。

SQL> select * from user_tab_comments where comments is not null;

42. 如何查看各个表空间占用磁盘情况?

SQL> col tablespace format a20
SQL> select
b.file_id 文件ID号,
b.tablespace_name 表空间名,
b.bytes 字节数,
(b.bytes-sum(nvl(a.bytes,0))) 已使用,
sum(nvl(a.bytes,0)) 剩余空间,
sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_id,b.bytes
order by b.file_id

43. 如把ORACLE设置为MTS或专用模式?

#dispatchers="(PROTOCOL=TCP) (SERVICE=SIDXDB)"
加上就是MTS,注释就是专用模式,SID是指你的实例名。

44. 如何才能得知系统当前的SCN号 ?

select max(ktuxescnw * power(2, 32) + ktuxescnb) from x$ktuxe;

45. 请问如何在ORACLE中取毫秒?

9i之前不支持,9i开始有timestamp.

9i可以用select systimestamp from dual;


46. 如何在字符串里加回车?

select 'Welcome to visit'||chr(10)||'www.CSDN.NET' from dual ;

47. 中文是如何排序的?

Oracle9i之前,中文是按照二进制编码进行排序的。

在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值

SCHINESE_RADICAL_M 按照部首(第一顺序)、笔划(第二顺序)排序

SCHINESE_STROKE_M 按照笔划(第一顺序)、部首(第二顺序)排序

SCHINESE_PINYIN_M 按照拼音排序

48. Oracle8i中对像名可以用中文吗?

可以

49. 如何改变WIN中SQL*Plus启动选项?

SQL*PLUS自身的选项设置我们可以在$ORACLE_HOME/sqlplus/admin/glogin.sql中设置。


50. 怎样修改oracel数据库的默认日期?

alter session set nls_date_format='yyyymmddhh24miss';
OR

可以在init.ora中加上一行
nls_date_format='yyyymmddhh24miss'

51. 如何将小表放入keep池中?

alter table xxx storage(buffer_pool keep);

52. 如何检查是否安装了某个patch?

check that oraInventory

53. 如何使select语句使查询结果自动生成序号?

select rownum,COL from table;

54. 如何知道数据裤中某个表所在的tablespace?

select tablespace_name from user_tables where table_name='TEST';

select * from user_tables中有个字段TABLESPACE_NAME,(oracle);

select * from dba_segments where …;

55. 怎么可以快速做一个和原表一样的备份表?

create table new_table as (select * from old_table);

55. 怎么在sqlplus下修改procedure?

select line,trim(text) t from user_source where name =’A’ order by line;

56. 怎样解除PROCEDURE被意外锁定?

alter system kill session ,把那个session给杀掉,不过你要先查出她的session id


or

把该过程重新改个名字就可以了。

57. SQL Reference是个什么东西?

是一本sql的使用手册,包括语法、函数等等,oracle官方网站的文档中心有下载.

58. 如何查看数据库的状态?

unix下
ps -ef | grep ora
windows下
看服务是否起来
是否可以连上数据库

59. 请问如何修改一张表的主键?

alter table aaa
drop constraint aaa_key ;
alter table aaa
add constraint aaa_key primary key(a1,b1) ;

60. 改变数据文件的大小?

用 ALTER DATABASE .... DATAFILE .... ;
手工改变数据文件的大小,对于原来的 数据文件有没有损害。

61. 怎样查看ORACLE中有哪些程序在运行之中?

查看v$sessions表

62. 怎么可以看到数据库有多少个tablespace?

select * from dba_tablespaces;

63. 如何修改oracle数据库的用户连接数?

修改initSID.ora,将process加大,重启数据库.

64. 如何查出一条记录的最后更新时间?

可以用logminer 察看

65. 如何在PL/SQL中读写文件?

UTL_FILE包允许用户通过PL/SQL读写操作系统文件。

66. 怎样把“&”放入一条记录中?

insert into a values (translate ('at{&}t','at{}','at'));

67. EXP 如何加QUERY参数?

EXP USER/PASS FILE=A.DMP TABLES(BSEMPMS)
QUERY='"WHERE EMP_NO='S09394'" ;

68. 关于oracle8i支持简体和繁体的字符集问题?

ZHS16GBK可以支

69. Data Guard是什么软件?

就是Standby的换代产品

70. 如何创建SPFILE?

SQL> connect / as sysdba
SQL> select * from v$version;
SQL> create pfile from spfile;
SQL> CREATE SPFILE FROM PFILE='E:ora9iadmineyglepfileinit.ora';

文件已创建。
SQL> CREATE SPFILE='E:ora9idatabaseSPFILEEYGLE.ORA' FROM PFILE='E:ora9iad
mineyglepfileinit.ora';
文件已创建。

71. 内核参数的应用?

shmmax
  含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定
了最多可以使用的内存数目。这个设置也不影响操作系统的内核资源。
  设置方法:0.5*物理内存
  例子:Set shmsys:shminfo_shmmax=10485760
  shmmin
  含义:共享内存的最小大小。
  设置方法:一般都设置成为1。
  例子:Set shmsys:shminfo_shmmin=1:
  shmmni
  含义:系统中共享内存段的最大个数。
  例子:Set shmsys:shminfo_shmmni=100
  shmseg
  含义:每个用户进程可以使用的最多的共享内存段的数目。
  例子:Set shmsys:shminfo_shmseg=20:
  semmni
  含义:系统中semaphore identifierer的最大个数。
  设置方法:把这个变量的值设置为这个系统上的所有Oracle的实例的init.ora中的最
大的那个processes的那个值加10。
  例子:Set semsys:seminfo_semmni=100
  semmns
  含义:系统中emaphores的最大个数。
  设置方法:这个值可以通过以下方式计算得到:各个Oracle实例的initSID.ora里边的
processes的值的总和(除去最大的Processes参数)+最大的那个Processes×2+10×Or
acle实例的个数。
  例子:Set semsys:seminfo_semmns=200
  semmsl:
  含义:一个set中semaphore的最大个数。
  设置方法:设置成为10+所有Oracle实例的InitSID.ora中最大的Processes的值。

  例子:Set semsys:seminfo_semmsl=-200

72. 怎样查看哪些用户拥有SYSDBA、SYSOPER权限?

SQL>conn sys/change_on_install
SQL>select * from V_$PWFILE_USERS;


73. 如何单独备份一个或多个表?

exp 用户/密码 tables=(表1,…,表2)


74. 如何单独备份一个或多个用户?

exp system/manager owner=(用户1,用户2,…,用户n) file=导出文件


75. 如何对CLOB字段进行全文检索?

SELECT * FROM A WHERE dbms_lob.instr(a.a,'K',1,1)>0;


76. 如何显示当前连接用户?

SHOW USER

77. 如何查看数据文件放置的路径 ?

col file_name format a50
SQL> select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_fi
les order by file_id;

78. 如何查看现有回滚段及其状态 ?

SQL> col segment format a30
SQL> SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM
DBA_ROLLBACK_SEGS

79. 如何改变一个字段初始定义的Check范围?

SQL> alter table xxx drop constraint constraint_name;
之后再创建新约束:
SQL> alter table xxx add constraint constraint_name check();

80. Oracle常用系统文件有哪些?

通过以下视图显示这些文件信息:v$database,v$datafile,v$logfile v$controlfile v$
parameter;

81. 内连接INNER JOIN?

Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no;

82. 如何外连接?

Select a.* from bsempms a,bsdptms b where a.dpt_no=b.dpt_no(+);

Select a.* from bsempms a,bsdptms b wherea.dpt_no(+)=b.dpt_no;

83. 如何执行脚本SQL文件?

SQL>@$PATH/filename.sql;

84. 如何快速清空一个大表?

SQL>truncate table table_name;

85. 如何查有多少个数据库实例?

SQL>SELECT * FROM V$INSTANCE;

86. 如何查询数据库有多少表?

SQL>select * from all_tables;

87. 如何测试SQL语句执行所用的时间?

SQL>set timing on ;

SQL>select * from tablename;


88. CHR()的反函数是?

ASCII()

SELECT CHAR(65) FROM DUAL;

SELECT ASCII('A') FROM DUAL;

89. 字符串的连接

SELECT CONCAT(COL1,COL2) FROM TABLE ;

SELECT COL1||COL2 FROM TABLE ;

90. 怎么把select出来的结果导到一个文本文件中?

SQL>SPOOL C:ABCD.TXT;

SQL>select * from table;

SQL >spool off;

91. 怎样估算SQL执行的I/O数 ?

SQL>SET AUTOTRACE ON ;

SQL>SELECT * FROM TABLE;

OR

SQL>SELECT * FROM v$filestat ;

可以查看IO数

92. 如何在sqlplus下改变字段大小?

alter table table_name modify (field_name varchar2(100));

改大行,改小不行(除非都是空的)

93. 如何查询某天的数据?

select * from table_name where trunc(日期字段)=to_date('2003-05-02','yyyy-mm-
dd');

94. sql 语句如何插入全年日期?

create table BSYEAR (d date);
insert into BSYEAR
select to_date('20030101','yyyymmdd')+rownum-1
from all_objects
where rownum <= to_char(to_date('20031231','yyyymmdd'),'ddd');

95. 如果修改表名?

alter table old_table_name rename to new_table_name;

96. 如何取得命令的返回状态值?

sqlcode=0

97. 如何知道用户拥有的权限?

SELECT * FROM dba_sys_privs ;

98. 从网上下载的ORACLE9I与市场上卖的标准版有什么区别?

从功能上说没有区别,只不过oracle公司有明文规定;从网站上下载的oracle产品不得用
于 商业用途,否则侵权。

99. 怎样判断数据库是运行在归档模式下还是运行在非归档模式下?

进入dbastudio,历程--〉数据库---〉归档查看。

100. sql>startup pfile和ifile,spfiled有什么区别?

pfile就是Oracle传统的初始化参数文件,文本格式的。
ifile类似于c语言里的include,用于把另一个文件引入
spfile是9i里新增的并且是默认的参数文件,二进制格式
startup后应该只可接pfile


okone96 发表于:2007.02.05 09:25 ::分类: ( 数据库 ) ::阅读:(345次) :: 评论 (1)
===========================================================
===========================================================

对于针对字符串位置的操作,第一个位置被标记为1。

ASCII(str)
返回字符串str的最左面字符的ASCII代码值。如果str是空字符串,返回0。如果str是NULL,返回NULL。
mysql> select ASCII('2');
-> 50
mysql> select ASCII(2);
-> 50
mysql> select ASCII('dx');
-> 100
也可参见ORD()函数。

ORD(str)
如果字符串str最左面字符是一个多字节字符,通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与ASCII()函数返回的相同值。
mysql> select ORD('2');
-> 50

CONV(N,from_base,to_base)
在不同的数字基之间变换数字。返回数字N的字符串数字,从from_base基变换为to_base基,如果任何参数是NULL,返回NULL。参数N解释为一个整数,但是可以指定为一个整数或一个字符串。最小基是2且最大的基是36。如果to_base是一个负数,N被认为是一个有符号数,否则,N被当作无符号数。 CONV以64位点精度工作。
mysql> select CONV("a",16,2);
-> '1010'
mysql> select CONV("6E",18,8);
-> '172'
mysql> select CONV(-17,10,-18);
-> '-H'
mysql> select CONV(10+"10"+'10'+0xa,10,10);
-> '40'

BIN(N)
返回二进制值N的一个字符串表示,在此N是一个长整数(BIGINT)数字,这等价于CONV(N,10,2)。如果N是NULL,返回NULL。
mysql> select BIN(12);
-> '1100'

OCT(N)
返回八进制值N的一个字符串的表示,在此N是一个长整型数字,这等价于CONV(N,10,8)。如果N是NULL,返回NULL。
mysql> select OCT(12);
-> '14'

HEX(N)
返回十六进制值N一个字符串的表示,在此N是一个长整型(BIGINT)数字,这等价于CONV(N,10,16)。如果N是NULL,返回NULL。
mysql> select HEX(255);
-> 'FF'

CHAR(N,...)
CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。
mysql> select CHAR(77,121,83,81,'76');
-> 'MySQL'
mysql> select CHAR(77,77.3,'77.3');
-> 'MMM'

CONCAT(str1,str2,...)
返回来自于参数连结的字符串。如果任何参数是NULL,返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。
mysql> select CONCAT('My', 'S', 'QL');
-> 'MySQL'
mysql> select CONCAT('My', NULL, 'QL');
-> NULL
mysql> select CONCAT(14.3);
-> '14.3'

LENGTH(str)
 
OCTET_LENGTH(str)
 
CHAR_LENGTH(str)
 
CHARACTER_LENGTH(str)
返回字符串str的长度。
mysql> select LENGTH('text');
-> 4
mysql> select OCTET_LENGTH('text');
-> 4

注意,对于多字节字符,其CHAR_LENGTH()仅计算一次。

LOCATE(substr,str)
 
POSITION(substr IN str)
返回子串substr在字符串str第一个出现的位置,如果substr不是在str里面,返回0.
mysql> select LOCATE('bar', 'foobarbar');
-> 4
mysql> select LOCATE('xbar', 'foobar');
-> 0

该函数是多字节可靠的。
LOCATE(substr,str,pos)
返回子串substr在字符串str第一个出现的位置,从位置pos开始。如果substr不是在str里面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5);
-> 7

这函数是多字节可靠的。

INSTR(str,substr)
返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,除了参数被颠倒。
mysql> select INSTR('foobarbar', 'bar');
-> 4
mysql> select INSTR('xbar', 'foobar');
-> 0

这函数是多字节可靠的。

LPAD(str,len,padstr)
返回字符串str,左面用字符串padstr填补直到str是len个字符长。
mysql> select LPAD('hi',4,'??');
-> '??hi'

RPAD(str,len,padstr)
返回字符串str,右面用字符串padstr填补直到str是len个字符长。
mysql> select RPAD('hi',5,'?');
-> 'hi???'

LEFT(str,len)
返回字符串str的最左面len个字符。
mysql> select LEFT('foobarbar', 5);
-> 'fooba'

该函数是多字节可靠的。

RIGHT(str,len)
返回字符串str的最右面len个字符。
mysql> select RIGHT('foobarbar', 4);
-> 'rbar'

该函数是多字节可靠的。

SUBSTRING(str,pos,len)
 
SUBSTRING(str FROM pos FOR len)
 
MID(str,pos,len)
从字符串str返回一个len个字符的子串,从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。
mysql> select SUBSTRING('Quadratically',5,6);
-> 'ratica'

该函数是多字节可靠的。

SUBSTRING(str,pos)
 
SUBSTRING(str FROM pos)
从字符串str的起始位置pos返回一个子串。
mysql> select SUBSTRING('Quadratically',5);
-> 'ratically'
mysql> select SUBSTRING('foobarbar' FROM 4);
-> 'barbar'

该函数是多字节可靠的。

SUBSTRING_INDEX(str,delim,count)
返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数,返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数,返回最后的分隔符到右边的所有字符(从右边数)。
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2);
-> 'www.mysql'
mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2);
-> 'mysql.com'

该函数对多字节是可靠的。

LTRIM(str)
返回删除了其前置空格字符的字符串str。
mysql> select LTRIM(' barbar');
-> 'barbar'

RTRIM(str)
返回删除了其拖后空格字符的字符串str。
mysql> select RTRIM('barbar ');
-> 'barbar'

该函数对多字节是可靠的。
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
返回字符串str,其所有remstr前缀或后缀被删除了。如果没有修饰符BOTH、LEADING或TRAILING给出,BOTH被假定。如果remstr没被指定,空格被删除。
mysql> select TRIM(' bar ');
-> 'bar'
mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-> 'barxxx'
mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-> 'bar'
mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-> 'barx'

该函数对多字节是可靠的。

SOUNDEX(str)
返回str的一个同音字符串。听起来“大致相同”的2个字符串应该有相同的同音字符串。一个“标准”的同音字符串长是4个字符,但是SOUNDEX()函数返回一个任意长的字符串。你可以在结果上使用SUBSTRING()得到一个“标准”的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。
mysql> select SOUNDEX('Hello');
-> 'H400'
mysql> select SOUNDEX('Quadratically');
-> 'Q36324'

SPACE(N)
返回由N个空格字符组成的一个字符串。
mysql> select SPACE(6);
-> ' '

REPLACE(str,from_str,to_str)
返回字符串str,其字符串from_str的所有出现由字符串to_str代替。
mysql> select REPLACE('www.mysql.com', 'w', 'Ww');
-> 'WwWwWw.mysql.com'

该函数对多字节是可靠的。

REPEAT(str,count)
返回由重复countTimes次的字符串str组成的一个字符串。如果count <= 0,返回一个空字符串。如果str或count是NULL,返回NULL。
mysql> select REPEAT('MySQL', 3);
-> 'MySQLMySQLMySQL'

REVERSE(str)
返回颠倒字符顺序的字符串str。
mysql> select REVERSE('abc');
-> 'cba'

该函数对多字节可靠的。

INSERT(str,pos,len,newstr)
返回字符串str,在位置pos起始的子串且len个字符长得子串由字符串newstr代替。
mysql> select INSERT('Quadratic', 3, 4, 'What');
-> 'QuWhattic'

该函数对多字节是可靠的。

ELT(N,str1,str2,str3,...)
如果N= 1,返回str1,如果N= 2,返回str2,等等。如果N小于1或大于参数个数,返回NULL。ELT()是FIELD()反运算。
mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-> 'ej'
mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-> 'foo'

FIELD(str,str1,str2,str3,...)
返回str在str1, str2, str3, ...清单的索引。如果str没找到,返回0。FIELD()是ELT()反运算。
mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 2
mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-> 0

FIND_IN_SET(str,strlist)
如果字符串str在由N子串组成的表strlist之中,返回一个1到N的值。一个字符串表是被“,”分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列,FIND_IN_SET()函数被优化而使用位运算!如果str不是在strlist里面或如果strlist是空字符串,返回0。如果任何一个参数是NULL,返回NULL。如果第一个参数包含一个“,”,该函数将工作不正常。
mysql> SELECT FIND_IN_SET('b','a,b,c,d');
-> 2

MAKE_SET(bits,str1,str2,...)
返回一个集合 (包含由“,”字符分隔的子串组成的一个字符串),由相应的位在bits集合中的的字符串组成。str1对应于位0,str2对应位1,等等。在str1, str2, ...中的NULL串不添加到结果中。
mysql> SELECT MAKE_SET(1,'a','b','c');
-> 'a'
mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world');
-> 'hello,world'
mysql> SELECT MAKE_SET(0,'a','b','c');
-> ''

EXPORT_SET(bits,on,off,[separator,[number_of_bits]])
返回一个字符串,在这里对于在“bits”中设定每一位,你得到一个“on”字符串,并且对于每个复位(reset)的位,你得到一个“off”字符串。每个字符串用“separator”分隔(缺省“,”),并且只有“bits”的“number_of_bits” (缺省64)位被使用。
mysql> select EXPORT_SET(5,'Y','N',',',4)
-> Y,N,Y,N

LCASE(str)
 
LOWER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。
mysql> select LCASE('QUADRATICALLY');
-> 'quadratically'

UCASE(str)
 
UPPER(str)
返回字符串str,根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
mysql> select UCASE('Hej');
-> 'HEJ'

该函数对多字节是可靠的。

LOAD_FILE(file_name)
读入文件并且作为一个字符串返回文件内容。文件必须在
服务器上,你必须指定到文件的完整路径名,而且你必须有file权限。文件必须所有内容都是可读的并且小于max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出,函数返回NULL。
mysql> UPDATE table_name
SET blob_column=LOAD_FILE("/tmp/picture")
WHERE id=1;


MySQL必要时自动变换数字为字符串,并且反过来也如此:

mysql> SELECT 1+"1";
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'

如果你想要明确地变换一个数字到一个字符串,把它作为参数传递到CONCAT()。

如果字符串函数提供一个二进制字符串作为参数,结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。

IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。
mysql>; select IFNULL(1,0);
->; 1
mysql>; select IFNULL(0,10);
->; 0
mysql>; select IFNULL(1/0,10);
->; 10
mysql>; select IFNULL(1/0,'yes');
->; 'yes'

IF(expr1,expr2,expr3)
如果expr1是TRUE(expr1<>;0且expr1<>;NULL),那么IF()返回expr2,否则它返回expr3。IF()返回一个数字或字符串值,取决于它被使用的上下文。
mysql>; select IF(1>;2,2,3);
->; 3
mysql>; select IF(1<2,'yes','no');
->; 'yes'
mysql>; select IF(strcmp('test','test1'),'yes','no');
->; 'no'

expr1作为整数值被计算,它意味着如果你正在测试浮点或字符串值,你应该使用一个比较操作来做。

mysql>; select IF(0.1,1,0);
->; 0
mysql>; select IF(0.1<>;0,1,0);
->; 1

在上面的第一种情况中,IF(0.1)返回0,因为0.1被变换到整数值, 导致测试IF(0)。这可能不是你期望的。在第二种情况中,比较测试原来的浮点值看它是否是非零,比较的结果被用作一个整数。

CASE value WHEN [compare-value] THEN result [WHEN [compare-value] THEN result ...] [ELSE result] END
 
CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...] [ELSE result] END
第一个版本返回result,其中value=compare-value。第二个版本中如果第一个条件为真,返回result。如果没有匹配的result值,那么结果在ELSE后的result被返回。如果没有ELSE部分,那么NULL被返回。
mysql>; SELECT CASE 1 WHEN 1 THEN "one" WHEN 2 THEN "two" ELSE "more" END;
->; "one"
mysql>; SELECT CASE WHEN 1>;0 THEN "true" ELSE "false" END;
->; "true"
mysql>; SELECT CASE BINARY "B" when "a" then 1 when "b" then 2 END;
->; NULL


okone96 发表于:2007.02.03 13:51 ::分类: ( 数据库 ) ::阅读:(271次) :: 评论 (0)
===========================================================
===========================================================

BACKUP DATABASE [btpmedia] TO DISK = N'd:Program FilesMicrosoft SQL ServerMSSQLBACKUPtest.db' WITH NOINIT , NOUNLOAD , DIFFERENTIAL , NAME = N'btpmedia 备份', NOSKIP , STATS = 10, NOFORMAT

定时执行


okone96 发表于:2007.01.22 11:07 ::分类: ( 数据库 ) ::阅读:(248次) :: 评论 (0)
===========================================================
===========================================================

Oracle的包utl_smtp提供了从数据库中直接发送电子邮件的功能,这里介绍一下其使用方法

网上找到的例子以及Oracle文档中的例子都没有提到authorized的问题,我的测试中使用的是
163的免费信箱,发送时老是报错:
ORA-20000: Failed to send mail due to the following error:
ORA-29279: SMTP 永久性错误: 553 You are not authorized to send mail as <MAIL FROM:demo@163.com>, authentication is required

后来在metalink上找到解决方法:要在程序中增加登录smtp服务器的过程!



测试环境: RedHat AS 3.0 Oracle 9.2.0.6
SMTP服务器: smtp.163.com(ip地址202.108.44.205)

下面是存储过程的源代码,注意数据库服务器必须要能访问smtp.163.com

CREATE OR REPLACE PROCEDURE send_mail (
p_recipient IN VARCHAR2,
p_message IN VARCHAR2,
p_subject IN VARCHAR2 default 'Oracle Perf Report '||to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),
p_sender IN VARCHAR2 default
'demo@163.com')

IS
v_mailhost varchar2(30) := '202.108.44.205'; -- SMTP服务器地址
mail_conn utl_smtp.connection;
msg varchar2(4000);

p_user varchar2(30) := 'demo'; -- 登录SMTP服务器的用户名
p_pass varchar2(30) := 'demo'; -- 登录SMTP服务器的密码

BEGIN
/* 创建要发送的邮件内容 注意报头信息和邮件正文之间要空一行 */
msg := 'Date:' ||to_char(sysdate,'dd mon yy hh24:mi:ss') || utl_tcp.CRLF ||
'From: ' || p_sender || '<'||p_sender||'>' ||utl_tcp.CRLF ||
'To: '|| p_recipient || '<' || p_recipient || '>' ||utl_tcp.CRLF||
'Subject: '||p_subject || utl_tcp.CRLF ||utl_tcp.CRLF||
p_message;

-- dbms_output.put_line(msg);

mail_conn := utl_smtp.open_connection(v_mailhost,25);
utl_smtp.helo(mail_conn,v_mailhost);

/* smtp服务器登录校验 */
utl_smtp.command(mail_conn, 'AUTH LOGIN');
utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_user))));
utl_smtp.command(mail_conn, utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_pass))));

utl_smtp.mail(mail_conn,p_sender);
utl_smtp.rcpt(mail_conn,p_recipient);

/* 发送数据 */
utl_smtp.data(mail_conn, msg);
utl_smtp.quit(mail_conn);

EXCEPTION

WHEN OTHERS THEN
dbms_output.put_line(dbms_utility.format_error_stack);
dbms_output.put_line(dbms_utility.format_call_stack);

END send_mail;

测试这个存储过程:
SQL> exec send_mail(
'demo2@163.com','This is a oracle send mail demo!!!');

PL/SQL procedure successfully completed


参考资料:

1、《Oracle9i Supplied PL/SQL Packages and Types Reference》100 UTL_SMTP
2、网友mugen的《oracle 发邮件的程序》:
http://blog.itpub.net/post/76/9913


okone96 发表于:2007.01.04 14:40 ::分类: ( 数据库 ) ::阅读:(328次) :: 评论 (0)
===========================================================
===========================================================

SQL SERVER临时表 临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。有本地和全局两种类型的临时表,二者在名称、可见性和可用性上均不相同。
本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 Microsoft® SQL Server™ 2000 实例断开连接时被删除。全局临时表的名称以数学符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。 例如,如果创建名为 employees 的表,则任何人只要在数据库中有使用该表的安全权限就可以使用该表,除非它已删除。如果创建名为 #employees 的本地临时表,只有您能对该表执行操作且在断开连接时该表删除。如果创建名为 ##employees 的全局临时表,数据表中的任何用户均可对该表执行操作。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果该表在您创建后有其他用户使用,则 SQL Server在所有用户断开连接后删除该表

ORACLE临时表和SQLSERVER临时表异同 SQL SERVER临时表是一种”内存表”,表是存储在内存中的.ORACLE临时表除非执行DROP TABLE,否则表定义会保留在数据字典中. SQL SERVER临时表不存在类似ORACLE临时表 事务级别 上的功能. SQL SERVER本地临时表(#) 与 ORACLE的会话级别临时表类似,但是在会话退出的时候,ORACLE不会删除表. SQL SERVER的全局临时表(##) 是指多个连接共享同一片内存.当没有指针引用该内存区域时,SQL SERVER自动释放全局临时表. 由于ORACLE不是一种 内存中的数据库. 所以如果ORACLE类似SQL SERVER 频繁的对临时表进行建立和删除,必定会影响性能.所以ORACLE会保留临时表的定义直到用户DROP TABLE. 在ORACLE中,如果需要多个用户共享一个表(类似SQL SERVER的全局临时表##).则可以利用永久表,并且在表中添加一些可以唯一标识用户的列.利用触发器和视图.当用户退出的时候,根据该登陆用户的唯一信息删除相应的表中的数据. 这种方法给ORACLE带来了一定量的负载.


okone96 发表于:2007.01.04 14:38 ::分类: ( 数据库 ) ::阅读:(624次) :: 评论 (0)
===========================================================
===========================================================
表demo是重复拷贝自dba_objects,有88万左右,不重复的是27323,没有索引
方法一:delete from demo a where a.rowid <> (select max(rowid) from demo b where
b.object_id=a.object_id);
耗时:几个小时以上

方法二: delete from demo where rowid in
(select rid from
(select rowid rid,row_number() over(partition by object_id order by rowid) rn
from demo)
where rn <> 1 );
耗时:30秒

方法三: create table demo2 as
select object_id,owner... from
(select demo.*,row_number() over(partition by object_id order by rowid) rn from demo)
where rn = 1;
truncate table demo; insert into demo select * from demo2; drop table demo2;
共耗时: 10秒,适合大数据量的情况,产生更少回滚量;


okone96 发表于:2007.01.04 14:35 ::分类: ( 数据库 ) ::阅读:(217次) :: 评论 (0)
===========================================================
===========================================================

我们知道可以设置表的属性CACHE将表数据放入数据缓存中,也可以设置表将其放入KEEP缓冲池,这两者的区别如下:

BUFFER POOL包括DEFAULT、KEEP、RECYCLE三个POOL,其大小分别对应三个参数:
DB_CACHE_SIZE, DB_KEEP_CACHE_SIZE, DB_RECYCLE_CACHE_SZIE,这三个POOL相互独立,没有包含的关系。
语法如下:
create/alter table ...... storage(buffer_pool keep);
当表被读入的时候,放入keep pool,keep pool 中的数据会尽量长时间的保留,
保留的时间长短依据keep pool的负载而定。

create/alter table ...... cache;
当全表扫描时,放入default pool 的LRU热端(如无cache,则放入LRU冷端,很快就会
被age out),适合频繁使用的小表,如果有很多表要cache,那应该把表放如keep pool.

全表扫描时,数据是放入default pool的LRU冷端,所以可能很快就会被从内存中age out,
对一些频繁使用的小表来说效率就比较底了,所以使用cache 子句,在全表扫描时,让oracle
把数据放入LRU的热端,避免很快被age out,如果有太多的表cache,LRU链表会很拥挤,LRU机
制也会受影响,所以该把表放入keep pool,而且cache子句也不适合大表,因为有可能这个大
表会占据整个LRU链表。

对于放入KEEP POOL中的表数据,要么全表放入,要么全表都out,不会只放入一部分数据。

当BUFFER_POOL和CACHE同时使用时,KEEP比NOCACHE有优先权。
BUFFER_POOL用来指定存贮的缓冲池,而CACHE/NOCACHE指定存储的方式。


附注:对于8i,需要设置参数buffer_pool_keep,还要修改 db_block_lru_latches,
该参数默认是1,无法使用buffer_pool_keep。该参数应该比2*3*CPU数量少,但是要
大于 1,才能使用buffer_pool_keep。buffer_pool_keep从db_block_buffers中分配,
因此也要小于db_block_buffers。


okone96 发表于:2007.01.04 14:34 ::分类: ( 数据库 ) ::阅读:(294次) :: 评论 (0)
===========================================================
===========================================================

最近听朋友说sqlserver平台上update操作比oracle要快得多,于是做了下测试.测试机就是pc机,同时安装oracle9204和sqlserver2000,分别单独启动进行测试.

对于100万行具有4个int类型的表,同时更新4个字段,sqlserver要37秒,oracle要164秒,差距很明显.经过查阅相关资料,知道sqlserver在update的时候居然是表级锁,就是说其它会话不能对该表进行update,会被阻塞,即使update的行和第一个会话update的行不一样也不行.即sqlserver是通过锁住整个表资源来达到update的高性能,牺牲了并行性,当有大量用户同时进行update时就会导致整个系统全部慢下来.而oracle是行级锁,在并发性方面就有很大的优势.


okone96 发表于:2007.01.04 14:33 ::分类: ( 数据库 ) ::阅读:(230次) :: 评论 (0)
===========================================================
===========================================================

今天纠正了一个概念: 以前一直以为char类型的比较就是直接比较,和varchar2比较一样,汗...........
主要是平时设计表时基本都用varchar2,很少用char

关于字符值的比较, Oracle使用以下两种比较规则:

1、空格补齐比较语法

对于类型CHAR、NCHAR、text literals、USER函数值, 在进行比较时, 先在较短的那个
字符串后补上空格以使长度相等, 然后再进行比较.

所以, 'ab'='ab '

2、非补齐比较语法

对于类型VARCHAR2、NVARCHAR2, 则不用补齐, 直接进行比较.

C:>sqlplus scott/tiger@vm_db

SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 9月 26 09:26:02 2006

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


连接到:
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

SQL> drop table demo;

Table dropped

SQL> create table demo (d1 char(6), d2 varchar2(6));

Table created

SQL> insert into demo values ('1','1');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from demo where d1='1 ';

D1 D2
------ ------
1 1

SQL> select * from demo where d2='1 ';

D1 D2
------ ------

SQL> select * from dual where 'a'='a ';

DUMMY
-----
X

SQL> select * from dual where user='SCOTT ';

DUMMY
-----
X


okone96 发表于:2007.01.04 14:28 ::分类: ( 数据库 ) ::阅读:(297次) :: 评论 (0)
===========================================================
===========================================================

对于这种大型对象的处理,在Oracle中有有专门的函数DBMS_LOB.COMPARE,而SQLSERVER中没有专门的处
理函数,只能通过使用substring函数一段一段的从image数据中截取放到varbinary类型数据(最长8k),然后再对
varbinary类型数据进行比较。以下是我写好的一个比较image的函数例子:

IF object_id('compare_image') IS NOT NULL DROP FUNCTION compare_image
GO

create function compare_image(@a1 image, @a2 image) returns int
-- if match, return 1
as
begin
declare @n int, @i int, @j int
declare @b1 varbinary(8000), @b2 varbinary(8000)
set @n = 1
if datalength(@a1) <> datalength(@a2) -- different length
set @n = 0
else
begin
set @i = 0
set @j = (datalength(@a1) - 1) / 8000 + 1
while @i <= @j
begin
set @b1 = substring(@a1, @i * 8000 + 1, case @i when @j then datalength(@a1) % 8000 else 8000 end)
set @b2 = substring(@a2, @i * 8000 + 1, case @i when @j then datalength(@a2) % 8000 else 8000 end)
if @b1 <> @b2
begin
set @n = 0
break
end
set @i = @i + 1
end
end
return(@n)
end
go


okone96 发表于:2007.01.04 14:25 ::分类: ( 数据库 ) ::阅读:(275次) :: 评论 (0)
===========================================================
===========================================================

方法1:使用to_char函数

select sum(sal) ,
to_char(HIREDATE,'yyyy')||':'||to_char(HIREDATE,'IW') week_sn
from scott.emp
group by to_char(HIREDATE,'yyyy')||':'||to_char(HIREDATE,'IW');

格式'IW'返回当前日期是当年的第几周


方法2:使用next_day()函数

select sum(sal) ,
NEXT_DAY(trunc(HIREDATE),'星期一')-7 weekstart,
NEXT_DAY(trunc(HIREDATE),'星期一') weekend
from scott.emp
group by NEXT_DAY(trunc(HIREDATE),'星期一');

上面这个例子是在中文字符集下使用,如果在英文字符集下则使用:

select sum(sal) ,
NEXT_DAY(trunc(HIREDATE),'Monday')-7 weekstart,
NEXT_DAY(trunc(HIREDATE),'Monday') weekend
from scott.emp
group by NEXT_DAY(trunc(HIREDATE),'Monday');

两种方法比较,第二种方法能够方便的给出周开始和周结束日期,更方便些。


okone96 发表于:2007.01.04 14:23 ::分类: ( 数据库 ) ::阅读:(512次) :: 评论 (0)
===========================================================
===========================================================

http://www.qqgb.com/DataDB/develop/DataDB_134186.html
建立一个 Web 应用,分页浏览功能必不可少。这个问题是数据库处理中十分常见的问题。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存。游标一建立,就将相关的记录锁住,直到取消游标。游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机。

更重要的是,对于非常大的数据模型而言,分页检索时,如果按照传统的每次都加载整个数据源的方法是非常浪费资源的。现在流行的分页方法一般是检索页面大小的块区的数据,而非检索所有的数据,然后单步执行当前行。

最早较好地实现这种根据页面大小和页码来提取数据的方法大概就是“俄罗斯存储过程”。这个存储过程用了游标,由于游标的局限性,所以这个方法并没有得到大家的普遍认可。

后来,网上有人改造了此存储过程,下面的存储过程就是结合我们的办公自动化实例写的分页存储过程:

 查看全文
okone96 发表于:2006.12.05 15:04 ::分类: ( 数据库 ) ::阅读:(417次) :: 评论 (0)
===========================================================
===========================================================
1. 当前系统日期、时间
select getdate()

2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值
例如:向日期加上2天
select dateadd(day,2,'2004-10-15') --返回:2004-10-17 00:00:00.000

3. datediff 返回跨两个指定日期的日期和时间边界数。
select datediff(day,'2004-09-01','2004-09-18') --返回:17

4. datepart 返回代表指定日期的指定日期部分的整数。
SELECT DATEPART(month, '2004-10-15') --返回 10

5. datename 返回代表指定日期的指定日期部分的字符串
SELECT datename(weekday, '2004-10-15') --返回:星期五

6. day(), month(),year() --可以与datepart对照一下

select 当前日期=convert(varchar(10),getdate(),120)
,当前时间=convert(varchar(8),getdate(),114)

select datename(dw,'2004-10-15')

select 本年第多少周=datename(week,'2004-10-15')
,今天是周几=datename(weekday,'2004-10-15')

函数参数/功能
GetDate( )返回系统目前的日期与时间
DateDiff (interval,date1,date2)以interval 指定的方式,返回date2 与date1两个日期之间的差值 date2-date1
DateAdd (interval,number,date)以interval指定的方式,加上number之后的日期
DatePart (interval,date)返回日期date中,interval指定部分所对应的整数值
DateName (interval,date)返回日期date中,interval指定部分所对应的字符串名称

参数 interval的设定值如下:

缩 写(Sql Server)Access 和 ASP说明
YearYyyyyy年 1753 ~ 9999
QuarterQqq 季 1 ~ 4
MonthMmm 月1 ~ 12
Day of yearDyy一年的日数,一年中的第几日 1-366
DayDdd 日,1-31
WeekdayDww一周的日数,一周中的第几日 1-7
WeekWkww周,一年中的第几周 0 ~ 51
HourHhh 时0 ~ 23
MinuteMin 分钟0 ~ 59
SecondSss秒 0 ~ 59
MillisecondMs-毫秒 0 ~ 999

access 和 asp 中用date()和now()取得系统日期时间;其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,这些函数的用法也类似

举例:
1.GetDate() 用于sql server :select GetDate()

2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值为 514592 秒
DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值为 5 天

3.DatePart('w','2005-7-25 22:56:32')返回值为 2 即星期一(周日为1,周六为7)
DatePart('d','2005-7-25 22:56:32')返回值为 25即25号
DatePart('y','2005-7-25 22:56:32')返回值为 206即这一年中第206天
DatePart('yyyy','2005-7-25 22:56:32')返回值为 2005即2005年

SQL Server DATEPART() 函数返回 SQLServer datetime 字段的一部分。

SQL Server DATEPART() 函数的语法是:
DATEPART(portion, datetime)
其中 datetime 是 SQLServer datetime 字段和部分的名称是下列之一: Ms for Milliseconds
Yy for Year
Qq for Quarter of the Year
Mm for Month
Dy for the Day of the Year
Dd for Day of the Month
Wk for Week
Dw for the Day of the Week
Hh for Hour
Mi for Minute
Ss for Second

详细的说明:

通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。你可以通过@@DATEFIRST函数来检查第一天设置。

为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDIFF和DATEADD函数以及时间间隔可以阅读微软联机帮助。

使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。你必须从时间间隔这个方面来考虑。比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。

一个月的第一天

第一个例子,我将告诉你如何从当前日期去这个月的最后一天。请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。

这是计算一个月第一天的SQL 脚本:
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)

我们把这个语句分开来看看它是如何工作的。最核心的函数是getdate(),大部分人都知道这个是返回当前的日期和时间的函数。下一个执行的函数DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的月数。记住:时期和时间变量和毫秒一样是从“1900-01-01 00:00:00.000”开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。另外,计算出来的日期的时间部分将会是“00:00:00.000”。

这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。


本周的星期一

这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。

SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)

一年的第一天

现在用年(yy)的时间间隔来显示这一年的第一天。

SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)

季度的第一天

假如你要计算这个季度的第一天,这个例子告诉你该如何做。

SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)

当天的半夜

曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。

SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)

深入DATEDIFF和DATEADD函数计算

你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。

目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。

这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。

上个月的最后一天

这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住,在Sql Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))

计算出来的日期的时间部分包含了一个Sql Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。

去年的最后一天

连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))

本月的最后一天

现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01”返回的时间间隔上加1。通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。

SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))

本年的最后一天

你现在应该掌握这个的做法,这是计算本年最后一天脚本

SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))

本月的第一个星期一

好了,现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。

select DATEADD(wk, DATEDIFF(wk,0,
dateadd(dd,6-datepart(day,getdate()),getdate())), 0)

在这个例子里,我使用了“本周的星期一”的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。

总结

我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。

---------------------------------------------------------------
附录,其他日期处理方法

1)去掉时分秒
declare @ datetime
set @ = getdate() --'2003-7-1 10:00:00'
SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0)

2)显示星期几
select datename(weekday,getdate())

3)如何取得某个月的天数
declare @m int
set @m=2 --月份
select datediff(day,'2003-'+cast(@m as varchar)+'-15' ,'2003-'+cast(@m+1 as varchar)+'-15')
另外,取得本月天数
select datediff(day,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate()) as varchar)+'-15' ,cast(month(GetDate()) as varchar)+'-'+cast(month(GetDate())+1 as varchar)+'-15')
或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天
SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)))

4)判断是否闰年:
SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then '平年' else '闰年' end
或者
select case datediff(day,datename(year,getdate())+'-02-01',dateadd(mm,1,datename(year,getdate())+'-02-01'))
when 28 then '平年' else '闰年' end

5)一个季度多少天
declare @m tinyint,@time smalldatetime
select @m=month(getdate())
select @m=case when @m between 1 and 3 then 1
when @m between 4 and 6 then 4
when @m between 7 and 9 then 7
else 10 end
select @time=datename(year,getdate())+'-'+convert(varchar(10),@m)+'-01'
select datediff(day,@time,dateadd(mm,3,@time))


okone96 发表于:2006.12.02 17:33 ::分类: ( 数据库 ) ::阅读:(2044次) :: 评论 (1)
===========================================================
===========================================================

适合的格式为:yyyy dd mm hh ii ss的各种格式

CREATE FUNCTION fn_DateToFormatString(@date datetime, @format varchar(20))
RETURNS varchar(20) AS BEGIN DECLARE @result varchar(20) SELECT @result = replace(replace(replace(replace(replace(replace(@format,
'yyyy',
'20' + substring(CONVERT(char(8),
@date, 3), 7, 2)),
'MM',
substring(CONVERT(char(8),
@date, 3), 4, 2)), 'dd',
substring(CONVERT(char(8),
@date, 3), 1, 2)), 'hh',
substring(CONVERT(char(8),
@date, 8), 1, 2)),
'ii',
substring(CONVERT(char(8),
@date, 8), 4, 2)), 'ss',
substring(CONVERT(char(8),
@date, 8), 7, 2))
RETURN @result END


调用方法

select dbo. fn_DateToFormatString(getdate(),'yyyy-MM-dd')
select dbo. fn_DateToFormatString(getdate(),'yyyy-MM-dd hh:ii:ss')
select dbo. fn_DateToFormatString(getdate(),'yyyy-MM-01')