﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Energy of Love-随笔分类-Oracle</title><link>http://www.blogjava.net/titanaly/category/40112.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 19 Dec 2009 11:17:46 GMT</lastBuildDate><pubDate>Sat, 19 Dec 2009 11:17:46 GMT</pubDate><ttl>60</ttl><item><title>Oracle 日期查询</title><link>http://www.blogjava.net/titanaly/archive/2009/12/15/306016.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Tue, 15 Dec 2009 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/12/15/306016.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/306016.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/12/15/306016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/306016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/306016.html</trackback:ping><description><![CDATA[<p>select&nbsp;&nbsp; *&nbsp;&nbsp; from&nbsp;&nbsp; mytable&nbsp;&nbsp; where&nbsp;&nbsp; to_char(install_date,'YYYYMMDD')&nbsp;&nbsp;
&gt;&nbsp;&nbsp; '20050101'&nbsp;&nbsp;</p>
<p>select&nbsp;&nbsp; *&nbsp;&nbsp; from&nbsp;&nbsp; mytable&nbsp;&nbsp; where&nbsp;&nbsp; install_date&nbsp;&nbsp;&nbsp;&nbsp; &gt;&nbsp;&nbsp;
to_date('20050101','yyyymmdd');</p>
<p>取得当前日期是本月的第几周</p>
<p>SQL&gt;&nbsp;&nbsp; select&nbsp;&nbsp; to_char(sysdate,'YYYYMMDD&nbsp;&nbsp; W&nbsp;&nbsp; HH24:MI:SS')&nbsp;&nbsp; from&nbsp;&nbsp;
dual; <br />
&nbsp;&nbsp; <br />
TO_CHAR(SYSDATE,'YY <br />
------------------- <br />
20030327&nbsp;&nbsp; 4&nbsp;&nbsp;
18:16:09 <br />
&nbsp;&nbsp; <br />
SQL&gt;&nbsp;&nbsp; select&nbsp;&nbsp; to_char(sysdate,'W')&nbsp;&nbsp; from&nbsp;&nbsp; dual;
<br />
&nbsp;&nbsp; <br />
T <br />
- <br />
4</p>
<p>№2:取得当前日期是一个星期中的第几天,注意星期日是第一天</p>
<p>SQL&gt;&nbsp;&nbsp; select&nbsp;&nbsp; sysdate,to_char(sysdate,'D')&nbsp;&nbsp; from&nbsp;&nbsp; dual; <br />
&nbsp;&nbsp;
<br />
SYSDATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T <br />
---------&nbsp;&nbsp; - <br />
27-MAR-03&nbsp;&nbsp; 5</p>
<p>类似:</p>
<p>select&nbsp;&nbsp; to_char(sysdate,'yyyy')&nbsp;&nbsp; from&nbsp;&nbsp; dual;&nbsp;&nbsp; --年 <br />
select&nbsp;&nbsp;
to_char(sysdate,'Q'&nbsp;&nbsp; from&nbsp;&nbsp; dual;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --季 <br />
select&nbsp;&nbsp;
to_char(sysdate,'mm')&nbsp;&nbsp; from&nbsp;&nbsp; dual;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --月 <br />
select&nbsp;&nbsp;
to_char(sysdate,'dd')&nbsp;&nbsp; from&nbsp;&nbsp; dual;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --日 <br />
ddd&nbsp;&nbsp; 年中的第几天 <br />
WW&nbsp;&nbsp;
年中的第几个星期 <br />
W&nbsp;&nbsp; 该月中第几个星期</p>
<p>DAY 周中的星期几 <br />
D&nbsp;&nbsp; 今天对映的NUMBER</p>
<p><span style="color: #ff00ff;">'1'</span>,<span style="color: #ff00ff;">'星期日'</span>,&nbsp;&nbsp;<span style="color: #ff00ff;">'2'</span>,<span style="color: #ff00ff;">'星期一'</span>,
<span style="color: #ff00ff;">'3'</span>,<span style="color: #ff00ff;">'星期二'</span>, <span style="color: #ff00ff;">'4'</span>,<span style="color: #ff00ff;">'星期三'</span>,
<span style="color: #ff00ff;">'5'</span>,<span style="color: #ff00ff;">'星期四'</span>,&nbsp;&nbsp;<span style="color: #ff00ff;">'6'</span>,<span style="color: #ff00ff;">'星期五'</span>,&nbsp;&nbsp;<span style="color: #ff00ff;">'7'</span>,<span style="color: #ff00ff;">'星期六'</span><br />
hh&nbsp;&nbsp; 小时(12) <br />
hh24&nbsp;&nbsp; 小时(24) <br />
Mi&nbsp;&nbsp; 分
<br />
ss&nbsp;&nbsp; 秒</p>
<p>№3:取当前日期是星期几中文显示:</p>
<p>SQL&gt;&nbsp;&nbsp; select&nbsp;&nbsp; to_char(sysdate,'day')&nbsp;&nbsp; from&nbsp;&nbsp; dual; <br />
&nbsp;&nbsp;
<br />
TO_CHAR(SYSDATE,'DAY') <br />
---------------------- <br />
星期四</p>
<p>№4:如果一个表在一个date类型的字段上面建立了索引，如何使用</p>
<p>alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'</p>
<p><br />
№5: 得到当前的日期<br />
select sysdate from dual;</p>
<p>№6: 得到当天凌晨0点0分0秒的日期<br />
select trunc(sysdate) from dual;</p>
<p>-- 得到这天的最后一秒<br />
select trunc(sysdate) + 0.99999 from dual;</p>
<p>-- 得到小时的具体数值<br />
select trunc(sysdate) + 1/24 from dual;</p>
<p>select trunc(sysdate) + 7/24 from dual;</p>
<p>№7:得到明天凌晨0点0分0秒的日期</p>
<p>select trunc(sysdate+1) from dual;</p>
<p>select trunc(sysdate)+1 from dual;</p>
<p><br />
№8: 本月一日的日期<br />
select trunc(sysdate,'mm') from dual;</p>
<p><br />
№9:得到下月一日的日期<br />
select trunc(add_months(sysdate,1),'mm') from dual;</p>
<p>№10:返回当前月的最后一天?<br />
select last_day(sysdate) from dual;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
select
last_day(trunc(sysdate)) from dual; <br />
select trunc(last_day(sysdate)) from
dual;<br />
select trunc(add_months(sysdate,1),'mm') - 1 from dual;</p>
<p><br />
№11: 得到一年的每一天<br />
select trunc(sysdate,'yyyy')+ rn -1
date0<br />
from<br />
(select rownum rn from all_objects<br />
where rownum&lt;366);</p>
<p><br />
№12:今天是今年的第N天<br />
SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;</p>
<p>№13:如何在给现有的日期加上2年<br />
select add_months(sysdate,24) from dual;</p>
<p>№14:判断某一日子所在年分是否为润年<br />
select
decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','平年') from
dual;</p>
<p>№15:判断两年后是否为润年<br />
select
decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','平年')
from dual;</p>
<p><br />
№16:得到日期的季度</p>
<p>select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;</p>
<p>select to_char(sysdate, 'Q') from dual;</p>
<p><br />
</p>
<p>获取本周一,周日的日期</p>
<p>select trunc(sysdate,'d')+1,trunc(sysdate,'d')+7 from dual;<br />
</p>
<img src ="http://www.blogjava.net/titanaly/aggbug/306016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-12-15 13:40 <a href="http://www.blogjava.net/titanaly/archive/2009/12/15/306016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> oracle行转列</title><link>http://www.blogjava.net/titanaly/archive/2009/12/15/306009.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Tue, 15 Dec 2009 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/12/15/306009.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/306009.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/12/15/306009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/306009.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/306009.html</trackback:ping><description><![CDATA[1.<br />
概述<br />
最近论坛很多人提的问题都与行列转换有关系，所以我对行列转换的相关知识做了一个总结，希望对大家有所帮助，同时有何错疏，恳请大家指出，我也是在写作过程中学习，算是一起和大家学习吧！<br />
行列转换包括以下六种情况：<br />
1)<br />
列转行<br />
2)<br />
行转列<br />
3)<br />
多列转换成字符串<br />
4)<br />
多行转换成字符串<br />
5)<br />
字符串转换成多列<br />
6)<br />
字符串转换成多行<br />
下面分别进行举例介绍。<br />
首先声明一点，有些例子需要如下10g及以后才有的知识：<br />
A.<br />
掌握model子句<br />
B.<br />
正则表达式<br />
C.<br />
加强的层次查询<br />
讨论的适用范围只包括8i,9i,10g及以后版本。<br />
2.<br />
列转行<br />
CREATE TABLE t_col_row(<br />
ID INT,<br />
c1 VARCHAR2(10),<br />
c2 VARCHAR2(10),<br />
c3 VARCHAR2(10));<br />
INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');<br />
INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);<br />
INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');<br />
INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');<br />
INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);<br />
INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');<br />
INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);<br />
COMMIT;<br />
SELECT * FROM t_col_row;<br />
2.1<br />
UNION ALL<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id, 'c1' cn, c1 cv<br />
FROM t_col_row<br />
UNION ALL<br />
SELECT id, 'c2' cn, c2 cv<br />
FROM t_col_row<br />
UNION ALL<br />
SELECT id, 'c3' cn, c3 cv FROM t_col_row;<br />
若空行不需要转换，只需加一个where条件，<br />
WHERE COLUMN IS NOT NULL 即可。<br />
2.2<br />
MODEL<br />
适用范围：10g及以后<br />
SELECT id, cn, cv FROM t_col_row<br />
MODEL<br />
RETURN UPDATED ROWS<br />
PARTITION BY (ID)<br />
DIMENSION BY (0 AS n)<br />
MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)<br />
RULES UPSERT ALL<br />
(<br />
cn[1] = 'c1',<br />
cn[2] = 'c2',<br />
cn[3] = 'c3',<br />
cv[1] = c1[0],<br />
cv[2] = c2[0],<br />
cv[3] = c3[0]<br />
)<br />
ORDER BY ID,cn;<br />
2.3<br />
COLLECTION<br />
适用范围：8i,9i,10g及以后版本<br />
要创建一个对象和一个集合：<br />
CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10));<br />
CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;<br />
SELECT id, t.cn AS cn, t.cv AS cv<br />
FROM t_col_row,<br />
TABLE(cv_varr(cv_pair('c1', t_col_row.c1),<br />
cv_pair('c2', t_col_row.c2),<br />
cv_pair('c3', t_col_row.c3))) t<br />
ORDER BY 1, 2;<br />
3.<br />
行转列<br />
CREATE TABLE t_row_col AS<br />
SELECT id, 'c1' cn, c1 cv<br />
FROM t_col_row<br />
UNION ALL<br />
SELECT id, 'c2' cn, c2 cv<br />
FROM t_col_row<br />
UNION ALL<br />
SELECT id, 'c3' cn, c3 cv FROM t_col_row;<br />
SELECT * FROM t_row_col ORDER BY 1,2;<br />
3.1<br />
AGGREGATE FUNCTION<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id,<br />
MAX(decode(cn, 'c1', cv, NULL)) AS c1,<br />
MAX(decode(cn, 'c2', cv, NULL)) AS c2,<br />
MAX(decode(cn, 'c3', cv, NULL)) AS c3<br />
FROM t_row_col<br />
GROUP BY id<br />
ORDER BY 1;<br />
MAX聚集函数也可以用sum、min、avg等其他聚集函数替代。<br />
被指定的转置列只能有一列，但固定的列可以有多列，请看下面的例子：<br />
SELECT mgr, deptno, empno, ename FROM emp ORDER BY 1, 2;<br />
SELECT mgr,<br />
deptno,<br />
MAX(decode(empno, '7788', ename, NULL)) "7788",<br />
MAX(decode(empno, '7902', ename, NULL)) "7902",<br />
MAX(decode(empno, '7844', ename, NULL)) "7844",<br />
MAX(decode(empno, '7521', ename, NULL)) "7521",<br />
MAX(decode(empno, '7900', ename, NULL)) "7900",<br />
MAX(decode(empno, '7499', ename, NULL)) "7499",<br />
MAX(decode(empno, '7654', ename, NULL)) "7654"<br />
FROM emp<br />
WHERE mgr IN (7566, 7698)<br />
AND deptno IN (20, 30)<br />
GROUP BY mgr, deptno<br />
ORDER BY 1, 2;<br />
这里转置列为empno，固定列为mgr，deptno。<br />
还有一种行转列的方式，就是相同组中的行值变为单个列值，但转置的行值不变为列名：<br />
ID CN_1 CV_1 CN_2 CV_2 CN_3 CV_3<br />
1 c1 v11 c2 v21 c3 v31<br />
2 c1 v12 c2 v22 c3<br />
3 c1 v13 c2 c3 v33<br />
4 c1 c2 v24 c3 v34<br />
5 c1 v15 c2 c3<br />
6 c1 c2 c3 v35<br />
7 c1 c2 c3<br />
这种情况可以用分析函数实现：<br />
SELECT id,<br />
MAX(decode(rn, 1, cn, NULL)) cn_1,<br />
MAX(decode(rn, 1, cv, NULL)) cv_1,<br />
MAX(decode(rn, 2, cn, NULL)) cn_2,<br />
MAX(decode(rn, 2, cv, NULL)) cv_2,<br />
MAX(decode(rn, 3, cn, NULL)) cn_3,<br />
MAX(decode(rn, 3, cv, NULL)) cv_3<br />
FROM (SELECT id,<br />
cn,<br />
cv,<br />
row_number() over(PARTITION BY id ORDER BY cn, cv) rn<br />
FROM t_row_col)<br />
GROUP BY ID;<br />
3.2<br />
PL/SQL<br />
适用范围：8i,9i,10g及以后版本<br />
这种对于行值不固定的情况可以使用。<br />
下面是我写的一个包，包中<br />
p_rows_column_real用于前述的第一种不限定列的转换；<br />
p_rows_column用于前述的第二种不限定列的转换。<br />
CREATE OR REPLACE PACKAGE pkg_dynamic_rows_column AS<br />
TYPE refc IS REF CURSOR;<br />
PROCEDURE p_print_sql(p_txt VARCHAR2);<br />
FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)<br />
RETURN VARCHAR2;<br />
PROCEDURE p_rows_column(p_table IN VARCHAR2,<br />
p_keep_cols IN VARCHAR2,<br />
p_pivot_cols IN VARCHAR2,<br />
p_where IN VARCHAR2 DEFAULT NULL,<br />
p_refc IN OUT refc);<br />
PROCEDURE p_rows_column_real(p_table IN VARCHAR2,<br />
p_keep_cols IN VARCHAR2,<br />
p_pivot_col IN VARCHAR2,<br />
p_pivot_val IN VARCHAR2,<br />
p_where IN VARCHAR2 DEFAULT NULL,<br />
p_refc IN OUT refc);<br />
END;<br />
/<br />
CREATE OR REPLACE PACKAGE BODY pkg_dynamic_rows_column AS<br />
PROCEDURE p_print_sql(p_txt VARCHAR2) IS<br />
v_len INT;<br />
BEGIN<br />
v_len := length(p_txt);<br />
FOR i IN 1 .. v_len / 250 + 1 LOOP<br />
dbms_output.put_line(substrb(p_txt, (i - 1) * 250 + 1, 250));<br />
END LOOP;<br />
END;<br />
FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)<br />
RETURN VARCHAR2 IS<br />
v_first INT;<br />
v_last INT;<br />
BEGIN<br />
IF p_seq &lt; 1 THEN<br />
RETURN NULL;<br />
END IF;<br />
IF p_seq = 1 THEN<br />
IF instr(p_str, p_division, 1, p_seq) = 0 THEN<br />
RETURN p_str;<br />
ELSE<br />
RETURN substr(p_str, 1, instr(p_str, p_division, 1) - 1);<br />
END IF;<br />
ELSE<br />
v_first := instr(p_str, p_division, 1, p_seq - 1);<br />
v_last := instr(p_str, p_division, 1, p_seq);<br />
IF (v_last = 0) THEN<br />
IF (v_first &gt; 0) THEN<br />
RETURN substr(p_str, v_first + 1);<br />
ELSE<br />
RETURN NULL;<br />
END IF;<br />
ELSE<br />
RETURN substr(p_str, v_first + 1, v_last - v_first - 1);<br />
END IF;<br />
END IF;<br />
END f_split_str;<br />
PROCEDURE p_rows_column(p_table IN VARCHAR2,<br />
p_keep_cols IN VARCHAR2,<br />
p_pivot_cols IN VARCHAR2,<br />
p_where IN VARCHAR2 DEFAULT NULL,<br />
p_refc IN OUT refc) IS<br />
v_sql VARCHAR2(4000);<br />
TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;<br />
v_keep v_keep_ind_by;<br />
TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;<br />
v_pivot v_pivot_ind_by;<br />
v_keep_cnt INT;<br />
v_pivot_cnt INT;<br />
v_max_cols INT;<br />
v_partition VARCHAR2(4000);<br />
v_partition1 VARCHAR2(4000);<br />
v_partition2 VARCHAR2(4000);<br />
BEGIN<br />
v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;<br />
v_pivot_cnt := length(p_pivot_cols) -<br />
length(REPLACE(p_pivot_cols, ',')) + 1;<br />
FOR i IN 1 .. v_keep_cnt LOOP<br />
v_keep(i) := f_split_str(p_keep_cols, ',', i);<br />
END LOOP;<br />
FOR j IN 1 .. v_pivot_cnt LOOP<br />
v_pivot(j) := f_split_str(p_pivot_cols, ',', j);<br />
END LOOP;<br />
v_sql := 'select max(count(*)) from ' || p_table || ' group by ';<br />
FOR i IN 1 .. v_keep.LAST LOOP<br />
v_sql := v_sql || v_keep(i) || ',';<br />
END LOOP;<br />
v_sql := rtrim(v_sql, ',');<br />
EXECUTE IMMEDIATE v_sql<br />
INTO v_max_cols;<br />
v_partition := 'select ';<br />
FOR x IN 1 .. v_keep.COUNT LOOP<br />
v_partition1 := v_partition1 || v_keep(x) || ',';<br />
END LOOP;<br />
FOR y IN 1 .. v_pivot.COUNT LOOP<br />
v_partition2 := v_partition2 || v_pivot(y) || ',';<br />
END LOOP;<br />
v_partition1 := rtrim(v_partition1, ',');<br />
v_partition2 := rtrim(v_partition2, ',');<br />
v_partition := v_partition || v_partition1 || ',' || v_partition2 ||<br />
', row_number() over (partition by ' || v_partition1 ||<br />
' order by ' || v_partition2 || ') rn from ' || p_table;<br />
v_partition := rtrim(v_partition, ',');<br />
v_sql := 'select ';<br />
FOR i IN 1 .. v_keep.COUNT LOOP<br />
v_sql := v_sql || v_keep(i) || ',';<br />
END LOOP;<br />
FOR i IN 1 .. v_max_cols LOOP<br />
FOR j IN 1 .. v_pivot.COUNT LOOP<br />
v_sql := v_sql || ' max(decode(rn,' || i || ',' || v_pivot(j) ||<br />
',null))' || v_pivot(j) || '_' || i || ',';<br />
END LOOP;<br />
END LOOP;<br />
IF p_where IS NOT NULL THEN<br />
v_sql := rtrim(v_sql, ',') || ' from (' || v_partition || ' ' ||<br />
p_where || ') group by ';<br />
ELSE<br />
v_sql := rtrim(v_sql, ',') || ' from (' || v_partition ||<br />
') group by ';<br />
END IF;<br />
FOR i IN 1 .. v_keep.COUNT LOOP<br />
v_sql := v_sql || v_keep(i) || ',';<br />
END LOOP;<br />
v_sql := rtrim(v_sql, ',');<br />
p_print_sql(v_sql);<br />
OPEN p_refc FOR v_sql;<br />
EXCEPTION<br />
WHEN OTHERS THEN<br />
OPEN p_refc FOR<br />
SELECT 'x' FROM dual WHERE 0 = 1;<br />
END;<br />
PROCEDURE p_rows_column_real(p_table IN VARCHAR2,<br />
p_keep_cols IN VARCHAR2,<br />
p_pivot_col IN VARCHAR2,<br />
p_pivot_val IN VARCHAR2,<br />
p_where IN VARCHAR2 DEFAULT NULL,<br />
p_refc IN OUT refc) IS<br />
v_sql VARCHAR2(4000);<br />
TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;<br />
v_keep v_keep_ind_by;<br />
TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;<br />
v_pivot v_pivot_ind_by;<br />
v_keep_cnt INT;<br />
v_group_by VARCHAR2(2000);<br />
BEGIN<br />
v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;<br />
FOR i IN 1 .. v_keep_cnt LOOP<br />
v_keep(i) := f_split_str(p_keep_cols, ',', i);<br />
END LOOP;<br />
v_sql := 'select ' || 'cast(' || p_pivot_col ||<br />
' as varchar2(200)) as ' || p_pivot_col || ' from ' || p_table ||<br />
' group by ' || p_pivot_col;<br />
EXECUTE IMMEDIATE v_sql BULK COLLECT<br />
INTO v_pivot;<br />
FOR i IN 1 .. v_keep.COUNT LOOP<br />
v_group_by := v_group_by || v_keep(i) || ',';<br />
END LOOP;<br />
v_group_by := rtrim(v_group_by, ',');<br />
v_sql := 'select ' || v_group_by || ',';<br />
FOR x IN 1 .. v_pivot.COUNT LOOP<br />
v_sql := v_sql || ' max(decode(' || p_pivot_col || ',' || chr(39) ||<br />
v_pivot(x) || chr(39) || ',' || p_pivot_val ||<br />
',null)) as "' || v_pivot(x) || '",';<br />
END LOOP;<br />
v_sql := rtrim(v_sql, ',');<br />
IF p_where IS NOT NULL THEN<br />
v_sql := v_sql || ' from ' || p_table || p_where || ' group by ' ||<br />
v_group_by;<br />
ELSE<br />
v_sql := v_sql || ' from ' || p_table || ' group by ' || v_group_by;<br />
END IF;<br />
p_print_sql(v_sql);<br />
OPEN p_refc FOR v_sql;<br />
EXCEPTION<br />
WHEN OTHERS THEN<br />
OPEN p_refc FOR<br />
SELECT 'x' FROM dual WHERE 0 = 1;<br />
END;<br />
END;<br />
/<br />
4.<br />
多列转换成字符串<br />
CREATE TABLE t_col_str AS<br />
SELECT * FROM t_col_row;<br />
这个比较简单，用||或concat函数可以实现：<br />
SELECT concat('a','b') FROM dual;<br />
4.1<br />
|| OR CONCAT<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT * FROM t_col_str;<br />
SELECT ID,c1||','||c2||','||c3 AS c123<br />
FROM t_col_str;<br />
5.<br />
多行转换成字符串<br />
CREATE TABLE t_row_str(<br />
ID INT,<br />
col VARCHAR2(10));<br />
INSERT INTO t_row_str VALUES(1,'a');<br />
INSERT INTO t_row_str VALUES(1,'b');<br />
INSERT INTO t_row_str VALUES(1,'c');<br />
INSERT INTO t_row_str VALUES(2,'a');<br />
INSERT INTO t_row_str VALUES(2,'d');<br />
INSERT INTO t_row_str VALUES(2,'e');<br />
INSERT INTO t_row_str VALUES(3,'c');<br />
COMMIT;<br />
SELECT * FROM t_row_str;<br />
5.1<br />
MAX + DECODE<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id,<br />
MAX(decode(rn, 1, col, NULL)) ||<br />
MAX(decode(rn, 2, ',' || col, NULL)) ||<br />
MAX(decode(rn, 3, ',' || col, NULL)) str<br />
FROM (SELECT id,<br />
col,<br />
row_number() over(PARTITION BY id ORDER BY col) AS rn<br />
FROM t_row_str) t<br />
GROUP BY id<br />
ORDER BY 1;<br />
5.2<br />
ROW_NUMBER + LEAD<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id, str<br />
FROM (SELECT id,<br />
row_number() over(PARTITION BY id ORDER BY col) AS rn,<br />
col || lead(',' || col, 1) over(PARTITION BY id ORDER BY col) ||<br />
lead(',' || col, 2) over(PARTITION BY id ORDER BY col) ||<br />
lead(',' || col, 3) over(PARTITION BY id ORDER BY col) AS str<br />
FROM t_row_str)<br />
WHERE rn = 1<br />
ORDER BY 1;<br />
5.3<br />
MODEL<br />
适用范围：10g及以后版本<br />
SELECT id, substr(str, 2) str FROM t_row_str<br />
MODEL<br />
RETURN UPDATED ROWS<br />
PARTITION BY(ID)<br />
DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)<br />
MEASURES (CAST(col AS VARCHAR2(20)) AS str)<br />
RULES UPSERT<br />
ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)<br />
(str[0] = str[0] || ',' || str[iteration_number+1])<br />
ORDER BY 1;<br />
5.4<br />
SYS_CONNECT_BY_PATH<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str<br />
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn<br />
FROM t_row_str) t<br />
START WITH rn = 1<br />
CONNECT BY rn = PRIOR rn + 1<br />
AND id = PRIOR id<br />
GROUP BY t.id;<br />
适用范围：10g及以后版本<br />
SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str<br />
FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn<br />
FROM t_row_str) t<br />
WHERE connect_by_isleaf = 1<br />
START WITH rn = 1<br />
CONNECT BY rn = PRIOR rn + 1<br />
AND id = PRIOR id;<br />
5.5<br />
WMSYS.WM_CONCAT<br />
适用范围：10g及以后版本<br />
这个函数预定义按','分隔字符串，若要用其他符号分隔可以用，replace将','替换。<br />
SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str<br />
FROM t_row_str<br />
GROUP BY id;<br />
6.<br />
字符串转换成多列<br />
其实际上就是一个字符串拆分的问题。<br />
CREATE TABLE t_str_col AS<br />
SELECT ID,c1||','||c2||','||c3 AS c123<br />
FROM t_col_str;<br />
SELECT * FROM t_str_col;<br />
6.1<br />
SUBSTR + INSTR<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id,<br />
c123,<br />
substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,<br />
substr(c123,<br />
instr(c123 || ',', ',', 1, 1) + 1,<br />
instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1) c2,<br />
substr(c123,<br />
instr(c123 || ',', ',', 1, 2) + 1,<br />
instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1) c3<br />
FROM t_str_col<br />
ORDER BY 1;<br />
6.2<br />
REGEXP_SUBSTR<br />
适用范围：10g及以后版本<br />
SELECT id,<br />
c123,<br />
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS c1,<br />
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS c2,<br />
rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS c3<br />
FROM t_str_col<br />
ORDER BY 1;<br />
7.<br />
字符串转换成多行<br />
CREATE TABLE t_str_row AS<br />
SELECT id,<br />
MAX(decode(rn, 1, col, NULL)) ||<br />
MAX(decode(rn, 2, ',' || col, NULL)) ||<br />
MAX(decode(rn, 3, ',' || col, NULL)) str<br />
FROM (SELECT id,<br />
col,<br />
row_number() over(PARTITION BY id ORDER BY col) AS rn<br />
FROM t_row_str) t<br />
GROUP BY id<br />
ORDER BY 1;<br />
SELECT * FROM t_str_row;<br />
7.1<br />
UNION ALL<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT id, 1 AS p, substr(str, 1, instr(str || ',', ',', 1, 1) - 1) AS cv<br />
FROM t_str_row<br />
UNION ALL<br />
SELECT id,<br />
2 AS p,<br />
substr(str,<br />
instr(str || ',', ',', 1, 1) + 1,<br />
instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv<br />
FROM t_str_row<br />
UNION ALL<br />
SELECT id,<br />
3 AS p,<br />
substr(str,<br />
instr(str || ',', ',', 1, 1) + 1,<br />
instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv<br />
FROM t_str_row<br />
ORDER BY 1, 2;<br />
适用范围：10g及以后版本<br />
SELECT id, 1 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 1), ',') AS cv<br />
FROM t_str_row<br />
UNION ALL<br />
SELECT id, 2 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 2), ',') AS cv<br />
FROM t_str_row<br />
UNION ALL<br />
SELECT id, 3 AS p, rtrim(regexp_substr(str||',', '.*?' || ',',1,3), ',') AS cv<br />
FROM t_str_row<br />
ORDER BY 1, 2;<br />
7.2<br />
VARRAY<br />
适用范围：8i,9i,10g及以后版本<br />
要创建一个可变数组：<br />
CREATE OR REPLACE TYPE ins_seq_type IS VARRAY(8) OF NUMBER;<br />
SELECT * FROM TABLE(ins_seq_type(1, 2, 3, 4, 5));<br />
SELECT t.id,<br />
c.column_value AS p,<br />
substr(t.ca,<br />
instr(t.ca, ',', 1, c.column_value) + 1,<br />
instr(t.ca, ',', 1, c.column_value + 1) -<br />
(instr(t.ca, ',', 1, c.column_value) + 1)) AS cv<br />
FROM (SELECT id,<br />
',' || str || ',' AS ca,<br />
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt<br />
FROM t_str_row) t<br />
INNER JOIN TABLE(ins_seq_type(1, 2, 3)) c ON c.column_value &lt;=<br />
t.cnt<br />
ORDER BY 1, 2;<br />
7.3<br />
SEQUENCE SERIES<br />
这类方法主要是要产生一个连续的整数列，产生连续整数列的方法有很多，主要有：<br />
CONNECT BY,ROWNUM+all_objects,CUBE等。<br />
适用范围：8i,9i,10g及以后版本<br />
SELECT t.id,<br />
c.lv AS p,<br />
substr(t.ca,<br />
instr(t.ca, ',', 1, c.lv) + 1,<br />
instr(t.ca, ',', 1, c.lv + 1) -<br />
(instr(t.ca, ',', 1, c.lv) + 1)) AS cv<br />
FROM (SELECT id,<br />
',' || str || ',' AS ca,<br />
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt<br />
FROM t_str_row) t,<br />
(SELECT LEVEL lv FROM dual CONNECT BY LEVEL &lt;= 5) c<br />
WHERE c.lv &lt;= t.cnt<br />
ORDER BY 1, 2;<br />
SELECT t.id,<br />
c.rn AS p,<br />
substr(t.ca,<br />
instr(t.ca, ',', 1, c.rn) + 1,<br />
instr(t.ca, ',', 1, c.rn + 1) -<br />
(instr(t.ca, ',', 1, c.rn) + 1)) AS cv<br />
FROM (SELECT id,<br />
',' || str || ',' AS ca,<br />
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt<br />
FROM t_str_row) t,<br />
(SELECT rownum rn FROM all_objects WHERE rownum &lt;= 5) c<br />
WHERE c.rn &lt;= t.cnt<br />
ORDER BY 1, 2;<br />
SELECT t.id,<br />
c.cb AS p,<br />
substr(t.ca,<br />
instr(t.ca, ',', 1, c.cb) + 1,<br />
instr(t.ca, ',', 1, c.cb + 1) -<br />
(instr(t.ca, ',', 1, c.cb) + 1)) AS cv<br />
FROM (SELECT id,<br />
',' || str || ',' AS ca,<br />
length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt<br />
FROM t_str_row) t,<br />
(SELECT rownum cb FROM (SELECT 1 FROM dual GROUP BY CUBE(1, 2))) c<br />
WHERE c.cb &lt;= t.cnt<br />
ORDER BY 1, 2;<br />
适用范围：10g及以后版本<br />
SELECT t.id,<br />
c.lv AS p,<br />
rtrim(regexp_substr(t.str || ',', '.*?' || ',', 1, c.lv), ',') AS cv<br />
FROM (SELECT id,<br />
str,<br />
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL)) AS cnt<br />
FROM t_str_row) t<br />
INNER JOIN (SELECT LEVEL lv FROM dual CONNECT BY LEVEL &lt;= 5) c ON c.lv &lt;= t.cnt<br />
ORDER BY 1, 2;<br />
7.4<br />
HIERARCHICAL + DBMS_RANDOM<br />
适用范围：10g及以后版本<br />
SELECT id,<br />
LEVEL AS p,<br />
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv<br />
FROM t_str_row<br />
CONNECT BY id = PRIOR id<br />
AND PRIOR dbms_random.VALUE IS NOT NULL<br />
AND LEVEL &lt;=<br />
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))<br />
ORDER BY 1, 2;<br />
7.5<br />
HIERARCHICAL + CONNECT_BY_ROOT<br />
适用范围：10g及以后版本<br />
SELECT id,<br />
LEVEL AS p,<br />
rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv<br />
FROM t_str_row<br />
CONNECT BY id = connect_by_root id<br />
AND LEVEL &lt;=<br />
length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))<br />
ORDER BY 1, 2;<br />
7.6<br />
MODEL<br />
适用范围：10g及以后版本<br />
SELECT id, p, cv FROM t_str_row<br />
MODEL<br />
RETURN UPDATED ROWS<br />
PARTITION BY(ID)<br />
DIMENSION BY( 0 AS p)<br />
MEASURES( str||',' AS cv)<br />
RULES UPSERT<br />
(cv<br />
[ FOR p<br />
FROM 1 TO length(regexp_replace(cv[0],'[^'||','||']',null))
<img src ="http://www.blogjava.net/titanaly/aggbug/306009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-12-15 13:16 <a href="http://www.blogjava.net/titanaly/archive/2009/12/15/306009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 找到被锁的记录</title><link>http://www.blogjava.net/titanaly/archive/2009/12/01/304348.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Tue, 01 Dec 2009 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/12/01/304348.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/304348.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/12/01/304348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/304348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/304348.html</trackback:ping><description><![CDATA[&nbsp; select 'select * from '||wl.table1||' where rowid= ''' || wl.aa||''';' from<br />
&nbsp; (select o.object_name table1 ,dbms_rowid.rowid_create(1,s.row_wait_obj#,s.row_wait_file#,s.row_wait_block#,s.row_wait_row#) aa<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from&nbsp; v$session s , dba_waiters w , v$locked_object l , dba_objects o<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where w.waiting_session=s.SID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and w.mode_held='Exclusive'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and w.waiting_session=l.SESSION_ID<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and l.OBJECT_ID=o.object_id ) wl;
<img src ="http://www.blogjava.net/titanaly/aggbug/304348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-12-01 11:34 <a href="http://www.blogjava.net/titanaly/archive/2009/12/01/304348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mssql Server中的日期与时间函数</title><link>http://www.blogjava.net/titanaly/archive/2009/11/23/303324.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Mon, 23 Nov 2009 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/11/23/303324.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/303324.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/11/23/303324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/303324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/303324.html</trackback:ping><description><![CDATA[mssql Server中的日期与时间函数 <br />
1. 当前系统日期、时间 <br />
select getdate() <br />
<br />
2. dateadd 在向指定日期加上一段时间的基础上，返回新的 datetime 值 <br />
例如：向日期加上2天 <br />
select dateadd(day,2,'2004-10-15') --返回：2004-10-17 00:00:00.000<br />
<br />
3. datediff 返回跨两个指定日期的日期和时间边界数。<br />
select datediff(day,'2004-09-01','2004-09-18') --返回：17<br />
<br />
4. datepart 返回代表指定日期的指定日期部分的整数。<br />
SELECT DATEPART(month, '2004-10-15') --返回 10<br />
<br />
5. datename 返回代表指定日期的指定日期部分的字符串<br />
SELECT datename(weekday, '2004-10-15') --返回：星期五<br />
<br />
6. day(), month(),year() --可以与datepart对照一下<br />
<br />
select 当前日期=convert(varchar(10),getdate(),120) <br />
,当前时间=convert(varchar(8),getdate(),114) <br />
<br />
select datename(dw,'2004-10-15') <br />
<br />
select 本年第多少周=datename(week,'2004-10-15') <br />
,今天是周几=datename(weekday,'2004-10-15')<br />
<br />
<br />
函数 参数/功能 <br />
GetDate( ) 返回系统目前的日期与时间 <br />
DateDiff (interval,date1,date2) 以interval 指定的方式，返回date2 与date1两个日期之间的差值 date2-date1 <br />
DateAdd (interval,number,date) 以interval指定的方式，加上number之后的日期 <br />
DatePart (interval,date) 返回日期date中，interval指定部分所对应的整数值 <br />
DateName (interval,date) 返回日期date中，interval指定部分所对应的字符串名称 <br />
<br />
参数 interval的设定值如下：<br />
<br />
值 缩 写（Sql Server） (Access 和 ASP) 说明 <br />
Year Yy yyyy 年 1753 ~ 9999 <br />
Quarter Qq q 季 1 ~ 4 <br />
Month Mm m 月1 ~ 12 <br />
Day of year Dy y 一年的日数,一年中的第几日 1-366 <br />
Day Dd d 日，1-31 <br />
Weekday Dw w 一周的日数，一周中的第几日 1-7 <br />
Week Wk ww 周，一年中的第几周 0 ~ 51 <br />
Hour Hh h 时0 ~ 23 <br />
Minute Mi n 分钟0 ~ 59 <br />
Second Ss s 秒 0 ~ 59 <br />
Millisecond Ms - 毫秒 0 ~ 999 <br />
<br />
<br />
access 和 asp 中用date()和now()取得系统日期时间；其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中，这些函数的用法也类似 <br />
<br />
举例： <br />
1.GetDate() 用于sql server :select GetDate()<br />
<br />
2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')返回值为 514592 秒<br />
DateDiff('d','2005-07-20','2005-7-25 22:56:32')返回值为 5 天<br />
<br />
3.DatePart('w','2005-7-25 22:56:32')返回值为 2 即星期一(周日为1，周六为7)<br />
DatePart('d','2005-7-25 22:56:32')返回值为 25即25号<br />
DatePart('y','2005-7-25 22:56:32')返回值为 206即这一年中第206天 <br />
DatePart('yyyy','2005-7-25 22:56:32')返回值为 2005即2005年 
<img src ="http://www.blogjava.net/titanaly/aggbug/303324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-11-23 13:13 <a href="http://www.blogjava.net/titanaly/archive/2009/11/23/303324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql 字符串函数大全</title><link>http://www.blogjava.net/titanaly/archive/2009/10/27/299896.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Tue, 27 Oct 2009 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/10/27/299896.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/299896.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/10/27/299896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/299896.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/299896.html</trackback:ping><description><![CDATA[MySQL 字符串函数大全 <br />
对于针对字符串位置的操作，第一个位置被标记为1。 <br />
ASCII(str) <br />
返回字符串str的最左面字符的ASCII代码值。如果str是空字符串，返回0。如果str是NULL，返回NULL。 <br />
mysql&gt; select ASCII('2'); <br />
-&gt; 50 <br />
mysql&gt; select ASCII(2); <br />
-&gt; 50 <br />
mysql&gt; select ASCII('dx'); <br />
-&gt; 100 <br />
也可参见ORD()函数。 <br />
ORD(str) <br />
如果字符串str最左面字符是一个多字节字符，通过以格式((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与ASCII()函数返回的相同值。 <br />
mysql&gt; select ORD('2'); <br />
-&gt; 50 <br />
CONV(N,from_base,to_base) <br />
在不同的数字基之间变换数字。返回数字N的字符串数字，从from_base基变换为to_base基，如果任何参数是NULL，返回NULL。参数N解释为一个整数，但是可以指定为一个整数或一个字符串。最小基是2且最大的基是36。如果to_base是一个负数，N被认为是一个有符号数，否则，N被当作无符号数。 CONV以64位点精度工作。 <br />
mysql&gt; select CONV("a",16,2); <br />
-&gt; '1010' <br />
mysql&gt; select CONV("6E",18,8); <br />
-&gt; '172' <br />
mysql&gt; select CONV(-17,10,-18); <br />
-&gt; '-H' <br />
mysql&gt; select CONV(10+"10"+'10'+0xa,10,10); <br />
-&gt; '40' <br />
BIN(N) <br />
返回二进制值N的一个字符串表示，在此N是一个长整数(BIGINT)数字，这等价于CONV(N,10,2)。如果N是NULL，返回NULL。 <br />
mysql&gt; select BIN(12); <br />
-&gt; '1100' <br />
OCT(N) <br />
返回八进制值N的一个字符串的表示，在此N是一个长整型数字，这等价于CONV(N,10,8)。如果N是NULL，返回NULL。 <br />
mysql&gt; select OCT(12); <br />
-&gt; '14' <br />
HEX(N) <br />
返回十六进制值N一个字符串的表示，在此N是一个长整型(BIGINT)数字，这等价于CONV(N,10,16)。如果N是NULL，返回NULL。 <br />
mysql&gt; select HEX(255); <br />
-&gt; 'FF' <br />
CHAR(N,...) <br />
CHAR()将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。NULL值被跳过。 <br />
mysql&gt; select CHAR(77,121,83,81,'76'); <br />
-&gt; 'MySQL' <br />
mysql&gt; select CHAR(77,77.3,'77.3'); <br />
-&gt; 'MMM' <br />
CONCAT(str1,str2,...) <br />
返回来自于参数连结的字符串。如果任何参数是NULL，返回NULL。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。 <br />
mysql&gt; select CONCAT('My', 'S', 'QL'); <br />
-&gt; 'MySQL' <br />
mysql&gt; select CONCAT('My', NULL, 'QL'); <br />
-&gt; NULL <br />
mysql&gt; select CONCAT(14.3); <br />
-&gt; '14.3' <br />
LENGTH(str) <br />
　 <br />
OCTET_LENGTH(str) <br />
　 <br />
CHAR_LENGTH(str) <br />
　 <br />
CHARACTER_LENGTH(str) <br />
返回字符串str的长度。 <br />
mysql&gt; select LENGTH('text'); <br />
-&gt; 4 <br />
mysql&gt; select OCTET_LENGTH('text'); <br />
-&gt; 4 <br />
注意，对于多字节字符，其CHAR_LENGTH()仅计算一次。 <br />
LOCATE(substr,str) <br />
　 <br />
POSITION(substr IN str) <br />
返回子串substr在字符串str第一个出现的位置，如果substr不是在str里面，返回0. <br />
mysql&gt; select LOCATE('bar', 'foobarbar'); <br />
-&gt; 4 <br />
mysql&gt; select LOCATE('xbar', 'foobar'); <br />
-&gt; 0 <br />
该函数是多字节可靠的。 <br />
LOCATE(substr,str,pos) <br />
返回子串substr在字符串str第一个出现的位置，从位置pos开始。如果substr不是在str里面，返回0。 <br />
mysql&gt; select LOCATE('bar', 'foobarbar',5); <br />
-&gt; 7 <br />
这函数是多字节可靠的。 <br />
INSTR(str,substr) <br />
返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同，除了参数被颠倒。 <br />
mysql&gt; select INSTR('foobarbar', 'bar'); <br />
-&gt; 4 <br />
mysql&gt; select INSTR('xbar', 'foobar'); <br />
-&gt; 0 <br />
这函数是多字节可靠的。 <br />
LPAD(str,len,padstr) <br />
返回字符串str，左面用字符串padstr填补直到str是len个字符长。 <br />
mysql&gt; select LPAD('hi',4,'??'); <br />
-&gt; '??hi' <br />
RPAD(str,len,padstr) <br />
返回字符串str，右面用字符串padstr填补直到str是len个字符长。 <br />
mysql&gt; select RPAD('hi',5,'?'); <br />
-&gt; 'hi???' <br />
LEFT(str,len) <br />
返回字符串str的最左面len个字符。 <br />
mysql&gt; select LEFT('foobarbar', 5); <br />
-&gt; 'fooba' <br />
该函数是多字节可靠的。 <br />
RIGHT(str,len) <br />
返回字符串str的最右面len个字符。 <br />
mysql&gt; select RIGHT('foobarbar', 4); <br />
-&gt; 'rbar' <br />
该函数是多字节可靠的。 <br />
SUBSTRING(str,pos,len) <br />
　 <br />
SUBSTRING(str FROM pos FOR len) <br />
　 <br />
MID(str,pos,len) <br />
从字符串str返回一个len个字符的子串，从位置pos开始。使用FROM的变种形式是ANSI SQL92语法。 <br />
mysql&gt; select SUBSTRING('Quadratically',5,6); <br />
-&gt; 'ratica' <br />
该函数是多字节可靠的。 <br />
SUBSTRING(str,pos) <br />
　 <br />
SUBSTRING(str FROM pos) <br />
从字符串str的起始位置pos返回一个子串。 <br />
mysql&gt; select SUBSTRING('Quadratically',5); <br />
-&gt; 'ratically' <br />
mysql&gt; select SUBSTRING('foobarbar' FROM 4); <br />
-&gt; 'barbar' <br />
该函数是多字节可靠的。 <br />
SUBSTRING_INDEX(str,delim,count) <br />
返回从字符串str的第count个出现的分隔符delim之后的子串。如果count是正数，返回最后的分隔符到左边(从左边数) 的所有字符。如果count是负数，返回最后的分隔符到右边的所有字符(从右边数)。 <br />
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', 2); <br />
-&gt; 'www.mysql' <br />
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', -2); <br />
-&gt; 'mysql.com' <br />
该函数对多字节是可靠的。 <br />
LTRIM(str) <br />
返回删除了其前置空格字符的字符串str。 <br />
mysql&gt; select LTRIM(' barbar'); <br />
-&gt; 'barbar' <br />
RTRIM(str) <br />
返回删除了其拖后空格字符的字符串str。 <br />
mysql&gt; select RTRIM('barbar '); <br />
-&gt; 'barbar' <br />
该函数对多字节是可靠的。 <br />
TRIM([[BOTH | LEA <br />
DING | TRAILING] [remstr] FROM] str) <br />
返回字符串str，其所有remstr前缀或后缀被删除了。如果没有修饰符BOTH、LEADING或TRAILING给出，BOTH被假定。如果remstr没被指定，空格被删除。 <br />
mysql&gt; select TRIM(' bar '); <br />
-&gt; 'bar' <br />
mysql&gt; select TRIM(LEADING 'x' FROM 'xxxbarxxx'); <br />
-&gt; 'barxxx' <br />
mysql&gt; select TRIM(BOTH 'x' FROM 'xxxbarxxx'); <br />
-&gt; 'bar' <br />
mysql&gt; select TRIM(TRAILING 'xyz' FROM 'barxxyz'); <br />
-&gt; 'barx' <br />
该函数对多字节是可靠的。 <br />
SOUNDEX(str) <br />
返回str的一个同音字符串。听起来&#8220;大致相同&#8221;的2个字符串应该有相同的同音字符串。一个&#8220;标准&#8221;的同音字符串长是4个字符，但是SOUNDEX()函数返回一个任意长的字符串。你可以在结果上使用SUBSTRING()得到一个&#8220;标准&#8221;的同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。 <br />
mysql&gt; select SOUNDEX('Hello'); <br />
-&gt; 'H400' <br />
mysql&gt; select SOUNDEX('Quadratically'); <br />
-&gt; 'Q36324' <br />
SPACE(N) <br />
返回由N个空格字符组成的一个字符串。 <br />
mysql&gt; select SPACE(6); <br />
-&gt; ' ' <br />
REPLACE(str,from_str,to_str) <br />
返回字符串str，其字符串from_str的所有出现由字符串to_str代替。 <br />
mysql&gt; select REPLACE('www.mysql.com', 'w', 'Ww'); <br />
-&gt; 'WwWwWw.mysql.com' <br />
该函数对多字节是可靠的。 <br />
REPEAT(str,count) <br />
返回由重复countTimes次的字符串str组成的一个字符串。如果count &lt;= 0，返回一个空字符串。如果str或count是NULL，返回NULL。 <br />
mysql&gt; select REPEAT('MySQL', 3); <br />
-&gt; 'MySQLMySQLMySQL' <br />
REVERSE(str) <br />
返回颠倒字符顺序的字符串str。 <br />
mysql&gt; select REVERSE('abc'); <br />
-&gt; 'cba' <br />
该函数对多字节可靠的。 <br />
INSERT(str,pos,len,newstr) <br />
返回字符串str，在位置pos起始的子串且len个字符长得子串由字符串newstr代替。 <br />
mysql&gt; select INSERT('Quadratic', 3, 4, 'What'); <br />
-&gt; 'QuWhattic' <br />
该函数对多字节是可靠的。 <br />
ELT(N,str1,str2,str3,...) <br />
如果N= 1，返回str1，如果N= 2，返回str2，等等。如果N小于1或大于参数个数，返回NULL。ELT()是FIELD()反运算。 <br />
mysql&gt; select ELT(1, 'ej', 'Heja', 'hej', 'foo'); <br />
-&gt; 'ej' <br />
mysql&gt; select ELT(4, 'ej', 'Heja', 'hej', 'foo'); <br />
-&gt; 'foo' <br />
FIELD(str,str1,str2,str3,...) <br />
返回str在str1, str2, str3, ...清单的索引。如果str没找到，返回0。FIELD()是ELT()反运算。 <br />
mysql&gt; select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); <br />
-&gt; 2 <br />
mysql&gt; select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); <br />
-&gt; 0 <br />
FIND_IN_SET(str,strlist) <br />
如果字符串str在由N子串组成的表strlist之中，返回一个1到N的值。一个字符串表是被&#8220;,&#8221;分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为SET的列，FIND_IN_SET()函数被优化而使用位运算！如果str不是在strlist里面或如果 strlist是空字符串，返回0。如果任何一个参数是NULL，返回NULL。如果第一个参数包含一个&#8220;,&#8221;，该函数将工作不正常。 <br />
mysql&gt; SELECT FIND_IN_SET('b','a,b,c,d'); <br />
-&gt; 2 <br />
MAKE_SET(bits,str1,str2,...) <br />
返回一个集合 (包含由&#8220;,&#8221;字符分隔的子串组成的一个字符串)，由相应的位在bits集合中的的字符串组成。str1对应于位0，str2对应位1，等等。在str1, str2, ...中的NULL串不添加到结果中。 <br />
mysql&gt; SELECT MAKE_SET(1,'a','b','c'); <br />
-&gt; 'a' <br />
mysql&gt; SELECT MAKE_SET(1 | 4,'hello','nice','world'); <br />
-&gt; 'hello,world' <br />
mysql&gt; SELECT MAKE_SET(0,'a','b','c'); <br />
-&gt; '' <br />
EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) <br />
返回一个字符串，在这里对于在&#8220;bits&#8221;中设定每一位，你得到一个&#8220;on&#8221;字符串，并且对于每个复位(reset)的位，你得到一个&#8220;off&#8221;字符串。每个字符串用&#8220;separator&#8221;分隔(缺省&#8220;,&#8221;)，并且只有&#8220;bits&#8221;的&#8220;number_of_bits&#8221; (缺省64)位被使用。 <br />
mysql&gt; select EXPORT_SET(5,'Y','N',',',4) <br />
-&gt; Y,N,Y,N <br />
LCASE(str) <br />
　 <br />
LOWER(str) <br />
返回字符串str，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。 <br />
mysql&gt; select LCASE('QUADRATICALLY'); <br />
-&gt; 'quadratically' <br />
UCASE(str) <br />
　 <br />
UPPER(str) <br />
返回字符串str，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。 <br />
mysql&gt; select UCASE('Hej'); <br />
-&gt; 'HEJ' <br />
该函数对多字节是可靠的。 <br />
LOAD_FILE(file_name) <br />
读入文件并且作为一个字符串返回文件内容。文件必须在服务器上，你必须指定到文件的完整路径名，而且你必须有file权限。文件必须所有内容都是可读的并且小于max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出，函数返回NULL。 <br />
mysql&gt; UPDATE table_name <br />
SET blob_column=LOAD_FILE("/tmp/picture") <br />
WHERE id=1; <br />
MySQL必要时自动变换数字为字符串，并且反过来也如此： <br />
mysql&gt; SELECT 1+"1"; <br />
-&gt; 2 <br />
mysql&gt; SELECT CONCAT(2,' test'); <br />
-&gt; '2 test' <br />
如果你想要明确地变换一个数字到一个字符串，把它作为参数传递到CONCAT()。 <br />
如果字符串函数提供一个二进制字符串作为参数，结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较 . <br />
本文来自: 脚本之家(www.jb51.net) 详细出处参考：http://www.jb51.net/article/19437.htm
<img src ="http://www.blogjava.net/titanaly/aggbug/299896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-10-27 11:13 <a href="http://www.blogjava.net/titanaly/archive/2009/10/27/299896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将excel数据导入oracle中</title><link>http://www.blogjava.net/titanaly/archive/2009/10/22/299359.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Thu, 22 Oct 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/10/22/299359.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/299359.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/10/22/299359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/299359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/299359.html</trackback:ping><description><![CDATA[<h2 class="diaryTitle">将excel数据导入oracle中</h2>
<p>
<p><a href="http://www.douzhe.com/docs/bbsjh/8/3383.html">http://www.douzhe.com/docs/bbsjh/8/3383.html</a>&nbsp;这个帖子的讨论，整理如下：</p>
<p>A、有一个比较麻烦但保证成功的方法。<br />
1、在本地创建一个Access数据库，将Excel数据先导入到Access。可直接导入点击鼠标右键，选择导入，文件类型选择要导入的Excel文件，也可通过创建宏用TransferSpreadsheet函数实现。<br />
2、在本地创建ODBC，链接oracle数据库。将oracle中需要导入数据的表以链接表的方式在本地Access中创建（千万不要使用导入表）。<br />
3、在Access数据库中创建插入查询将导入好的Excel数据导入到oracle中。 </p>
<p>此方法保证成功。</p>
<p>B、也可以导入sql server 用它的导出工具导入oracle 但对一些image字段支持不好，你如果<br />
没这种字段就行。</p>
<p>用MS_sqlserver 提供的数据导出导入功能可以方便的把excel方便的导入oracle数据库</p>
<p>C、一种方法：<br />
先把Excel另存为.csv格式文件，如test.csv，再编写一个insert.ctl<br />
用sqlldr进行导入!<br />
insert.ctl内容如下：<br />
load data　　　　　　　　　　 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--1、控制文件标识<br />
infile 'test.csv'　　　　　　 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;--2、要输入的数据文件名为test.csv<br />
append into table table_name　　　　 &nbsp; --3、向表table_name中追加记录<br />
fields terminated by ','　　 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --4、字段终止于','，是一个逗号<br />
(field1,<br />
field2,<br />
field3,<br />
...<br />
fieldn)-----定义列对应顺序 </p>
<p>注意括号中field排列顺序要与csv文件中相对应<br />
然后就可以执行如下命令：<br />
sqlldr user/password control=insert.ctl</p>
<p>有关SQLLDR的问题 </p>
<p><font face="verdana, arial, helvetica" size="2">控制文件：input.ctl，内容如下：<br />
　　load data　　　　　　　　　　 --1、控制文件标识<br />
　　infile 'test.txt'　　　　　　 --2、要输入的数据文件名为test.txt<br />
　　append into table test　　　　--3、向表test中追加记录<br />
　　fields terminated by X'09'　　--4、字段终止于X'09'，是一个制表符（TAB）<br />
　　(id,username,password,sj)　　 -----定义列对应顺序<br />
<br />
其中append为数据装载方式，还有其他选项：<br />
a、insert，为缺省方式，在数据装载开始时要求表为空<br />
b、append，在表中追加新记录<br />
c、replace，删除旧记录，替换成新装载的记录<br />
d、truncate，同上<br />
<br />
问题：SQLLDR能不能保留表中原有的数据，如果发现KEY重复时，再UPDATE对应的记录？</font></p>
<p>D、先?EXCEL文件??成TXT文件<br />
再使用SQLLOADER</p>
<p>E、将EXCEL文件保存成*.csv格式. 然后用sqlload来导入表中.</p>
<p>sqlload是Oracle自带的数据倒入工具，应该是没有可视化工具的（至少我一直用命令行）。<br />
直接在命令行下敲入sqlldr即可得到帮助。</p>
<p>F、如果你的单个文件不大的情况下(少于100000行), 可以全选COPY ,然后用PL/SQL.:<br />
select * from table for update. 然后打开锁, 再按一下加号. 鼠标点到第一个空格然后粘贴. COMMIT即可.(小窍门, ORACLE不支持的, 但很好用, 不会有问题)</p>
<p>G、Golden的imp/exp工具可以直接导入文本文件，非常简单</p>
<p>下面这个不知道是针对以上哪种方法的：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 放心：excel文件最多只有65536条记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不放心：曾经如此导过，但当有中文字段时可能出现异常（PL/SQL DEV5）</p>
<p>我用的是A，OK，时间仓促，其他的没有试过。</p>
<p><a href="http://www.itpub.net/101803.html">http://www.itpub.net/101803.html</a>&nbsp;这个帖子如是说：</p>
<p>你用的方法可能是:<br />
1. 存成txt文件, 再用sql*loader<br />
2. 存成txt文件, 再用第三方工具(如pb, delphi, toad, pl/sql dev等)导入.<br />
<br />
sql*loader用起来费劲, 为了小小的需求, 装一个第三方工具麻烦.<br />
看看我的方法.<br />
<br />
比如文件中有id, name两列(分别为A列和B列), 要导入的表为person(person_id, person_name)<br />
<br />
在excel 文件的sheet的最右列, 添加一列, 对应第一行数据的单元格写入以下内容:<br />
<br />
= "INSERT INTO PERSON(PERSON_ID, PERSON_NAME) VALUES('" &amp; A1 &amp; "', '" &amp; B1 &amp; "');"<br />
<br />
然后把这一行复制到所有数据行对应的列中.<br />
<br />
这一列的内容拷贝出去保存, 即成为可以直接在sql*plus下运行的脚本.</p>
<p>方法一?日期型?位不适用</p>
<p>A、<font face="Courier New">把Excel文件导到Acess里，然后打开要导数据的表。<br />
<br />
打开 PLSQL DEV，打开一个SQL窗口，执行<br />
select * from [tab] for update<br />
<br />
然后一列一列的从Acess里copy &amp; paste 。</font></p>
<p>B、excel-&gt;copy-&gt;pl/sql developer&gt;paste</p>
<p>实际操作时发现，使用 copy / paste 经常会发生莫其妙的问题。尤其是通过 access ( ODBC) copy 入 oracle 时。</p>
<p>EXECL --&gt;SAVE AS *.CSV(COMMA DELIMITED). THEN LOAD IT DIRECTLY.<br />
<br />
<br />
CTL FILE EXAMPLE <br />
------------<br />
Load Data<br />
INFILE 'E:\AA.csv'<br />
TRUNCATE<br />
INTO TABLE AA<br />
FIELDS TERMINATED BY ','<br />
(A,<br />
B)</p>
<p>C、在ACCESS中将ORACLE TABLE 映射，然后直接插入即可。很方便，也没发现有数据错误问题。<br />
曾经有一个很麻烦的LONG RAW问题，用这个办法也解决了</p>
<p>D、<font face="verdana, arial, helvetica" size="2">用SQL*XL就可以直接将EXCEL文件导入ORACLE，很方便的，我一直用SQL*XL。</font></p>
<p><font size="2">E、<strong>我常用的办法是从excel中copy到ultraEdit中，然后用列编辑功能加上insert into ....等等，也挺好用</strong></font></p>
<p><font size="2"><strong>F、</strong>用plsql developer,很好用的,直接copy就可以了</font></p>
<p>在pl/sql developer 中选择表的多个字段名，然后就可以paste 了</p>
<p><font size="2">G、用odbc加pb的数据管道可以在不同的数据库（文本）之间传输数据</font></p>
<p><font size="2">H、odbc+pb </font></p>
<p><font face="verdana, arial, helvetica" size="2">用不同的odbc驱动程序连接不通的数据库<br />
然后在pb环境中启动数据管道，利用数据管道传输数据</font></p>
<p><font size="2">I、先倒成。DBF的文件，再用DELPHI DATABASE DESKTOP 导入ORACLE很方便的，也且也可以支持空值导入。</font></p>
<p><font size="2"><a href="http://www.itpub.net/showthread.php?s=7f7b57ea130ab71a3fdad57a71d8f8a1&amp;threadid=97652&amp;perpage=15&amp;pagenumber=2">http://www.itpub.net/showthread.php?s=7f7b57ea130ab71a3fdad57a71d8f8a1&amp;threadid=97652&amp;perpage=15&amp;pagenumber=2</a></font></p>
<p><font size="2">帖子很长，有空再整理。</font></p>
<img src ="http://www.blogjava.net/titanaly/aggbug/299359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-10-22 14:25 <a href="http://www.blogjava.net/titanaly/archive/2009/10/22/299359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>触发器和存储过程的优缺点汇总(转)</title><link>http://www.blogjava.net/titanaly/archive/2009/09/15/295109.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Tue, 15 Sep 2009 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/09/15/295109.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/295109.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/09/15/295109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/295109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/295109.html</trackback:ping><description><![CDATA[缺点:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、可移植性是存储过程和触发器最大的缺点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、占用服务器端太多的资源，对服务器造成很大的压力<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、不能做DDL。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、触发器排错困难，而且数据容易造成不一致，后期维护不方便。<br />
<br />
<br />
优点：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、预编译，已优化，效率较高。避免了SQL语句在网络传输然后再解释的低效率。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、存储过程可以重复使用，减少开发人员的工作量。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、业务逻辑封装性好，修改方便。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、安全。不会有SQL语句注入问题存在。 
<img src ="http://www.blogjava.net/titanaly/aggbug/295109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-09-15 10:52 <a href="http://www.blogjava.net/titanaly/archive/2009/09/15/295109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL：MySQL日期数据类型、MySQL时间类型使用总结</title><link>http://www.blogjava.net/titanaly/archive/2009/08/17/291454.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Mon, 17 Aug 2009 03:56:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/08/17/291454.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/291454.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/08/17/291454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/291454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/291454.html</trackback:ping><description><![CDATA[MySQL：MySQL日期数据类型、MySQL时间类型使用总结 MySQL 日期类型：日期格式、所占存储空间、日期范围 比较。 <br />
日期类型&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;存储空间&nbsp; &nbsp;&nbsp; &nbsp;日期格式&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 日期范围<br />
------------&nbsp;&nbsp;---------&nbsp;&nbsp;--------------------- -----------------------------------------<br />
datetime&nbsp; &nbsp;&nbsp; &nbsp;8 bytes&nbsp;&nbsp;YYYY-MM-DD HH:MM:SS&nbsp;&nbsp;1000-01-01 00:00:00 ~ 9999-12-31 23:59:59<br />
timestamp&nbsp; &nbsp;&nbsp; &nbsp;4 bytes&nbsp;&nbsp;YYYY-MM-DD HH:MM:SS&nbsp;&nbsp;1970-01-01 00:00:01 ~ 2038<br />
date&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 3 bytes&nbsp;&nbsp;YYYY-MM-DD&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;1000-01-01&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ~ 9999-12-31<br />
year&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 1 bytes&nbsp;&nbsp;YYYY&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;1901&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ~ 2155<br />
<br />
在 MySQL 中创建表时，对照上面的表格，很容易就能选择到合适自己的数据类型。不过到底是选择 datetime 还是 timestamp，可能会有点犯难。这两个日期时间类型各有优点：datetime 的日期范围比较大；timestamp 所占存储空间比较小，只是 datetime 的一半。 <br />
<br />
另外，timestamp 类型的列还有个特性：默认情况下，在 insert, update 数据时，timestamp 列会自动以当前时间（CURRENT_TIMESTAMP）填充/更新。&#8220;自动&#8221;的意思就是，你不去管它，MySQL 会替你去处理。 <br />
<br />
一般情况下，我倾向于使用 datetime 日期类型。 <br />
<br />
MySQL 时间类型：时间格式、所占存储空间、时间范围。 <br />
时间类型&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;存储空间&nbsp; &nbsp;&nbsp; &nbsp;时间格式&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 时间范围<br />
------------&nbsp;&nbsp;---------&nbsp;&nbsp;--------------------- -----------------------------------------<br />
time&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 3 bytes&nbsp;&nbsp;HH:MM:SS&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-838:59:59&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ~ 838:59:59<br />
<br />
time 时间范围居然有这么大的范围，特别是 time 可以取负值，有点奇怪。后来，看了 MySQL 手册才知道这是为了满足两个日期时间相减才这样设计的。 <br />
<br />
select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00');&nbsp;&nbsp;--&nbsp;&nbsp;743:59:59<br />
select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59');&nbsp;&nbsp;-- -743:59:59<br />
select timediff('23:59:59', '12:00:00');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;--&nbsp;&nbsp;11:59:59<br />
<br />
注意，timediff 的两个参数只能是 datetime/timestamp, time 类型的，并且这两个参数类型要相同。即：datetime/timestamp 和 datetime/timestamp 比较；time 和 time 相比较。 <br />
<br />
虽然 MySQL 中的日期时间类型比较丰富，但遗憾的是，目前（2008-08-08）这些日期时间类型只能支持到秒级别，不支持毫秒、微秒。也没有产生毫秒的函数。 <br />
<br />
《MySQL：MySQL日期数据类型、MySQL时间类型使用总结》适用于 MySQL 5.X 及以上版本。 <br />
<br />
一、MySQL 获得当前日期时间 函数 <br />
1.1 获得当前日期+时间（date + time）函数：now() <br />
<br />
mysql&gt; select now();<br />
<br />
+---------------------+<br />
| now()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
+---------------------+<br />
| 2008-08-08 22:20:46 |<br />
+---------------------+<br />
<br />
除了 now() 函数能获得当前的日期时间外，MySQL 中还有下面的函数： <br />
<br />
current_timestamp()<br />
,current_timestamp<br />
,localtime()<br />
,localtime<br />
,localtimestamp&nbsp; &nbsp; -- (v4.0.6)<br />
,localtimestamp()&nbsp;&nbsp;-- (v4.0.6)<br />
<br />
这些日期时间函数，都等同于 now()。鉴于 now() 函数简短易记，建议总是使用 now() 来替代上面列出的函数。 <br />
<br />
1.2 获得当前日期+时间（date + time）函数：sysdate() <br />
<br />
sysdate() 日期时间函数跟 now() 类似，不同之处在于：now() 在执行开始时值就得到了， sysdate() 在函数执行时动态得到值。看下面的例子就明白了： <br />
<br />
mysql&gt; select now(), sleep(3), now();<br />
<br />
+---------------------+----------+---------------------+<br />
| now()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| sleep(3) | now()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
+---------------------+----------+---------------------+<br />
| 2008-08-08 22:28:21 |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;0 | 2008-08-08 22:28:21 |<br />
+---------------------+----------+---------------------+<br />
<br />
mysql&gt; select sysdate(), sleep(3), sysdate();<br />
<br />
+---------------------+----------+---------------------+<br />
| sysdate()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; | sleep(3) | sysdate()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+---------------------+----------+---------------------+<br />
| 2008-08-08 22:28:41 |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;0 | 2008-08-08 22:28:44 |<br />
+---------------------+----------+---------------------+<br />
<br />
可以看到，虽然中途 sleep 3 秒，但 now() 函数两次的时间值是相同的； sysdate() 函数两次得到的时间值相差 3 秒。MySQL Manual 中是这样描述 sysdate() 的：Return the time at which the function executes。 <br />
<br />
sysdate() 日期时间函数，一般情况下很少用到。 <br />
<br />
2. 获得当前日期（date）函数：curdate() <br />
<br />
mysql&gt; select curdate();<br />
<br />
+------------+<br />
| curdate()&nbsp;&nbsp;|<br />
+------------+<br />
| 2008-08-08 |<br />
+------------+<br />
<br />
其中，下面的两个日期函数等同于 curdate()： <br />
<br />
current_date()<br />
,current_date<br />
<br />
3. 获得当前时间（time）函数：curtime() <br />
<br />
mysql&gt; select curtime();<br />
<br />
+-----------+<br />
| curtime() |<br />
+-----------+<br />
| 22:41:30&nbsp;&nbsp;|<br />
+-----------+<br />
<br />
其中，下面的两个时间函数等同于 curtime()： <br />
<br />
current_time()<br />
,current_time<br />
<br />
4. 获得当前 UTC 日期时间函数：utc_date(), utc_time(), utc_timestamp() <br />
<br />
mysql&gt; select utc_timestamp(), utc_date(), utc_time(), now()<br />
<br />
+---------------------+------------+------------+---------------------+<br />
| utc_timestamp()&nbsp; &nbsp; | utc_date() | utc_time() | now()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
+---------------------+------------+------------+---------------------+<br />
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11&nbsp;&nbsp;| 2008-08-08 22:47:11 |<br />
+---------------------+------------+------------+---------------------+<br />
<br />
因为我国位于东八时区，所以本地时间 = UTC 时间 + 8 小时。UTC 时间在业务涉及多个国家和地区的时候，非常有用。 <br />
<br />
二、MySQL 日期时间 Extract（选取） 函数。 <br />
1. 选取日期时间的各个部分：日期、时间、年、季度、月、日、小时、分钟、秒、微秒 <br />
<br />
set @dt = '2008-09-10 07:15:30.123456';<br />
<br />
select date(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 2008-09-10<br />
select time(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 07:15:30.123456<br />
select year(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 2008<br />
select quarter(@dt);&nbsp; &nbsp; -- 3<br />
select month(@dt);&nbsp; &nbsp;&nbsp; &nbsp;-- 9<br />
select week(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 36<br />
select day(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 10<br />
select hour(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 7<br />
select minute(@dt);&nbsp; &nbsp;&nbsp; &nbsp;-- 15<br />
select second(@dt);&nbsp; &nbsp;&nbsp; &nbsp;-- 30<br />
select microsecond(@dt); -- 123456<br />
<br />
2. MySQL Extract() 函数，可以上面实现类似的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%E5%8A%9F%E8%83%BD">功能</span>： <br />
<br />
set @dt = '2008-09-10 07:15:30.123456';<br />
<br />
select extract(year&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 2008<br />
select extract(quarter&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;from @dt); -- 3<br />
select extract(month&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); -- 9<br />
select extract(week&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 36<br />
select extract(day&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 10<br />
select extract(hour&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 7<br />
select extract(minute&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); -- 15<br />
select extract(second&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); -- 30<br />
select extract(microsecond&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); -- 123456<br />
<br />
select extract(year_month&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 200809<br />
select extract(day_hour&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;from @dt); -- 1007<br />
select extract(day_minute&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 100715<br />
select extract(day_second&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; from @dt); -- 10071530<br />
select extract(day_microsecond&nbsp; &nbsp; from @dt); -- 10071530123456<br />
select extract(hour_minute&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); --&nbsp; &nbsp; 715<br />
select extract(hour_second&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;from @dt); --&nbsp; &nbsp; 71530<br />
select extract(hour_microsecond&nbsp; &nbsp; from @dt); --&nbsp; &nbsp; 71530123456<br />
select extract(minute_second&nbsp; &nbsp;&nbsp; &nbsp;from @dt); --&nbsp; &nbsp;&nbsp; &nbsp;1530<br />
select extract(minute_microsecond&nbsp;&nbsp;from @dt); --&nbsp; &nbsp;&nbsp; &nbsp;1530123456<br />
select extract(second_microsecond&nbsp;&nbsp;from @dt); --&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;30123456<br />
<br />
MySQL Extract() 函数除了没有date(),time() 的功能外，其他功能一应具全。并且还具有选取&#8216;day_microsecond&#8217; 等功能。注意这里不是只选取 day 和 microsecond，而是从日期的 day 部分一直选取到 microsecond 部分。够强悍的吧！ <br />
<br />
MySQL Extract() 函数唯一不好的地方在于：你需要多敲几次键盘。 <br />
<br />
3. MySQL dayof... 函数：dayofweek(), dayofmonth(), dayofyear() <br />
<br />
分别返回日期参数，在一周、一月、一年中的位置。 <br />
<br />
set @dt = '2008-08-08';<br />
<br />
select dayofweek(@dt);&nbsp;&nbsp;-- 6<br />
select dayofmonth(@dt);&nbsp;&nbsp;-- 8<br />
select dayofyear(@dt);&nbsp;&nbsp;-- 221<br />
<br />
日期 '2008-08-08' 是一周中的第 6 天（1 = Sunday, 2 = Monday, ..., 7 = Saturday）；一月中的第 8 天；一年中的第 221 天。 <br />
<br />
4. MySQL week... 函数：week(), weekofyear(), dayofweek(), weekday(), yearweek() <br />
<br />
set @dt = '2008-08-08';<br />
<br />
select week(@dt);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 31<br />
select week(@dt,3);&nbsp; &nbsp;&nbsp; &nbsp;-- 32<br />
select weekofyear(@dt);&nbsp;&nbsp;-- 32<br />
<br />
select dayofweek(@dt);&nbsp;&nbsp;-- 6<br />
select weekday(@dt);&nbsp; &nbsp; -- 4<br />
<br />
select yearweek(@dt);&nbsp; &nbsp; -- 200831<br />
<br />
MySQL week() 函数，可以有两个参数，具体可看手册。 weekofyear() 和 week() 一样，都是计算&#8220;某天&#8221;是位于一年中的第几周。 weekofyear(@dt) 等价于 week(@dt,3)。 <br />
<br />
MySQL weekday() 函数和 dayofweek() 类似，都是返回&#8220;某天&#8221;在一周中的位置。不同点在于参考的标准， weekday：(0 = Monday, 1 = Tuesday, ..., 6 = Sunday)； dayofweek：（1 = Sunday, 2 = Monday, ..., 7 = Saturday） <br />
<br />
MySQL yearweek() 函数，返回 year(2008) + week 位置(31)。 <br />
<br />
5. MySQL 返回星期和月份名称函数：dayname(), monthname() <br />
<br />
set @dt = '2008-08-08';<br />
<br />
select dayname(@dt);&nbsp; &nbsp; -- Friday<br />
select monthname(@dt);&nbsp;&nbsp;-- August<br />
<br />
思考，如何返回中文的名称呢？ <br />
<br />
6. MySQL last_day() 函数：返回月份中的最后一天。 <br />
<br />
select last_day('2008-02-01');&nbsp;&nbsp;-- 2008-02-29<br />
select last_day('2008-08-08');&nbsp;&nbsp;-- 2008-08-31<br />
<br />
MySQL last_day() 函数非常有用，比如我想得到当前月份中有多少天，可以这样来计算： <br />
<br />
mysql&gt; select now(), day(last_day(now())) as days;<br />
<br />
+---------------------+------+<br />
| now()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;| days |<br />
+---------------------+------+<br />
| 2008-08-09 11:45:45 |&nbsp;&nbsp;31 |<br />
+---------------------+------+<br />
<br />
三、MySQL 日期时间计算函数 <br />
1. MySQL 为日期增加一个时间间隔：date_add() <br />
<br />
set @dt = now();<br />
<br />
select date_add(@dt, interval 1 day);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- add 1 day<br />
select date_add(@dt, interval 1 hour);&nbsp; &nbsp;&nbsp; &nbsp;-- add 1 hour<br />
select date_add(@dt, interval 1 minute);&nbsp; &nbsp; -- ...<br />
select date_add(@dt, interval 1 second);<br />
select date_add(@dt, interval 1 microsecond);<br />
select date_add(@dt, interval 1 week);<br />
select date_add(@dt, interval 1 month);<br />
select date_add(@dt, interval 1 quarter);<br />
select date_add(@dt, interval 1 year);<br />
<br />
select date_add(@dt, interval -1 day);&nbsp; &nbsp;&nbsp; &nbsp;-- sub 1 day<br />
<br />
MySQL adddate(), addtime()函数，可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能示例： <br />
<br />
mysql&gt; set @dt = '2008-08-09 12:12:33';<br />
<br />
mysql&gt;<br />
mysql&gt; select date_add(@dt, interval '01:15:30' hour_second);<br />
<br />
+------------------------------------------------+<br />
| date_add(@dt, interval '01:15:30' hour_second) |<br />
+------------------------------------------------+<br />
| 2008-08-09 13:28:03&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+------------------------------------------------+<br />
<br />
mysql&gt; select date_add(@dt, interval '1 01:15:30' day_second);<br />
<br />
+-------------------------------------------------+<br />
| date_add(@dt, interval '1 01:15:30' day_second) |<br />
+-------------------------------------------------+<br />
| 2008-08-10 13:28:03&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+-------------------------------------------------+<br />
<br />
date_add() 函数，分别为 @dt 增加了&#8220;1小时 15分 30秒&#8221; 和 &#8220;1天 1小时 15分 30秒&#8221;。建议：总是使用 date_add() 日期时间函数来替代 adddate(), addtime()。 <br />
<br />
2. MySQL 为日期减去一个时间间隔：date_sub() <br />
<br />
mysql&gt; select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);<br />
<br />
+----------------------------------------------------------------+<br />
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |<br />
+----------------------------------------------------------------+<br />
| 1997-12-30 22:58:59&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|<br />
+----------------------------------------------------------------+<br />
<br />
MySQL date_sub() 日期时间函数 和 date_add() 用法一致，不再赘述。另外，MySQL 中还有两个函数 subdate(), subtime()，建议，用 date_sub() 来替代。 <br />
<br />
3. MySQL 另类日期函数：period_add(P,N), period_diff(P1,P2) <br />
<br />
函数参数&#8220;P&#8221; 的格式为&#8220;YYYYMM&#8221; 或者 &#8220;YYMM&#8221;，第二个参数&#8220;N&#8221; 表示增加或减去 N month（月）。 <br />
<br />
MySQL period_add(P,N)：日期加/减去N月。 <br />
<br />
mysql&gt; select period_add(200808,2), period_add(20080808,-2)<br />
<br />
+----------------------+-------------------------+<br />
| period_add(200808,2) | period_add(20080808,-2) |<br />
+----------------------+-------------------------+<br />
|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;200810 |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 20080806 |<br />
+----------------------+-------------------------+<br />
<br />
MySQL period_diff(P1,P2)：日期 P1-P2，返回 N 个月。 <br />
<br />
mysql&gt; select period_diff(200808, 200801);<br />
<br />
+-----------------------------+<br />
| period_diff(200808, 200801) |<br />
+-----------------------------+<br />
|&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;7 |<br />
+-----------------------------+<br />
<br />
在 MySQL 中，这两个日期函数，一般情况下很少用到。 <br />
<br />
4. MySQL 日期、时间相减函数：datediff(date1,date2), timediff(time1,time2) <br />
<br />
MySQL datediff(date1,date2)：两个日期相减 date1 - date2，返回天数。 <br />
<br />
select datediff('2008-08-08', '2008-08-01');&nbsp;&nbsp;-- 7<br />
select datediff('2008-08-01', '2008-08-08');&nbsp;&nbsp;-- -7<br />
<br />
MySQL timediff(time1,time2)：两个日期相减 time1 - time2，返回 time 差值。 <br />
<br />
select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08<br />
select timediff('08:08:08', '00:00:00');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- 08:08:08<br />
<br />
注意：timediff(time1,time2) 函数的两个参数类型必须相同。 <br />
<br />
四、MySQL 日期转换函数、时间转换函数 <br />
1. MySQL （时间、秒）转换函数：time_to_sec(time), sec_to_time(seconds) <br />
<br />
select time_to_sec('01:00:05');&nbsp;&nbsp;-- 3605<br />
select sec_to_time(3605);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- '01:00:05'<br />
<br />
2. MySQL （日期、天数）转换函数：to_days(date), from_days(days) <br />
<br />
select to_days('0000-00-00');&nbsp;&nbsp;-- 0<br />
select to_days('2008-08-08');&nbsp;&nbsp;-- 733627<br />
<br />
select from_days(0);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- '0000-00-00'<br />
select from_days(733627);&nbsp; &nbsp;&nbsp; &nbsp;-- '2008-08-08'<br />
<br />
3. MySQL Str to Date （字符串转换为日期）函数：str_to_date(str, format) <br />
<br />
select str_to_date('08/09/2008', '%m/%d/%Y');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-- 2008-08-09<br />
select str_to_date('08/09/08'&nbsp;&nbsp;, '%m/%d/%y');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-- 2008-08-09<br />
select str_to_date('08.09.2008', '%m.%d.%Y');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-- 2008-08-09<br />
select str_to_date('08:09:30', '%h:%i:%s');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- 08:09:30<br />
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30<br />
<br />
可以看到，str_to_date(str,format) 转换函数，可以把一些杂乱无章的字符串转换为日期格式。另外，它也可以转换为时间。&#8220;format&#8221; 可以参看 MySQL 手册。 <br />
<br />
4. MySQL Date/Time to Str（日期/时间转换为字符串）函数：date_format(date,format), time_format(time,format) <br />
<br />
mysql&gt; select date_format('2008-08-08 22:23:00', '%W %M %Y');<br />
<br />
+------------------------------------------------+<br />
| date_format('2008-08-08 22:23:00', '%W %M %Y') |<br />
+------------------------------------------------+<br />
| Friday August 2008&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+------------------------------------------------+<br />
<br />
mysql&gt; select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');<br />
<br />
+----------------------------------------------------+<br />
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |<br />
+----------------------------------------------------+<br />
| 20080808222301&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;|<br />
+----------------------------------------------------+<br />
<br />
mysql&gt; select time_format('22:23:01', '%H.%i.%s');<br />
<br />
+-------------------------------------+<br />
| time_format('22:23:01', '%H.%i.%s') |<br />
+-------------------------------------+<br />
| 22.23.01&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; |<br />
+-------------------------------------+<br />
<br />
MySQL 日期、时间转换函数：date_format(date,format), time_format(time,format) 能够把一个日期/时间转换成各种各样的字符串格式。它是 str_to_date(str,format) 函数的 一个逆转换。 <br />
<br />
5. MySQL 获得国家地区时间格式函数：get_format() <br />
<br />
MySQL get_format() 语法： <br />
<br />
get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'<br />
<br />
MySQL get_format() 用法的全部示例： <br />
<br />
select get_format(date,'usa')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%m.%d.%Y'<br />
select get_format(date,'jis')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%Y-%m-%d'<br />
select get_format(date,'iso')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%Y-%m-%d'<br />
select get_format(date,'eur')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%d.%m.%Y'<br />
select get_format(date,'internal')&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%Y%m%d'<br />
select get_format(datetime,'usa')&nbsp; &nbsp;&nbsp; &nbsp;;&nbsp;&nbsp;-- '%Y-%m-%d %H.%i.%s'<br />
select get_format(datetime,'jis')&nbsp; &nbsp;&nbsp; &nbsp;;&nbsp;&nbsp;-- '%Y-%m-%d %H:%i:%s'<br />
select get_format(datetime,'iso')&nbsp; &nbsp;&nbsp; &nbsp;;&nbsp;&nbsp;-- '%Y-%m-%d %H:%i:%s'<br />
select get_format(datetime,'eur')&nbsp; &nbsp;&nbsp; &nbsp;;&nbsp;&nbsp;-- '%Y-%m-%d %H.%i.%s'<br />
select get_format(datetime,'internal') ;&nbsp;&nbsp;-- '%Y%m%d%H%i%s'<br />
select get_format(time,'usa')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%h:%i:%s %p'<br />
select get_format(time,'jis')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%H:%i:%s'<br />
select get_format(time,'iso')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%H:%i:%s'<br />
select get_format(time,'eur')&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%H.%i.%s'<br />
select get_format(time,'internal')&nbsp; &nbsp; ;&nbsp;&nbsp;-- '%H%i%s'<br />
<br />
MySQL get_format() 函数在实际中用到机会的比较少。 <br />
<br />
6. MySQL 拼凑日期、时间函数：makdedate(year,dayofyear), maketime(hour,minute,second) <br />
<br />
select makedate(2001,31);&nbsp;&nbsp;-- '2001-01-31'<br />
select makedate(2001,32);&nbsp;&nbsp;-- '2001-02-01'<br />
<br />
select maketime(12,15,30);&nbsp;&nbsp;-- '12:15:30'<br />
<br />
五、MySQL 时间戳（Timestamp）函数 <br />
1. MySQL 获得当前时间戳函数：current_timestamp, current_timestamp() <br />
<br />
mysql&gt; select current_timestamp, current_timestamp();<br />
<br />
+---------------------+---------------------+<br />
| current_timestamp&nbsp;&nbsp;| current_timestamp() |<br />
+---------------------+---------------------+<br />
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |<br />
+---------------------+---------------------+<br />
<br />
2. MySQL （Unix 时间戳、日期）转换函数： <br />
<br />
unix_timestamp(),<br />
unix_timestamp(date),<br />
from_unixtime(unix_timestamp),<br />
from_unixtime(unix_timestamp,format)<br />
<br />
下面是示例： <br />
<br />
select unix_timestamp();&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- 1218290027<br />
select unix_timestamp('2008-08-08');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- 1218124800<br />
select unix_timestamp('2008-08-08 12:30:00');&nbsp;&nbsp;-- 1218169800<br />
<br />
select from_unixtime(1218290027);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- '2008-08-09 21:53:47'<br />
select from_unixtime(1218124800);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- '2008-08-08 00:00:00'<br />
select from_unixtime(1218169800);&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- '2008-08-08 12:30:00'<br />
<br />
select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'<br />
<br />
3. MySQL 时间戳（timestamp）转换、增、减函数： <br />
<br />
timestamp(date)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-- date to timestamp<br />
timestamp(dt,time)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- dt + time<br />
timestampadd(unit,interval,datetime_expr)&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; --<br />
timestampdiff(unit,datetime_expr1,datetime_expr2)&nbsp;&nbsp;--<br />
<br />
请看示例部分： <br />
<br />
select timestamp('2008-08-08');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;-- 2008-08-08 00:00:00<br />
select timestamp('2008-08-08 08:00:00', '01:01:01');&nbsp; &nbsp; -- 2008-08-08 09:01:01<br />
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01<br />
<br />
select timestampadd(day, 1, '2008-08-08 08:00:00');&nbsp; &nbsp; -- 2008-08-09 08:00:00<br />
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00<br />
<br />
MySQL timestampadd() 函数类似于 date_add()。 <br />
<br />
select timestampdiff(year,'2002-05-01','2001-01-01');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- -1<br />
select timestampdiff(day ,'2002-05-01','2001-01-01');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;-- -485<br />
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00');&nbsp;&nbsp;-- -12<br />
<br />
select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00');&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; -- 7<br />
<br />
MySQL timestampdiff() 函数就比 datediff() 功能强多了，datediff() 只能计算两个日期（date）之间相差的天数。 <br />
<br />
六、MySQL 时区（timezone）转换函数 <br />
convert_tz(dt,from_tz,to_tz)<br />
<br />
select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00<br />
<br />
时区转换也可以通过 date_add, date_sub, timestampadd 来实现。 <br />
<br />
select date_add('2008-08-08 12:00:00', interval -8 hour);&nbsp;&nbsp;-- 2008-08-08 04:00:00<br />
select date_sub('2008-08-08 12:00:00', interval&nbsp;&nbsp;8 hour);&nbsp;&nbsp;-- 2008-08-08 04:00:00<br />
select timestampadd(hour, -8, '2008-08-08 12:00:00');&nbsp; &nbsp;&nbsp; &nbsp;-- 2008-08-08 04:00:00
<img src ="http://www.blogjava.net/titanaly/aggbug/291454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-08-17 11:56 <a href="http://www.blogjava.net/titanaly/archive/2009/08/17/291454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ora-00054:resource busy and acquire with nowait specified解决方法</title><link>http://www.blogjava.net/titanaly/archive/2009/07/22/287825.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Wed, 22 Jul 2009 03:39:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/07/22/287825.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/287825.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/07/22/287825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/287825.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/287825.html</trackback:ping><description><![CDATA[<p>当某个数据库用户在数据库中插入、更新、删除一个表的数据，或者增加一个表的主键时或者表的索引时，常常会出现ora-00054:resource busy and acquire with nowait specified这样的错误。</p>
<p>主要是因为有事务正在执行（或者事务已经被锁），所有导致执行不成功。</p>
<p><strong>1、用dba权限的用户查看数据库都有哪些锁</strong></p>
<p>select t2.username,t2.sid,t2.serial#,t2.logon_time<br />
from v$locked_object t1,v$session t2<br />
where t1.session_id=t2.sid order by t2.logon_time;</p>
<p>如：testuser&nbsp;339&nbsp;13545&nbsp;2009-3-5 17:40:05<br />
知道被锁的用户testuser，sid为339，serial#为13545</p>
<p><strong>2、根据sid查看具体的<a onclick="javascript:tagshow(event, 'sql');" href="javascript:;" target="_self"><u><strong>sql</strong></u></a>语句，如果sql不重要，可以kill</strong></p>
<p>select sql_text from v$session a,v$sqltext_with_newlines b<br />
&nbsp; where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value<br />
&nbsp; and a.sid=&amp;sid order by piece;</p>
<p>查出来的sql，如： begin :id := sys.dbms_transaction.local_transaction_id; end;</p>
<p><strong>3、kill该事务</strong><br />
alter system kill session '339,13545';</p>
<p><strong>4、这样就可以执行其他的事务sql语句了</strong></p>
<p>如增加表的主键：<br />
alter table test<br />
&nbsp; add constraint PK_test primary key (test_NO)；</p>
<img src ="http://www.blogjava.net/titanaly/aggbug/287825.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-07-22 11:39 <a href="http://www.blogjava.net/titanaly/archive/2009/07/22/287825.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>了解Oracle数据库中的系统参数【转】</title><link>http://www.blogjava.net/titanaly/archive/2009/07/15/286815.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Wed, 15 Jul 2009 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/07/15/286815.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/286815.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/07/15/286815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/286815.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/286815.html</trackback:ping><description><![CDATA[<font class="content"><a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>数据库系统根据初始化参数文件init.ora中设置的参数来配置自身的启动，每个实例在启动之前，首先读取这些参数文件中设置的不同参数。<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>系统中的参数，根据系统使用情况可以简单分为两大类，普通参数，也就是<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>系统正常使用的一些参数，另外一类就是特殊参数，包括三种，过时参数、强调参数和隐藏参数。随着<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>数据库新版本的发布，相应每次都会增加或者删除一些参数。如何查询当前版本数据库系统的参数情况以及当前系统版本相对于以前版本增加或者丢弃的那些参数呢？本文将详细介绍如何查询当前系统版本中的各种参数情况。 <br />
<br />
<strong>一、过时参数和强调参数</strong> <br />
<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>数据库中，系统提供了几个视图可以查看系统参数的情况。视图V$OBSOLETE_PARAMETER中含有所有的过时(obsolete)和强调(underscored)参数。这里首先说明一下什么是<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>的过时(obsolote)和强调(underscored)参数，过时参数，顾名思义就是在<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>以前的版本中存在，但在新版本中已经淘汰了的参数，已经不再使用；而强调参数，是指那些在新版本中保留了下来，但是除非特殊需要不希望用户使用的那些参数。在视图V$OBSOLETE_PARAMETER中，包含这些参数的名称和一个标志字ISSPECIFIED，该标志字用来指出这个参数是否在init.ora文件中已实际设置。 <br />
<br />
下面的SQL脚本列出了当前系统中所有的过时参数名称以及它们是否在当前系统中设定。 <br />
<br />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="580" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">SQL&gt; COL name format a50;<br />
            SQL&gt; SELECT name, isspecified FROM v$obsolete_parameter;</td>
        </tr>
    </tbody>
</table>
<br />
上面谈到，<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>系统并没有将V$OBSOLETE_PARAMETER视图中的所有参数均丢弃，而是将其中的一部分转换为强调参数，下面就来讨论如何查看这些参数是已被丢弃还是被转换。这可以通过系统视图X$KSPPO来查看，该视图中包含一个名为KSPPOFLAG的字段，用来指明该参数在当前版本中是被丢弃还是被强调，如果该值为1，则表示该参数已被丢弃，该值为2，则表明该参数现为强调参数。 <br />
<br />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="580" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">SELECT kspponm,<br />
            DECODE(ksppoflg, 1,'Obsolete', 2, 'Underscored')<br />
            FROM x$ksppo<br />
            ORDER BY kspponm;</td>
        </tr>
    </tbody>
</table>
<br />
注：该视图只在sys用户下可以看到。 <br />
<br />
<strong>二、隐藏参数</strong> <br />
<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>系统中还有一类参数称之为隐藏参数(hidden parameters)，是系统中使用，但<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>官方没有公布的参数，这些参数可能是那些还没有成熟或者是系统开发中使用的参数。这些参数在所有<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>官方提供的文档中都没有介绍，他们的命名有一个共同特征就是都以'_'作为参数的首字符，诸如<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a> 8i中的_trace_files_public和_lock_sga_areas等等。 <br />
<br />
下面的查询可以得到当前系统中的所有隐藏参数(以sys身份登录)： <br />
<br />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="580" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">SELECT ksppinm, ksppstvl, ksppdesc<br />
            FROM x$ksppi x, x$ksppcv y<br />
            WHERE x.indx = y.indx<br />
            AND translate(ksppinm,'_','#') like '#%';</td>
        </tr>
    </tbody>
</table>
<br />
<strong>三、系统当前参数</strong> <br />
下面的脚本以英文字母顺序列出了系统当前使用的所有参数。在列出的参数中，如果参数名称前面有#这个符号，则表示该参数没有明确指定，采用了系统中的默认参数。一般在一个新的<a href="http://www.cnnet.com.cn/servlets/ad?ajlink=http%3a%2f%2fwww%2eoracle%2ecom%2fglobal%2fcn&amp;ajbid=167&amp;Pool=homebutton&amp;ajpage=/">Oracle</a>版本安装完成后，首先运行该脚本，则可以生成该版本数据库的标准init.ora文件。 <br />
<br />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="580" bordercolorlight="black" border="1">
    <tbody>
        <tr>
            <td class="code" bgcolor="#e6e6e6">SET pagesize 9000<br />
            SET head OFF<br />
            SET term OFF<br />
            SELECT<br />
            DECODE(isdefault, 'TRUE', '# ') ||<br />
            DECODE(isdefault, 'TRUE', RPAD(name,43), RPAD(name,45)) ||<br />
            ' = ' || value<br />
            FROM v$parameter<br />
            ORDER BY name;</td>
        </tr>
    </tbody>
</table>
<br />
注意：上面的SQL脚本没有列出系统中的隐藏参数</font> 
<img src ="http://www.blogjava.net/titanaly/aggbug/286815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-07-15 11:17 <a href="http://www.blogjava.net/titanaly/archive/2009/07/15/286815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle job 管理</title><link>http://www.blogjava.net/titanaly/archive/2009/07/11/286368.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Sat, 11 Jul 2009 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/07/11/286368.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/286368.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/07/11/286368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/286368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/286368.html</trackback:ping><description><![CDATA[<p>SVRMGR&gt; select * from dba_jobs;</p>
<p>初始化相关参数job_queue_processes<br />
alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000&nbsp; ;job_queue_interval = 10&nbsp; //调度作业刷新频率秒为单位<br />
DBA_JOBS describes all jobs in the database. <br />
USER_JOBS describes all jobs owned by the current user</p>
<p>1&nbsp; select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)<br />
2 select job,what,last_date,next_date,interval from&nbsp; dba_jobs where job in (1,3);</p>
<p><br />
查询job的情况。<br />
show paramter background_dump_dest.<br />
看alter.log 和trace</p>
<p>
<p>SVRMGR&gt; select * from dba_jobs;</p>
<p>初始化相关参数job_queue_processes<br />
alter system set job_queue_processes=39 scope=spfile;//最大值不能超过1000</p>
<p>job_queue_interval = 10&nbsp; //调度作业刷新频率秒为单位</p>
<p><br />
DBA_JOBS describes all jobs in the database. <br />
USER_JOBS describes all jobs owned by the current user</p>
<p>1&nbsp; select job,what,to_char(last_date,'yyyy-mm-dd HH24:mi:ss'),to_char(next_date,'yyyy-mm-dd HH24:m),interval from dba_jobs where job in (325,295)<br />
2 select job,what,last_date,next_date,interval from&nbsp; dba_jobs where job in (1,3);</p>
<p><br />
查询job的情况。<br />
show paramter background_dump_dest.<br />
看alter.log 和trace</p>
<p>
<p>请问我如何停止一个JOB<br />
SQL&gt; exec dbms_job.broken(1,true)</p>
<p>PL/SQL 过程已成功完成。<br />
SQL&gt;commit&nbsp; //必须提交否则无效</p>
<p>启动作业<br />
SQL&gt; exec dbms_job.broken(1,false)</p>
<p>PL/SQL 过程已成功完成。</p>
<p>停其他用户的job<br />
SQL&gt;exec sys.dbms_ijob.broken(98,true);<br />
SQL&gt;commit;</p>
<p><br />
============================</p>
<p>exec dbms_job.broken(:job) 停止<br />
exec dbms_job.broken(186,true) //标记位broken<br />
exec dbms_job.broken(186,false)//标记为非broken<br />
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行时间<br />
exec dbms_job.remove(:job)；删除<br />
exec dbms_job.remove(186);<br />
commit；</p>
<p>把一个broken job重新运行</p>
<p><br />
三、查看相关job信息<br />
1、相关视图<br />
dba_jobs<br />
all_jobs<br />
user_jobs<br />
dba_jobs_running 包含正在运行job相关信息</p>
<p><br />
创建JOB<br />
variable jobno number;<br />
begin<br />
&nbsp; dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);<br />
&nbsp; commit;<br />
end;<br />
print jobno</p>
<p>例如，我们已经建立了一个存储过程，其名称为my_job，在sql/plus中以scott用户身份登录，执行如下命令： <br />
sql&gt; variable n number; <br />
sql&gt; begin <br />
dbms_job.submit(:n&#8216;my_job;&#8217;,sysdate, <br />
&#8216;sysdate＋1/360&#8217;); <br />
commit; <br />
end;<br />
Sql&gt; print :n; </p>
<p>系统提示执行成功。 <br />
Sql&gt; print :n; <br />
系统打印此任务的编号，例如结果为300。 </p>
<p>
<p>简单例子<br />
一个简单例子： </p>
<p>创建测试表<br />
SQL&gt; create table TEST(a date);</p>
<p>表已创建。</p>
<p>创建一个自定义过程<br />
SQL&gt; create or replace procedure MYPROC as<br />
&nbsp; 2&nbsp; begin<br />
&nbsp; 3&nbsp; insert into TEST values(sysdate);<br />
&nbsp; 4&nbsp; end;<br />
&nbsp; 5&nbsp; /</p>
<p>过程已创建。</p>
<p>创建JOB<br />
SQL&gt; variable job1 number;<br />
SQL&gt; <br />
SQL&gt; begin<br />
&nbsp; 2&nbsp; dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');　　--每天1440分钟，即一分钟运行test过程一次<br />
&nbsp; 3&nbsp; end;<br />
&nbsp; 4&nbsp; /</p>
<p>PL/SQL 过程已成功完成。</p>
<p>运行JOB<br />
SQL&gt; begin<br />
&nbsp; 2&nbsp; dbms_job.run(:job1);<br />
&nbsp; 3&nbsp; end;<br />
&nbsp; 4&nbsp; /</p>
<p>PL/SQL 过程已成功完成。</p>
<p>SQL&gt; select to_char(a,'yyyy/mm/dd hh24:mi:ss') 时间 from TEST;</p>
<p>时间<br />
-------------------<br />
2001/01/07 23:51:21<br />
2001/01/07 23:52:22<br />
2001/01/07 23:53:24</p>
<p>删除JOB<br />
SQL&gt; begin<br />
&nbsp; 2&nbsp; dbms_job.remove(:job1);<br />
&nbsp; 3&nbsp; end;<br />
&nbsp; 4&nbsp; /</p>
<p>PL/SQL 过程已成功完成。</p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<p><br />
a、利用dbms_job.run()立即执行该job<br />
&nbsp;&nbsp; sql&gt;begin<br />
&nbsp;&nbsp; sql&gt;dbms_job.run(:jobno) 该jobno为submit过程提交时返回的job number<br />
&nbsp;&nbsp; sql&gt;end;<br />
&nbsp;&nbsp; sql&gt;/<br />
b、利用dbms_job.broken()重新将broken标记为false<br />
&nbsp;&nbsp; sql&gt;begin<br />
&nbsp;&nbsp; sql&gt;dbms_job.broken (:job,false,next_date)<br />
&nbsp;&nbsp; sql&gt;end;<br />
&nbsp;&nbsp; sql&gt;/</p>
<p>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
SQL&gt; create table a(a date);<br />
Table created</p>
<p>创建一个过程<br />
SQL&gt; create or replace procedure test as<br />
&nbsp; 2&nbsp; begin<br />
&nbsp; 3&nbsp; insert into a values(sysdate);<br />
&nbsp; 4&nbsp; end;<br />
&nbsp; 5&nbsp; /<br />
Procedure created</p>
<p>提交作业<br />
SQL&gt; declare<br />
&nbsp; 2&nbsp; job1 number;&nbsp;&nbsp; //定义一个数字型变量<br />
&nbsp; 3&nbsp; begin<br />
&nbsp; 4&nbsp; dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');&nbsp; //按分钟算一天1440分钟<br />
&nbsp; 5&nbsp; end;<br />
&nbsp; 6&nbsp; /<br />
PL/SQL procedure successfully completed<br />
job1<br />
---------<br />
4<br />
SQL&gt; commit;<br />
Commit complete</p>
<p>运行作业<br />
SQL&gt; begin<br />
&nbsp; 2&nbsp; dbms_job.run(4);<br />
&nbsp; 3&nbsp; end;<br />
&nbsp; 4&nbsp; /<br />
PL/SQL procedure successfully completed</p>
<p>删除作业<br />
SQL&gt; begin<br />
&nbsp; 2&nbsp; dbms_job.remove(4);<br />
&nbsp; 3&nbsp; end;<br />
&nbsp; 4&nbsp; /<br />
PL/SQL procedure successfully completed<br />
SQL&gt; commit;<br />
Commit complete</p>
<p><br />
job change//修改作业<br />
execute dbms_job.change(186,null,null,'sysdate+3');<br />
execute dbms_job.change(186,'scott.test(update)');</p>
<p>
<p>DBA_JOBS<br />
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
字段（列）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述 <br />
JOB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务的唯一标示号 <br />
LOG_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 提交任务的用户 <br />
PRIV_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 赋予任务权限的用户 <br />
SCHEMA_USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(30)&nbsp;&nbsp;&nbsp; 对任务作语法分析的用户模式 <br />
LAST_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后一次成功运行任务的时间 <br />
LAST_SEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的last_date日期的小时，分钟和秒 <br />
THIS_DATE &nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正在运行任务的开始时间，如果没有运行任务则为null <br />
THIS_SEC &nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的this_date日期的小时，分钟和秒 <br />
NEXT_DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下一次定时运行任务的时间 <br />
NEXT_SEC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(8)&nbsp;&nbsp;&nbsp;&nbsp; 如HH24:MM:SS格式的next_date日期的小时，分钟和秒 <br />
TOTAL_TIME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该任务运行所需要的总时间，单位为秒 <br />
BROKEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(1)&nbsp;&nbsp;&nbsp;&nbsp; 标志参数，Y标示任务中断，以后不会运行 <br />
INTERVAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(200)&nbsp;&nbsp; 用于计算下一运行时间的表达式 <br />
FAILURES&nbsp;&nbsp;&nbsp; NUMBER &nbsp;&nbsp;&nbsp; 任务运行连续没有成功的次数 <br />
WHAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2000)&nbsp; 执行任务的PL/SQL块 <br />
CURRENT_SESSION_LABEL RAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MLSLABEL 该任务的信任Oracle会话符 <br />
CLEARANCE_HI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW MLSLABEL&nbsp;&nbsp;&nbsp;&nbsp; 该任务可信任的Oracle最大间隙 <br />
CLEARANCE_LO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MLSLABEL 该任务可信任的Oracle最小间隙 <br />
NLS_ENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(2000)&nbsp;&nbsp; 任务运行的NLS会话设置 <br />
MISC_ENV&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW(32)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任务运行的其他一些会话参数 </p>
<p>
<p><br />
描述&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INTERVAL参数值 <br />
每天午夜12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'TRUNC(SYSDATE + 1)' <br />
每天早上8点30分&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'TRUNC(SYSDATE + 1) + （8*60+30）/(24*60)' <br />
每星期二中午12点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24' <br />
每个月第一天的午夜12点&nbsp;&nbsp;&nbsp; 'TRUNC(LAST_DAY(SYSDATE ) + 1)' <br />
每个季度最后一天的晚上11点 'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24' <br />
每星期六和日早上6点10分&nbsp;&nbsp;&nbsp; 'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + （6&#215;60+10）/（24&#215;60）' <br />
<br />
<span style="color: red">Oracle9i 中job_queue_interval已经废弃（obsoleted)，job_queue_processes=10默认，实际上，job_queue_interval的值为5，假如实在要修改interval的值，可以使用_job_queue_interval的隐藏参数。<br />
</span></p>
 <img src ="http://www.blogjava.net/titanaly/aggbug/286368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-07-11 12:45 <a href="http://www.blogjava.net/titanaly/archive/2009/07/11/286368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中Null与空字符串''的区别</title><link>http://www.blogjava.net/titanaly/archive/2009/06/17/282817.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Wed, 17 Jun 2009 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/06/17/282817.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/282817.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/06/17/282817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/282817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/282817.html</trackback:ping><description><![CDATA[1、Windows NT4.0+ORACLE 8.0.4 <br />
2、ORACLE安装路径为：C:ORANT <br />
<br />
含义解释： <br />
问：什么是NULL？ <br />
答：在我们不知道具体有什么数据的时候，也即未知，可以用NULL，我们称它为空，ORACLE中，含有空值的表列长度为零。 <br />
ORACLE允许任何一种数据类型的字段为空，除了以下两种情况： <br />
1、主键字段（primary key）， <br />
2、定义时已经加了NOT NULL限制条件的字段 <br />
<br />
说明： <br />
1、等价于没有任何值、是未知数。 <br />
2、NULL与0、空字符串、空格都不同。 <br />
3、对空值做加、减、乘、除等运算操作，结果仍为空。 <br />
4、NULL的处理使用NVL函数。 <br />
5、比较时使用关键字用&#8220;is null&#8221;和&#8220;is not null&#8221;。 <br />
6、空值不能被索引，所以查询时有些符合条件的数据可能查不出来，count(*)中，用nvl(列名,0)处理后再查。 <br />
7、排序时比其他数据都大（索引默认是降序排列，小&#8594;大），所以NULL值总是排在最后。 <br />
<br />
使用方法： <br />
SQL&gt; select 1 from dual where null=null; <br />
<br />
没有查到记录 <br />
<br />
SQL&gt; select 1 from dual where null=''; <br />
<br />
没有查到记录 <br />
<br />
SQL&gt; select 1 from dual where ''=''; <br />
<br />
没有查到记录 <br />
<br />
SQL&gt; select 1 from dual where null is null; <br />
<br />
1 <br />
--------- <br />
1 <br />
<br />
SQL&gt; select 1 from dual where nvl(null,0)=nvl(null,0); <br />
<br />
1 <br />
--------- <br />
1 <br />
<br />
对空值做加、减、乘、除等运算操作，结果仍为空。 <br />
SQL&gt; select 1+null from dual; <br />
SQL&gt; select 1-null from dual; <br />
SQL&gt; select 1*null from dual; <br />
SQL&gt; select 1/null from dual; <br />
<br />
查询到一个记录. <br />
<br />
注：这个记录就是SQL语句中的那个null <br />
<br />
设置某些列为空值 <br />
update table1 set 列1=NULL where 列1 is not null; <br />
<br />
现有一个商品销售表sale，表结构为： <br />
month　　　 char(6)　　　　　 --月份 <br />
sell　　　　number(10,2)　　　--月销售金额 <br />
<br />
create table sale (month char(6),sell number); <br />
insert into sale values('200001',1000); <br />
insert into sale values('200002',1100); <br />
insert into sale values('200003',1200); <br />
insert into sale values('200004',1300); <br />
insert into sale values('200005',1400); <br />
insert into sale values('200006',1500); <br />
insert into sale values('200007',1600); <br />
insert into sale values('200101',1100); <br />
insert into sale values('200202',1200); <br />
insert into sale values('200301',1300); <br />
insert into sale values('200008',1000); <br />
insert into sale(month) values('200009');（注意：这条记录的sell值为空） <br />
commit; <br />
共输入12条记录 <br />
<br />
SQL&gt; select * from sale where sell like '%'; <br />
<br />
MONTH SELL <br />
------ --------- <br />
200001 1000 <br />
200002 1100 <br />
200003 1200 <br />
200004 1300 <br />
200005 1400 <br />
200006 1500 <br />
200007 1600 <br />
200101 1100 <br />
200202 1200 <br />
200301 1300 <br />
200008 1000 <br />
<br />
查询到11记录. <br />
<br />
结果说明： <br />
查询结果说明此SQL语句查询不出列值为NULL的字段 <br />
此时需对字段为NULL的情况另外处理。 <br />
SQL&gt; select * from sale where sell like '%' or sell is null; <br />
SQL&gt; select * from sale where nvl(sell,0) like '%'; <br />
<br />
MONTH SELL <br />
------ --------- <br />
200001 1000 <br />
200002 1100 <br />
200003 1200 <br />
200004 1300 <br />
200005 1400 <br />
200006 1500 <br />
200007 1600 <br />
200101 1100 <br />
200202 1200 <br />
200301 1300 <br />
200008 1000 <br />
200009 <br />
<br />
查询到12记录. <br />
<br />
Oracle的空值就是这么的用法，我们最好熟悉它的约定，以防查出的结果不正确。 <br />
<br />
以上来自<a href="http://www.cnoug.org/viewthread.php?tid=15087">http://www.cnoug.org/viewthread.php?tid=15087</a>
<p>&nbsp;</p>
<p>但对于char 和varchar2类型的数据库字段中的null和空字符串是否有区别呢？</p>
<p>作一个测试：</p>
<p>create table test (a char(5),b char(5));</p>
<p>SQL&gt; insert into test(a,b) values('1','1');</p>
<p>SQL&gt; insert into test(a,b) values('2','2');</p>
<p>SQL&gt; insert into test(a,b) values('3','');--按照上面的解释，b字段有值的</p>
<p>SQL&gt; insert into test(a) values('4');</p>
<p>SQL&gt; select * from test;</p>
<p>A B<br />
---------- ----------<br />
1 1<br />
2 2<br />
3<br />
4</p>
<p>SQL&gt; select * from test where b='';----按照上面的解释，应该有一条记录，但实际上没有记录</p>
<p>未选定行</p>
<p>SQL&gt; select * from test where b is null;----按照上面的解释，应该有一跳记录，但实际上有两条记录。</p>
<p>A B<br />
---------- ----------<br />
3<br />
4</p>
<p>SQL&gt;update table test set b='' where a='2';<br />
SQL&gt; select * from test where b='';</p>
<p>未选定行</p>
<p>SQL&gt; select * from test where b is null;</p>
<p>A B<br />
---------- ----------<br />
2<br />
3<br />
4</p>
<p>测试结果说明，对char和varchar2字段来说，''就是null；但对于where 条件后的'' 不是null。</p>
<p>对于缺省值，也是一样的！<br />
&nbsp;</p>
<p><a href="http://yseraphi.itpub.net/post/720/114646">http://yseraphi.itpub.net/post/720/114646</a></p>
 <img src ="http://www.blogjava.net/titanaly/aggbug/282817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-06-17 12:00 <a href="http://www.blogjava.net/titanaly/archive/2009/06/17/282817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>请问在Oracle中取第10条记录到第20条记录，效率最高的SQL语句怎么写？</title><link>http://www.blogjava.net/titanaly/archive/2009/06/05/280260.html</link><dc:creator>不高兴</dc:creator><author>不高兴</author><pubDate>Fri, 05 Jun 2009 11:34:00 GMT</pubDate><guid>http://www.blogjava.net/titanaly/archive/2009/06/05/280260.html</guid><wfw:comment>http://www.blogjava.net/titanaly/comments/280260.html</wfw:comment><comments>http://www.blogjava.net/titanaly/archive/2009/06/05/280260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/titanaly/comments/commentRss/280260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/titanaly/services/trackbacks/280260.html</trackback:ping><description><![CDATA[<ol class="dp-j">
    <li><span><span>oracle &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>select&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;table&nbsp;&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;rownum&lt;</span><span class="number">20</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;minus&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;select&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;table&nbsp;&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;rownum&lt;</span><span class="number">10</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//但这种查询的效率更高于前者&nbsp;(556436条数据，测试结果) </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>select&nbsp;*&nbsp;from&nbsp;(select&nbsp;rownum&nbsp;r,a.*&nbsp;from&nbsp;blog&nbsp;a&nbsp;where&nbsp;rownum&lt;=</span><span class="number">20</span><span>)&nbsp;where&nbsp;r&gt;=</span><span class="number">10</span><span>; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;table&nbsp;LIMIT&nbsp;</span><span class="number">5</span><span>,</span><span class="number">10</span><span>;&nbsp;&nbsp;</span><span class="comment">//&nbsp;检索记录行&nbsp;6-15 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//为了检索从某一个偏移量到记录集的结束所有的记录行，可以指定第二个参数为&nbsp;-1：&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;table&nbsp;LIMIT&nbsp;</span><span class="number">95</span><span>,-</span><span class="number">1</span><span>;&nbsp;</span><span class="comment">//&nbsp;检索记录行&nbsp;96-last. </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//如果只给定一个参数，它表示返回最大的记录行数目：&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>mysql&gt;&nbsp;SELECT&nbsp;*&nbsp;FROM&nbsp;table&nbsp;LIMIT&nbsp;</span><span class="number">5</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//检索前&nbsp;5&nbsp;个记录行 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//换句话说，LIMIT&nbsp;n&nbsp;等价于&nbsp;LIMIT&nbsp;0,n </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>mysql&nbsp;limit查询优化[转载],由于limit经常用到，却没有注意，因为平时做的项目都比较小，所以也没有考虑去怎么优化，今天看了一篇关于mysql&nbsp;limit优化的文章，感觉很好&nbsp;于是转载过来 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>原文地址在这里 &nbsp;&nbsp;</span></li>
    <li><span>http:</span><span class="comment">//www.phpobject.net/blog/read.php?119 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>MYSQL的优化是非常重要的。其他最常用也最需要优化的就是limit。mysql的limit给分页带来了极大的方便，但数据量一大的时候，limit的性能就急剧下降。 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同样是取</span><span class="number">10</span><span>条数据 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>select&nbsp;*&nbsp;from&nbsp;yanxue8_visit&nbsp;limit&nbsp;</span><span class="number">10000</span><span>,</span><span class="number">10</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;和 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>select&nbsp;*&nbsp;from&nbsp;yanxue8_visit&nbsp;limit&nbsp;</span><span class="number">0</span><span>,</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>就不是一个数量级别的。 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;网上也很多关于limit的五条优化准则，都是翻译自mysql手册，虽然正确但不实用。今天发现一篇文章写了些关于limit优化的，很不错。原文地址：http:</span><span class="comment">//www.zhenhua.org/article.asp?id=200 </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;文中不是直接使用limit，而是首先获取到offset的id然后直接使用limit&nbsp;size来获取数据。根据他的数据，明显要好于直接使用limit。这里我具体使用数据分两种情况进行测试。（测试环境win2033+p4双核&nbsp;(3GHZ)&nbsp;+4G内存&nbsp;mysql&nbsp;</span><span class="number">5.0</span><span>.</span><span class="number">19</span><span>） &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">1</span><span>、offset比较小的时候。 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>select&nbsp;*&nbsp;from&nbsp;yanxue8_visit&nbsp;limit&nbsp;</span><span class="number">10</span><span>,</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;多次运行，时间保持在</span><span class="number">0.0004</span><span>-</span><span class="number">0.0005</span><span>之间 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Select&nbsp;*&nbsp;From&nbsp;yanxue8_visit&nbsp;Where&nbsp;vid&nbsp;&gt;=( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Select&nbsp;vid&nbsp;From&nbsp;yanxue8_visit&nbsp;Order&nbsp;By&nbsp;vid&nbsp;limit&nbsp;</span><span class="number">10</span><span>,</span><span class="number">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>)&nbsp;limit&nbsp;</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;多次运行，时间保持在</span><span class="number">0.0005</span><span>-</span><span class="number">0.0006</span><span>之间，主要是</span><span class="number">0.0006</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;结论：偏移offset较小的时候，直接使用limit较优。这个显然是子查询的原因。 &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="number">2</span><span>、offset大的时候。 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>select&nbsp;*&nbsp;from&nbsp;yanxue8_visit&nbsp;limit&nbsp;</span><span class="number">10000</span><span>,</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;多次运行，时间保持在</span><span class="number">0.0187</span><span>左右 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Select&nbsp;*&nbsp;From&nbsp;yanxue8_visit&nbsp;Where&nbsp;vid&nbsp;&gt;=( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>Select&nbsp;vid&nbsp;From&nbsp;yanxue8_visit&nbsp;Order&nbsp;By&nbsp;vid&nbsp;limit&nbsp;</span><span class="number">10000</span><span>,</span><span class="number">1</span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>)&nbsp;limit&nbsp;</span><span class="number">10</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>多次运行，时间保持在</span><span class="number">0.0061</span><span>左右，只有前者的</span><span class="number">1</span><span>/</span><span class="number">3</span><span>。可以预计offset越大，后者越优。 &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span>以后要注意改正自己的limit语句，优化一下mysql了&nbsp;&nbsp;</span></li>
</ol>
 <img src ="http://www.blogjava.net/titanaly/aggbug/280260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/titanaly/" target="_blank">不高兴</a> 2009-06-05 19:34 <a href="http://www.blogjava.net/titanaly/archive/2009/06/05/280260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>