??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久久久成人,中文字幕久久精品一区二区,精品三区视频http://www.aygfsteel.com/titanaly/category/40112.htmlzh-cnSat, 19 Dec 2009 11:17:46 GMTSat, 19 Dec 2009 11:17:46 GMT60Oracle 日期查询http://www.aygfsteel.com/titanaly/archive/2009/12/15/306016.html不高?/dc:creator>不高?/author>Tue, 15 Dec 2009 05:40:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/12/15/306016.htmlhttp://www.aygfsteel.com/titanaly/comments/306016.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/12/15/306016.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/306016.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/306016.htmlselect   *   from   mytable   where   to_char(install_date,'YYYYMMDD')   >   '20050101'  

select   *   from   mytable   where   install_date     >   to_date('20050101','yyyymmdd');

取得当前日期是本月的W几?/p>

SQL>   select   to_char(sysdate,'YYYYMMDD   W   HH24:MI:SS')   from   dual;
  
TO_CHAR(SYSDATE,'YY
-------------------
20030327   4   18:16:09
  
SQL>   select   to_char(sysdate,'W')   from   dual;
  
T
-
4

?:取得当前日期是一个星期中的第几天,注意星期日是W一?/p>

SQL>   select   sysdate,to_char(sysdate,'D')   from   dual;
  
SYSDATE       T
---------   -
27-MAR-03   5

cM:

select   to_char(sysdate,'yyyy')   from   dual;   --q?
select   to_char(sysdate,'Q'   from   dual;           --?
select   to_char(sysdate,'mm')   from   dual;       --?
select   to_char(sysdate,'dd')   from   dual;       --?
ddd   q中的第几天
WW   q中的第几个星期
W   该月中第几个星期

DAY 周中的星期几
D   今天Ҏ的NUMBER

'1','星期?,  '2','星期一', '3','星期?, '4','星期?, '5','星期?,  '6','星期?,  '7','星期?
hh   时(12)
hh24   时(24)
Mi   ?
ss   U?/p>

?:取当前日期是星期几中文显C?

SQL>   select   to_char(sysdate,'day')   from   dual;
  
TO_CHAR(SYSDATE,'DAY')
----------------------
星期?/p>

?:如果一个表在一个datecd的字D上面徏立了索引Q如何?/p>

alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'


?: 得到当前的日?br /> select sysdate from dual;

?: 得到当天凌晨0??U的日期
select trunc(sysdate) from dual;

-- 得到q天的最后一U?br /> select trunc(sysdate) + 0.99999 from dual;

-- 得到时的具体数?br /> select trunc(sysdate) + 1/24 from dual;

select trunc(sysdate) + 7/24 from dual;

?:得到明天凌晨0??U的日期

select trunc(sysdate+1) from dual;

select trunc(sysdate)+1 from dual;


?: 本月一日的日期
select trunc(sysdate,'mm') from dual;


?:得到下月一日的日期
select trunc(add_months(sysdate,1),'mm') from dual;

?0:q回当前月的最后一?
select last_day(sysdate) from dual;      
select last_day(trunc(sysdate)) from dual;
select trunc(last_day(sysdate)) from dual;
select trunc(add_months(sysdate,1),'mm') - 1 from dual;


?1: 得到一q的每一?br /> select trunc(sysdate,'yyyy')+ rn -1 date0
from
(select rownum rn from all_objects
where rownum<366);


?2:今天是今q的WN?br /> SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;

?3:如何在给现有的日期加?q?br /> select add_months(sysdate,24) from dual;

?4:判断某一日子所在年分是否ؓ润年
select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','闰年','q_') from dual;

?5:判断两年后是否ؓ润年
select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','闰年','q_') from dual;


?6:得到日期的季?/p>

select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;

select to_char(sysdate, 'Q') from dual;


获取本周一,周日的日?/p>

select trunc(sysdate,'d')+1,trunc(sysdate,'d')+7 from dual;



]]>
oracle行{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/12/15/306009.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/306009.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/12/15/306009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/306009.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/306009.html</trackback:ping><description><![CDATA[1.<br /> 概述<br /> 最q论坛很多h提的问题都与行列转换有关p,所以我对行列{换的相关知识做了一个ȝQ希望对大家有所帮助Q同时有何错疏,恌大家指出Q我也是在写作过E中学习Q算是一起和大家学习吧!<br /> 行列转换包括以下六种情况Q?br /> 1)<br /> 列{?br /> 2)<br /> 行{?br /> 3)<br /> 多列转换成字W串<br /> 4)<br /> 多行转换成字W串<br /> 5)<br /> 字符串{换成多列<br /> 6)<br /> 字符串{换成多行<br /> 下面分别q行举例介绍?br /> 首先声明一点,有些例子需要如?0g及以后才有的知识Q?br /> A.<br /> 掌握model子句<br /> B.<br /> 正则表达?br /> C.<br /> 加强的层ơ查?br /> 讨论的适用范围只包?i,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 /> 适用范围Q?i,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条gQ?br /> WHERE COLUMN IS NOT NULL 卛_?br /> 2.2<br /> MODEL<br /> 适用范围Q?0g及以?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 /> 适用范围Q?i,9i,10g及以后版?br /> 要创Z个对象和一个集合:<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 /> 适用范围Q?i,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 /> 被指定的转置列只能有一列,但固定的列可以有多列Q请看下面的例子Q?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 /> q里转置列ؓempnoQ固定列为mgrQdeptno?br /> q有一U行转列的方式,是相同l中的行值变为单个列|但{|的行g变ؓ列名Q?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 /> q种情况可以用分析函数实玎ͼ<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 /> 适用范围Q?i,9i,10g及以后版?br /> q种对于行g固定的情况可以用?br /> 下面是我写的一个包Q包?br /> p_rows_column_real用于前述的第一U不限定列的转换Q?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 < 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 > 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 /> 多列转换成字W串<br /> CREATE TABLE t_col_str AS<br /> SELECT * FROM t_col_row;<br /> q个比较单,用||或concat函数可以实现Q?br /> SELECT concat('a','b') FROM dual;<br /> 4.1<br /> || OR CONCAT<br /> 适用范围Q?i,9i,10g及以后版?br /> SELECT * FROM t_col_str;<br /> SELECT ID,c1||','||c2||','||c3 AS c123<br /> FROM t_col_str;<br /> 5.<br /> 多行转换成字W串<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 /> 适用范围Q?i,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 /> 适用范围Q?i,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 /> 适用范围Q?0g及以后版?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 /> 适用范围Q?i,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 /> 适用范围Q?0g及以后版?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 /> 适用范围Q?0g及以后版?br /> q个函数预定义按','分隔字符Ԍ若要用其他符号分隔可以用Qreplace?,'替换?br /> SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str<br /> FROM t_row_str<br /> GROUP BY id;<br /> 6.<br /> 字符串{换成多列<br /> 其实际上是一个字W串拆分的问题?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 /> 适用范围Q?i,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 /> 适用范围Q?0g及以后版?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 /> 适用范围Q?i,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 /> 适用范围Q?0g及以后版?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 /> 适用范围Q?i,9i,10g及以后版?br /> 要创Z个可变数l:<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 <=<br /> t.cnt<br /> ORDER BY 1, 2;<br /> 7.3<br /> SEQUENCE SERIES<br /> q类Ҏ主要是要产生一个连l的整数列,产生q箋整数列的Ҏ有很多,主要有:<br /> CONNECT BY,ROWNUM+all_objects,CUBE{?br /> 适用范围Q?i,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 <= 5) c<br /> WHERE c.lv <= 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 <= 5) c<br /> WHERE c.rn <= 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 <= t.cnt<br /> ORDER BY 1, 2;<br /> 适用范围Q?0g及以后版?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 <= 5) c ON c.lv <= t.cnt<br /> ORDER BY 1, 2;<br /> 7.4<br /> HIERARCHICAL + DBMS_RANDOM<br /> 适用范围Q?0g及以后版?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 <=<br /> length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))<br /> ORDER BY 1, 2;<br /> 7.5<br /> HIERARCHICAL + CONNECT_BY_ROOT<br /> 适用范围Q?0g及以后版?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 <=<br /> length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))<br /> ORDER BY 1, 2;<br /> 7.6<br /> MODEL<br /> 适用范围Q?0g及以后版?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.aygfsteel.com/titanaly/aggbug/306009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-12-15 13:16 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/12/01/304348.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/304348.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/12/01/304348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/304348.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/304348.html</trackback:ping><description><![CDATA[  select 'select * from '||wl.table1||' where rowid= ''' || wl.aa||''';' from<br />   (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 />       from  v$session s , dba_waiters w , v$locked_object l , dba_objects o<br />       where w.waiting_session=s.SID<br />         and w.mode_held='Exclusive'<br />         and w.waiting_session=l.SESSION_ID<br />         and l.OBJECT_ID=o.object_id ) wl; <img src ="http://www.aygfsteel.com/titanaly/aggbug/304348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-12-01 11:34 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/11/23/303324.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/303324.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/11/23/303324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/303324.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/303324.html</trackback:ping><description><![CDATA[mssql Server中的日期与时间函?<br /> 1. 当前pȝ日期、时?<br /> select getdate() <br /> <br /> 2. dateadd 在向指定日期加上一D|间的基础上,q回新的 datetime ?<br /> 例如Q向日期加上2?<br /> select dateadd(day,2,'2004-10-15') --q回Q?004-10-17 00:00:00.000<br /> <br /> 3. datediff q回跨两个指定日期的日期和时间边界数?br /> select datediff(day,'2004-09-01','2004-09-18') --q回Q?7<br /> <br /> 4. datepart q回代表指定日期的指定日期部分的整数?br /> SELECT DATEPART(month, '2004-10-15') --q回 10<br /> <br /> 5. datename q回代表指定日期的指定日期部分的字符?br /> SELECT datename(weekday, '2004-10-15') --q回Q星期五<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 本年W多周=datename(week,'2004-10-15') <br /> ,今天是周?datename(weekday,'2004-10-15')<br /> <br /> <br /> 函数 参数/功能 <br /> GetDate( ) q回pȝ目前的日期与旉 <br /> DateDiff (interval,date1,date2) 以interval 指定的方式,q回date2 与date1两个日期之间的差?date2-date1 <br /> DateAdd (interval,number,date) 以interval指定的方式,加上number之后的日?<br /> DatePart (interval,date) q回日期date中,interval指定部分所对应的整数?<br /> DateName (interval,date) q回日期date中,interval指定部分所对应的字W串名称 <br /> <br /> 参数 interval的设定值如下:<br /> <br /> ?~?写(Sql ServerQ?(Access ?ASP) 说明 <br /> Year Yy yyyy q?1753 ~ 9999 <br /> Quarter Qq q ?1 ~ 4 <br /> Month Mm m ? ~ 12 <br /> Day of year Dy y 一q的日数,一q中的第几日 1-366 <br /> Day Dd d 日,1-31 <br /> Weekday Dw w 一周的日数Q一周中的第几日 1-7 <br /> Week Wk ww 周,一q中的第几周 0 ~ 51 <br /> Hour Hh h ? ~ 23 <br /> Minute Mi n 分钟0 ~ 59 <br /> Second Ss s U?0 ~ 59 <br /> Millisecond Ms - 毫秒 0 ~ 999 <br /> <br /> <br /> access ?asp 中用date()和now()取得pȝ日期旉Q其中DateDiff,DateAdd,DatePart也同是能用于Access和asp中,q些函数的用法也cM <br /> <br /> 举例Q?<br /> 1.GetDate() 用于sql server :select GetDate()<br /> <br /> 2.DateDiff('s','2005-07-20','2005-7-25 22:56:32')q回gؓ 514592 U?br /> DateDiff('d','2005-07-20','2005-7-25 22:56:32')q回gؓ 5 ?br /> <br /> 3.DatePart('w','2005-7-25 22:56:32')q回gؓ 2 x期一(周日?Q周六ؓ7)<br /> DatePart('d','2005-7-25 22:56:32')q回gؓ 25?5?br /> DatePart('y','2005-7-25 22:56:32')q回gؓ 206卌一q中W?06?<br /> DatePart('yyyy','2005-7-25 22:56:32')q回gؓ 2005?005q? <img src ="http://www.aygfsteel.com/titanaly/aggbug/303324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-11-23 13:13 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/10/27/299896.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/299896.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/10/27/299896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/299896.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/299896.html</trackback:ping><description><![CDATA[MySQL 字符串函数大?<br /> 对于针对字符串位|的操作Q第一个位|被标记??<br /> ASCII(str) <br /> q回字符串str的最左面字符的ASCII代码倹{如果str是空字符Ԍq回0。如果str是NULLQ返回NULL?<br /> mysql> select ASCII('2'); <br /> -> 50 <br /> mysql> select ASCII(2); <br /> -> 50 <br /> mysql> select ASCII('dx'); <br /> -> 100 <br /> 也可参见ORD()函数?<br /> ORD(str) <br /> 如果字符串str最左面字符是一个多字节字符Q通过以格?(first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]q回字符的ASCII代码值来q回多字节字W代码。如果最左面的字W不是一个多字节字符。返回与ASCII()函数q回的相同倹{?<br /> mysql> select ORD('2'); <br /> -> 50 <br /> CONV(N,from_base,to_base) <br /> 在不同的数字Z间变换数字。返回数字N的字W串数字Q从from_base基变换ؓto_base基,如果M参数是NULLQ返回NULL。参数N解释Z个整敎ͼ但是可以指定Z个整数或一个字W串。最基?且最大的基是36。如果to_base是一个负敎ͼN被认为是一个有W号敎ͼ否则QN被当作无W号数?CONV?4位点_ֺ工作?<br /> mysql> select CONV("a",16,2); <br /> -> '1010' <br /> mysql> select CONV("6E",18,8); <br /> -> '172' <br /> mysql> select CONV(-17,10,-18); <br /> -> '-H' <br /> mysql> select CONV(10+"10"+'10'+0xa,10,10); <br /> -> '40' <br /> BIN(N) <br /> q回二进制值N的一个字W串表示Q在此N是一个长整数(BIGINT)数字Q这{h于CONV(N,10,2)。如果N是NULLQ返回NULL?<br /> mysql> select BIN(12); <br /> -> '1100' <br /> OCT(N) <br /> q回八进制值N的一个字W串的表C,在此N是一个长整型数字Q这{h于CONV(N,10,8)。如果N是NULLQ返回NULL?<br /> mysql> select OCT(12); <br /> -> '14' <br /> HEX(N) <br /> q回十六q制值N一个字W串的表C,在此N是一个长整型(BIGINT)数字Q这{h于CONV(N,10,16)。如果N是NULLQ返回NULL?<br /> mysql> select HEX(255); <br /> -> 'FF' <br /> CHAR(N,...) <br /> CHAR()参数解释ؓ整数q且q回p些整数的ASCII代码字符l成的一个字W串。NULLD跌?<br /> mysql> select CHAR(77,121,83,81,'76'); <br /> -> 'MySQL' <br /> mysql> select CHAR(77,77.3,'77.3'); <br /> -> 'MMM' <br /> CONCAT(str1,str2,...) <br /> q回来自于参数连l的字符丌Ӏ如果Q何参数是NULLQ返回NULL。可以有过2个的参数。一个数字参数被变换为等L字符串Ş式?<br /> mysql> select CONCAT('My', 'S', 'QL'); <br /> -> 'MySQL' <br /> mysql> select CONCAT('My', NULL, 'QL'); <br /> -> NULL <br /> mysql> select CONCAT(14.3); <br /> -> '14.3' <br /> LENGTH(str) <br />   <br /> OCTET_LENGTH(str) <br />   <br /> CHAR_LENGTH(str) <br />   <br /> CHARACTER_LENGTH(str) <br /> q回字符串str的长度?<br /> mysql> select LENGTH('text'); <br /> -> 4 <br /> mysql> select OCTET_LENGTH('text'); <br /> -> 4 <br /> 注意Q对于多字节字符Q其CHAR_LENGTH()仅计一ơ?<br /> LOCATE(substr,str) <br />   <br /> POSITION(substr IN str) <br /> q回子串substr在字W串strW一个出现的位置Q如果substr不是在str里面Q返?. <br /> mysql> select LOCATE('bar', 'foobarbar'); <br /> -> 4 <br /> mysql> select LOCATE('xbar', 'foobar'); <br /> -> 0 <br /> 该函数是多字节可靠的?<br /> LOCATE(substr,str,pos) <br /> q回子串substr在字W串strW一个出现的位置Q从位置pos开始。如果substr不是在str里面Q返??<br /> mysql> select LOCATE('bar', 'foobarbar',5); <br /> -> 7 <br /> q函数是多字节可靠的?<br /> INSTR(str,substr) <br /> q回子串substr在字W串str中的W一个出现的位置。这与有2个参数Ş式的LOCATE()相同Q除了参数被颠倒?<br /> mysql> select INSTR('foobarbar', 'bar'); <br /> -> 4 <br /> mysql> select INSTR('xbar', 'foobar'); <br /> -> 0 <br /> q函数是多字节可靠的?<br /> LPAD(str,len,padstr) <br /> q回字符串strQ左面用字符串padstr填补直到str是len个字W长?<br /> mysql> select LPAD('hi',4,'??'); <br /> -> '??hi' <br /> RPAD(str,len,padstr) <br /> q回字符串strQ右面用字符串padstr填补直到str是len个字W长?<br /> mysql> select RPAD('hi',5,'?'); <br /> -> 'hi???' <br /> LEFT(str,len) <br /> q回字符串str的最左面len个字W?<br /> mysql> select LEFT('foobarbar', 5); <br /> -> 'fooba' <br /> 该函数是多字节可靠的?<br /> RIGHT(str,len) <br /> q回字符串str的最右面len个字W?<br /> mysql> select RIGHT('foobarbar', 4); <br /> -> 'rbar' <br /> 该函数是多字节可靠的?<br /> SUBSTRING(str,pos,len) <br />   <br /> SUBSTRING(str FROM pos FOR len) <br />   <br /> MID(str,pos,len) <br /> 从字W串strq回一个len个字W的子串Q从位置pos开始。用FROM的变UŞ式是ANSI SQL92语法?<br /> mysql> select SUBSTRING('Quadratically',5,6); <br /> -> 'ratica' <br /> 该函数是多字节可靠的?<br /> SUBSTRING(str,pos) <br />   <br /> SUBSTRING(str FROM pos) <br /> 从字W串str的v始位|posq回一个子丌Ӏ?<br /> mysql> select SUBSTRING('Quadratically',5); <br /> -> 'ratically' <br /> mysql> select SUBSTRING('foobarbar' FROM 4); <br /> -> 'barbar' <br /> 该函数是多字节可靠的?<br /> SUBSTRING_INDEX(str,delim,count) <br /> q回从字W串str的第count个出现的分隔Wdelim之后的子丌Ӏ如果count是正敎ͼq回最后的分隔W到左边(从左Ҏ) 的所有字W。如果count是负敎ͼq回最后的分隔W到双的所有字W?从右Ҏ)?<br /> mysql> select SUBSTRING_INDEX('www.mysql.com', '.', 2); <br /> -> 'www.mysql' <br /> mysql> select SUBSTRING_INDEX('www.mysql.com', '.', -2); <br /> -> 'mysql.com' <br /> 该函数对多字节是可靠的?<br /> LTRIM(str) <br /> q回删除了其前置I格字符的字W串str?<br /> mysql> select LTRIM(' barbar'); <br /> -> 'barbar' <br /> RTRIM(str) <br /> q回删除了其拖后I格字符的字W串str?<br /> mysql> select RTRIM('barbar '); <br /> -> 'barbar' <br /> 该函数对多字节是可靠的?<br /> TRIM([[BOTH | LEA <br /> DING | TRAILING] [remstr] FROM] str) <br /> q回字符串strQ其所有remstr前缀或后~被删除了。如果没有修饰符BOTH、LEADING或TRAILINGl出QBOTH被假定。如果remstr没被指定Q空D删除?<br /> mysql> select TRIM(' bar '); <br /> -> 'bar' <br /> mysql> select TRIM(LEADING 'x' FROM 'xxxbarxxx'); <br /> -> 'barxxx' <br /> mysql> select TRIM(BOTH 'x' FROM 'xxxbarxxx'); <br /> -> 'bar' <br /> mysql> select TRIM(TRAILING 'xyz' FROM 'barxxyz'); <br /> -> 'barx' <br /> 该函数对多字节是可靠的?<br /> SOUNDEX(str) <br /> q回str的一个同韛_W串。听h“大致相同”?个字W串应该有相同的同音字符丌Ӏ一?#8220;标准”的同韛_W串长是4个字W,但是SOUNDEX()函数q回一个Q意长的字W串。你可以在结果上使用SUBSTRING()得到一?#8220;标准”的同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字W国际字母被当作元音?<br /> mysql> select SOUNDEX('Hello'); <br /> -> 'H400' <br /> mysql> select SOUNDEX('Quadratically'); <br /> -> 'Q36324' <br /> SPACE(N) <br /> q回由N个空格字W组成的一个字W串?<br /> mysql> select SPACE(6); <br /> -> ' ' <br /> REPLACE(str,from_str,to_str) <br /> q回字符串strQ其字符串from_str的所有出现由字符串to_str代替?<br /> mysql> select REPLACE('www.mysql.com', 'w', 'Ww'); <br /> -> 'WwWwWw.mysql.com' <br /> 该函数对多字节是可靠的?<br /> REPEAT(str,count) <br /> q回由重复countTimesơ的字符串strl成的一个字W串。如果count <= 0Q返回一个空字符丌Ӏ如果str或count是NULLQ返回NULL?<br /> mysql> select REPEAT('MySQL', 3); <br /> -> 'MySQLMySQLMySQL' <br /> REVERSE(str) <br /> q回颠倒字W顺序的字符串str?<br /> mysql> select REVERSE('abc'); <br /> -> 'cba' <br /> 该函数对多字节可靠的?<br /> INSERT(str,pos,len,newstr) <br /> q回字符串strQ在位置pos起始的子串且len个字W长得子串由字符串newstr代替?<br /> mysql> select INSERT('Quadratic', 3, 4, 'What'); <br /> -> 'QuWhattic' <br /> 该函数对多字节是可靠的?<br /> ELT(N,str1,str2,str3,...) <br /> 如果N= 1Q返回str1Q如果N= 2Q返回str2Q等{。如果N于1或大于参C敎ͼq回NULL。ELT()是FIELD()反运?<br /> mysql> select ELT(1, 'ej', 'Heja', 'hej', 'foo'); <br /> -> 'ej' <br /> mysql> select ELT(4, 'ej', 'Heja', 'hej', 'foo'); <br /> -> 'foo' <br /> FIELD(str,str1,str2,str3,...) <br /> q回str在str1, str2, str3, ...清单的烦引。如果str没找刎ͼq回0。FIELD()是ELT()反运?<br /> mysql> select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo'); <br /> -> 2 <br /> mysql> select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo'); <br /> -> 0 <br /> FIND_IN_SET(str,strlist) <br /> 如果字符串str在由N子串l成的表strlist之中Q返回一?到N的倹{一个字W串表是?#8220;,”分隔的子串组成的一个字W串。如果第一个参数是一个常数字W串q且W二个参数是一U类型ؓSET的列QFIND_IN_SET()函数被优化而用位q算Q如果str不是在strlist里面或如?strlist是空字符Ԍq回0。如果Q何一个参数是NULLQ返回NULL。如果第一个参数包含一?#8220;,”Q该函数工作不正常?<br /> mysql> SELECT FIND_IN_SET('b','a,b,c,d'); <br /> -> 2 <br /> MAKE_SET(bits,str1,str2,...) <br /> q回一个集?(包含?#8220;,”字符分隔的子串组成的一个字W串)Q由相应的位在bits集合中的的字W串l成。str1对应于位0Qstr2对应?Q等{。在str1, str2, ...中的NULL串不d到结果中?<br /> mysql> SELECT MAKE_SET(1,'a','b','c'); <br /> -> 'a' <br /> mysql> SELECT MAKE_SET(1 | 4,'hello','nice','world'); <br /> -> 'hello,world' <br /> mysql> SELECT MAKE_SET(0,'a','b','c'); <br /> -> '' <br /> EXPORT_SET(bits,on,off,[separator,[number_of_bits]]) <br /> q回一个字W串Q在q里对于?#8220;bits”中设定每一位,你得C?#8220;on”字符Ԍq且对于每个复位(reset)的位Q你得到一?#8220;off”字符丌Ӏ每个字W串?#8220;separator”分隔(~省“,”)Qƈ且只?#8220;bits”?#8220;number_of_bits” (~省64)位被使用?<br /> mysql> select EXPORT_SET(5,'Y','N',',',4) <br /> -> Y,N,Y,N <br /> LCASE(str) <br />   <br /> LOWER(str) <br /> q回字符串strQ根据当前字W集映射(~省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的?<br /> mysql> select LCASE('QUADRATICALLY'); <br /> -> 'quadratically' <br /> UCASE(str) <br />   <br /> UPPER(str) <br /> q回字符串strQ根据当前字W集映射(~省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的?<br /> mysql> select UCASE('Hej'); <br /> -> 'HEJ' <br /> 该函数对多字节是可靠的?<br /> LOAD_FILE(file_name) <br /> d文gq且作ؓ一个字W串q回文g内容。文件必d服务器上Q你必须指定到文件的完整路径名,而且你必Lfile权限。文件必L有内定w是可ȝq且于max_allowed_packet。如果文件不存在或由于上面原因之一不能被读出,函数q回NULL?<br /> mysql> UPDATE table_name <br /> SET blob_column=LOAD_FILE("/tmp/picture") <br /> WHERE id=1; <br /> MySQL必要时自动变换数字ؓ字符Ԍq且反过来也如此Q?<br /> mysql> SELECT 1+"1"; <br /> -> 2 <br /> mysql> SELECT CONCAT(2,' test'); <br /> -> '2 test' <br /> 如果你想要明地变换一个数字到一个字W串Q把它作为参C递到CONCAT()?<br /> 如果字符串函数提供一个二q制字符串作为参敎ͼl果字符串也是一个二q制字符丌Ӏ被变换C个字W串的数字被当作是一个二q制字符丌Ӏ这仅媄响比?. <br /> 本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/19437.htm <img src ="http://www.aygfsteel.com/titanaly/aggbug/299896.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-10-27 11:13 <a href="http://www.aygfsteel.com/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.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/10/22/299359.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/299359.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/10/22/299359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/299359.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/299359.html</trackback:ping><description><![CDATA[<h2 class="diaryTitle">excel数据导入oracle?/h2> <p> <p><a >http://www.douzhe.com/docs/bbsjh/8/3383.html</a> q个帖子的讨论,整理如下Q?/p> <p>A、有一个比较麻烦但保证成功的方法?br /> 1、在本地创徏一个Access数据库,Excel数据先导入到Access。可直接导入点击鼠标右键Q选择导入Q文件类型选择要导入的Excel文gQ也可通过创徏宏用TransferSpreadsheet函数实现?br /> 2、在本地创徏ODBCQ链接oracle数据库。将oracle中需要导入数据的表以链接表的方式在本地Access中创建(千万不要使用导入表)?br /> 3、在Access数据库中创徏插入查询导入好的Excel数据导入到oracle中?</p> <p>此方法保证成功?/p> <p>B、也可以导入sql server 用它的导出工具导入oracle 但对一些image字段支持不好Q你如果<br /> 没这U字D就行?/p> <p>用MS_sqlserver 提供的数据导出导入功能可以方便的把excel方便的导入oracle数据?/p> <p>C、一U方法:<br /> 先把Excel另存?csv格式文gQ如test.csvQ再~写一个insert.ctl<br /> 用sqlldrq行导入!<br /> insert.ctl内容如下Q?br /> load data                    --1、控制文件标?br /> infile 'test.csv'                --2、要输入的数据文件名为test.csv<br /> append into table table_name       --3、向表table_name中追加记?br /> fields terminated by ','             --4、字D늻止于','Q是一个逗号<br /> (field1,<br /> field2,<br /> field3,<br /> ...<br /> fieldn)-----定义列对应顺?</p> <p>注意括号中field排列序要与csv文g中相对应<br /> 然后可以执行如下命令:<br /> sqlldr user/password control=insert.ctl</p> <p>有关SQLLDR的问?</p> <p><font face="verdana, arial, helvetica" size="2">控制文gQinput.ctlQ内容如下:<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、字D늻止于X'09'Q是一个制表符QTABQ?br />   (id,username,password,sj)   -----定义列对应顺?br /> <br /> 其中append为数据装载方式,q有其他选项Q?br /> a、insertQؓ~省方式Q在数据装蝲开始时要求表ؓI?br /> b、appendQ在表中q加新记?br /> c、replaceQ删除旧记录Q替换成新装载的记录<br /> d、truncateQ同?br /> <br /> 问题QSQLLDR能不能保留表中原有的数据Q如果发现KEY重复Ӟ再UPDATE对应的记录?</font></p> <p>D、先?EXCEL文g??成TXT文g<br /> 再用SQLLOADER</p> <p>E、将EXCEL文g保存?.csv格式. 然后用sqlload来导入表?</p> <p>sqlload是Oracle自带的数据倒入工具Q应该是没有可视化工LQ至我一直用命o行)?br /> 直接在命令行下敲入sqlldr卛_得到帮助?/p> <p>F、如果你的单个文件不大的情况?于100000?, 可以全选COPY ,然后用PL/SQL.:<br /> select * from table for update. 然后打开? 再按一下加? 鼠标点到W一个空格然后粘? COMMIT卛_.(窍? ORACLE不支持的, 但很好用, 不会有问?</p> <p>G、Golden的imp/exp工具可以直接导入文本文gQ非常简?/p> <p>下面q个不知道是针对以上哪种Ҏ的:<br />       攑ֿQexcel文g最多只?5536条记?br />       不放心:曄如此DQ但当有中文字段时可能出现异常(PL/SQL DEV5Q?/p> <p>我用的是AQOKQ时间仓促,其他的没有试q?/p> <p><a >http://www.itpub.net/101803.html</a> q个帖子如是_</p> <p>你用的方法可能是:<br /> 1. 存成txt文g, 再用sql*loader<br /> 2. 存成txt文g, 再用W三方工?如pb, delphi, toad, pl/sql dev{?导入.<br /> <br /> sql*loader用v来费? Z小的需? 装一个第三方工具ȝ.<br /> 看看我的Ҏ.<br /> <br /> 比如文g中有id, name两列(分别为A列和B?, 要导入的表ؓperson(person_id, person_name)<br /> <br /> 在excel 文g的sheet的最叛_, d一? 对应W一行数据的单元格写入以下内?<br /> <br /> = "INSERT INTO PERSON(PERSON_ID, PERSON_NAME) VALUES('" & A1 & "', '" & B1 & "');"<br /> <br /> 然后把这一行复制到所有数据行对应的列?<br /> <br /> q一列的内容拯出去保存, x为可以直接在sql*plus下运行的脚本.</p> <p>Ҏ一?日期?位不适用</p> <p>A?font face="Courier New">把Excel文g导到Acess里,然后打开要导数据的表?br /> <br /> 打开 PLSQL DEVQ打开一个SQLH口Q执?br /> select * from [tab] for update<br /> <br /> 然后一列一列的从Acess里copy & paste ?/font></p> <p>B、excel->copy->pl/sql developer>paste</p> <p>实际操作时发玎ͼ使用 copy / paste l常会发生莫其妙的问题。尤其是通过 access ( ODBC) copy ?oracle 时?/p> <p>EXECL -->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 映射Q然后直接插入即可。很方便Q也没发现有数据错误问题?br /> 曄有一个很ȝ的LONG RAW问题Q用q个办法也解决了</p> <p>D?font face="verdana, arial, helvetica" size="2">用SQL*XL可以直接将EXCEL文g导入ORACLEQ很方便的,我一直用SQL*XL?/font></p> <p><font size="2">E?strong>我常用的办法是从excel中copy到ultraEdit中,然后用列~辑功能加上insert into ....{等Q也挺好?/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的数据管道可以在不同的数据库Q文本)之间传输数据</font></p> <p><font size="2">H、odbc+pb </font></p> <p><font face="verdana, arial, helvetica" size="2">用不同的odbc驱动E序q接不通的数据?br /> 然后在pb环境中启动数据管道,利用数据道传输数据</font></p> <p><font size="2">I、先倒成。DBF的文Ӟ再用DELPHI DATABASE DESKTOP 导入ORACLE很方便的Q也且也可以支持I值导入?/font></p> <p><font size="2"><a >http://www.itpub.net/showthread.php?s=7f7b57ea130ab71a3fdad57a71d8f8a1&threadid=97652&perpage=15&pagenumber=2</a></font></p> <p><font size="2">帖子很长Q有I再整理?/font></p> <img src ="http://www.aygfsteel.com/titanaly/aggbug/299359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-10-22 14:25 <a href="http://www.aygfsteel.com/titanaly/archive/2009/10/22/299359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>触发器和存储q程的优~点汇??http://www.aygfsteel.com/titanaly/archive/2009/09/15/295109.html不高?/dc:creator>不高?/author>Tue, 15 Sep 2009 02:52:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/09/15/295109.htmlhttp://www.aygfsteel.com/titanaly/comments/295109.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/09/15/295109.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/295109.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/295109.html             1、可UL性是存储q程和触发器最大的~点?br />             2、占用服务器端太多的资源Q对服务器造成很大的压?br />             3、不能做DDL?br />             4、触发器排错困难Q而且数据Ҏ造成不一_后期l护不方ѝ?br />

优点Q?br />             1、预~译Q已优化Q效率较高。避免了SQL语句在网l传输然后再解释的低效率?br />             2、存储过E可以重复用,减少开发h员的工作量?br />             3、业务逻辑装性好Q修Ҏѝ?br />             4、安全。不会有SQL语句注入问题存在?

]]>
MySQLQMySQL日期数据cd、MySQL旉cd使用ȝhttp://www.aygfsteel.com/titanaly/archive/2009/08/17/291454.html不高?/dc:creator>不高?/author>Mon, 17 Aug 2009 03:56:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/08/17/291454.htmlhttp://www.aygfsteel.com/titanaly/comments/291454.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/08/17/291454.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/291454.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/291454.html 日期cd        存储I间      日期格式                日期范围
------------  ---------  --------------------- -----------------------------------------
datetime      8 bytes  YYYY-MM-DD HH:MM:SS  1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp      4 bytes  YYYY-MM-DD HH:MM:SS  1970-01-01 00:00:01 ~ 2038
date          3 bytes  YYYY-MM-DD            1000-01-01          ~ 9999-12-31
year          1 bytes  YYYY                  1901                ~ 2155

?MySQL 中创Ӟ对照上面的表|很容易就能选择到合适自q数据cd。不q到底是选择 datetime q是 timestampQ可能会有点犯难。这两个日期旉cd各有优点Qdatetime 的日期范围比较大Qtimestamp 所占存储空间比较小Q只?datetime 的一半?

另外Qtimestamp cd的列q有个特性:默认情况下,?insert, update 数据Ӟtimestamp 列会自动以当前时_CURRENT_TIMESTAMPQ填?更新?#8220;自动”的意思就是,你不ȝ它,MySQL 会替你去处理?

一般情况下Q我們֐于?datetime 日期cd?

MySQL 旉cdQ时间格式、所占存储空间、时间范围?
旉cd        存储I间      旉格式                旉范围
------------  ---------  --------------------- -----------------------------------------
time          3 bytes  HH:MM:SS              -838:59:59          ~ 838:59:59

time 旉范围居然有这么大的范_特别?time 可以取负|有点奇怪。后来,看了 MySQL 手册才知道这是ؓ了满两个日期时间相减才q样设计的?

select timediff('2000:01:31 23:59:59', '2000:01:01 00:00:00');  --  743:59:59
select timediff('2000:01:01 00:00:00', '2000:01:31 23:59:59');  -- -743:59:59
select timediff('23:59:59', '12:00:00');                        --  11:59:59

注意Qtimediff 的两个参数只能是 datetime/timestamp, time cd的,q且q两个参数类型要相同。即Qdatetime/timestamp ?datetime/timestamp 比较Qtime ?time 相比较?

虽然 MySQL 中的日期旉cd比较丰富Q但遗憾的是Q目前(2008-08-08Q这些日期时间类型只能支持到U别,不支持毫U、微U。也没有产生毫秒的函数?

《MySQLQMySQL日期数据cd、MySQL旉cd使用ȝ》适用?MySQL 5.X 及以上版本?

一、MySQL 获得当前日期旉 函数
1.1 获得当前日期+旉Qdate + timeQ函敎ͼnow()

mysql> select now();

+---------------------+
| now()              |
+---------------------+
| 2008-08-08 22:20:46 |
+---------------------+

除了 now() 函数能获得当前的日期旉外,MySQL 中还有下面的函数Q?

current_timestamp()
,current_timestamp
,localtime()
,localtime
,localtimestamp    -- (v4.0.6)
,localtimestamp()  -- (v4.0.6)

q些日期旉函数Q都{同?now()。鉴?now() 函数短易讎ͼL使用 now() 来替代上面列出的函数?

1.2 获得当前日期+旉Qdate + timeQ函敎ͼsysdate()

sysdate() 日期旉函数?now() cMQ不同之处在于:now() 在执行开始时值就得到了, sysdate() 在函数执行时动态得到倹{看下面的例子就明白了:

mysql> select now(), sleep(3), now();

+---------------------+----------+---------------------+
| now()              | sleep(3) | now()              |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:21 |        0 | 2008-08-08 22:28:21 |
+---------------------+----------+---------------------+

mysql> select sysdate(), sleep(3), sysdate();

+---------------------+----------+---------------------+
| sysdate()          | sleep(3) | sysdate()          |
+---------------------+----------+---------------------+
| 2008-08-08 22:28:41 |        0 | 2008-08-08 22:28:44 |
+---------------------+----------+---------------------+

可以看到Q虽然中?sleep 3 U,?now() 函数两次的时间值是相同的; sysdate() 函数两次得到的时间值相?3 U。MySQL Manual 中是q样描述 sysdate() 的:Return the time at which the function executes?

sysdate() 日期旉函数Q一般情况下很少用到?

2. 获得当前日期QdateQ函敎ͼcurdate()

mysql> select curdate();

+------------+
| curdate()  |
+------------+
| 2008-08-08 |
+------------+

其中Q下面的两个日期函数{同?curdate()Q?

current_date()
,current_date

3. 获得当前旉QtimeQ函敎ͼcurtime()

mysql> select curtime();

+-----------+
| curtime() |
+-----------+
| 22:41:30  |
+-----------+

其中Q下面的两个旉函数{同?curtime()Q?

current_time()
,current_time

4. 获得当前 UTC 日期旉函数Qutc_date(), utc_time(), utc_timestamp()

mysql> select utc_timestamp(), utc_date(), utc_time(), now()

+---------------------+------------+------------+---------------------+
| utc_timestamp()    | utc_date() | utc_time() | now()              |
+---------------------+------------+------------+---------------------+
| 2008-08-08 14:47:11 | 2008-08-08 | 14:47:11  | 2008-08-08 22:47:11 |
+---------------------+------------+------------+---------------------+

因ؓ我国位于东八时区Q所以本地时?= UTC 旉 + 8 时。UTC 旉在业务涉及多个国家和地区的时候,非常有用?

二、MySQL 日期旉 ExtractQ选取Q?函数?
1. 选取日期旉的各个部分:日期、时间、年、季度、月、日、小时、分钟、秒、微U?

set @dt = '2008-09-10 07:15:30.123456';

select date(@dt);        -- 2008-09-10
select time(@dt);        -- 07:15:30.123456
select year(@dt);        -- 2008
select quarter(@dt);    -- 3
select month(@dt);      -- 9
select week(@dt);        -- 36
select day(@dt);        -- 10
select hour(@dt);        -- 7
select minute(@dt);      -- 15
select second(@dt);      -- 30
select microsecond(@dt); -- 123456

2. MySQL Extract() 函数Q可以上面实现类似的功能Q?

set @dt = '2008-09-10 07:15:30.123456';

select extract(year                from @dt); -- 2008
select extract(quarter            from @dt); -- 3
select extract(month              from @dt); -- 9
select extract(week                from @dt); -- 36
select extract(day                from @dt); -- 10
select extract(hour                from @dt); -- 7
select extract(minute              from @dt); -- 15
select extract(second              from @dt); -- 30
select extract(microsecond        from @dt); -- 123456

select extract(year_month          from @dt); -- 200809
select extract(day_hour            from @dt); -- 1007
select extract(day_minute          from @dt); -- 100715
select extract(day_second          from @dt); -- 10071530
select extract(day_microsecond    from @dt); -- 10071530123456
select extract(hour_minute        from @dt); --    715
select extract(hour_second        from @dt); --    71530
select extract(hour_microsecond    from @dt); --    71530123456
select extract(minute_second      from @dt); --      1530
select extract(minute_microsecond  from @dt); --      1530123456
select extract(second_microsecond  from @dt); --        30123456

MySQL Extract() 函数除了没有date(),time() 的功能外Q其他功能一应具全。ƈ且还h选取‘day_microsecond’ {功能。注意这里不是只选取 day ?microsecondQ而是从日期的 day 部分一直选取?microsecond 部分。够强悍的吧Q?

MySQL Extract() 函数唯一不好的地方在于:你需要多敲几ơ键盘?

3. MySQL dayof... 函数Qdayofweek(), dayofmonth(), dayofyear()

分别q回日期参数Q在一周、一月、一q中的位|?

set @dt = '2008-08-08';

select dayofweek(@dt);  -- 6
select dayofmonth(@dt);  -- 8
select dayofyear(@dt);  -- 221

日期 '2008-08-08' 是一周中的第 6 天(1 = Sunday, 2 = Monday, ..., 7 = SaturdayQ;一月中的第 8 天;一q中的第 221 天?

4. MySQL week... 函数Qweek(), weekofyear(), dayofweek(), weekday(), yearweek()

set @dt = '2008-08-08';

select week(@dt);        -- 31
select week(@dt,3);      -- 32
select weekofyear(@dt);  -- 32

select dayofweek(@dt);  -- 6
select weekday(@dt);    -- 4

select yearweek(@dt);    -- 200831

MySQL week() 函数Q可以有两个参数Q具体可看手册?weekofyear() ?week() 一P都是计算“某天”是位于一q中的第几周?weekofyear(@dt) {h?week(@dt,3)?

MySQL weekday() 函数?dayofweek() cMQ都是返?#8220;某天”在一周中的位|。不同点在于参考的标准Q?weekdayQ?0 = Monday, 1 = Tuesday, ..., 6 = Sunday)Q?dayofweekQ(1 = Sunday, 2 = Monday, ..., 7 = SaturdayQ?

MySQL yearweek() 函数Q返?year(2008) + week 位置(31)?

5. MySQL q回星期和月份名U函敎ͼdayname(), monthname()

set @dt = '2008-08-08';

select dayname(@dt);    -- Friday
select monthname(@dt);  -- August

思考,如何q回中文的名U呢Q?

6. MySQL last_day() 函数Q返回月份中的最后一天?

select last_day('2008-02-01');  -- 2008-02-29
select last_day('2008-08-08');  -- 2008-08-31

MySQL last_day() 函数非常有用Q比如我惛_到当前月份中有多天Q可以这h计算Q?

mysql> select now(), day(last_day(now())) as days;

+---------------------+------+
| now()              | days |
+---------------------+------+
| 2008-08-09 11:45:45 |  31 |
+---------------------+------+

三、MySQL 日期旉计算函数
1. MySQL 为日期增加一个时间间隔:date_add()

set @dt = now();

select date_add(@dt, interval 1 day);        -- add 1 day
select date_add(@dt, interval 1 hour);      -- add 1 hour
select date_add(@dt, interval 1 minute);    -- ...
select date_add(@dt, interval 1 second);
select date_add(@dt, interval 1 microsecond);
select date_add(@dt, interval 1 week);
select date_add(@dt, interval 1 month);
select date_add(@dt, interval 1 quarter);
select date_add(@dt, interval 1 year);

select date_add(@dt, interval -1 day);      -- sub 1 day

MySQL adddate(), addtime()函数Q可以用 date_add() 来替代。下面是 date_add() 实现 addtime() 功能CZQ?

mysql> set @dt = '2008-08-09 12:12:33';

mysql>
mysql> select date_add(@dt, interval '01:15:30' hour_second);

+------------------------------------------------+
| date_add(@dt, interval '01:15:30' hour_second) |
+------------------------------------------------+
| 2008-08-09 13:28:03                            |
+------------------------------------------------+

mysql> select date_add(@dt, interval '1 01:15:30' day_second);

+-------------------------------------------------+
| date_add(@dt, interval '1 01:15:30' day_second) |
+-------------------------------------------------+
| 2008-08-10 13:28:03                            |
+-------------------------------------------------+

date_add() 函数Q分别ؓ @dt 增加?#8220;1时 15?30U?#8221; ?“1?1时 15?30U?#8221;。徏议:L使用 date_add() 日期旉函数来替?adddate(), addtime()?

2. MySQL 为日期减M个时间间隔:date_sub()

mysql> select date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second);

+----------------------------------------------------------------+
| date_sub('1998-01-01 00:00:00', interval '1 1:1:1' day_second) |
+----------------------------------------------------------------+
| 1997-12-30 22:58:59                                            |
+----------------------------------------------------------------+

MySQL date_sub() 日期旉函数 ?date_add() 用法一_不再赘述。另外,MySQL 中还有两个函?subdate(), subtime()Q徏议,?date_sub() 来替代?

3. MySQL 另类日期函数Qperiod_add(P,N), period_diff(P1,P2)

函数参数“P” 的格式ؓ“YYYYMM” 或?“YYMM”Q第二个参数“N” 表示增加或减?N monthQ月Q?

MySQL period_add(P,N)Q日期加/减去N月?

mysql> select period_add(200808,2), period_add(20080808,-2)

+----------------------+-------------------------+
| period_add(200808,2) | period_add(20080808,-2) |
+----------------------+-------------------------+
|              200810 |                20080806 |
+----------------------+-------------------------+

MySQL period_diff(P1,P2)Q日?P1-P2Q返?N 个月?

mysql> select period_diff(200808, 200801);

+-----------------------------+
| period_diff(200808, 200801) |
+-----------------------------+
|                          7 |
+-----------------------------+

?MySQL 中,q两个日期函敎ͼ一般情况下很少用到?

4. MySQL 日期、时间相减函敎ͼdatediff(date1,date2), timediff(time1,time2)

MySQL datediff(date1,date2)Q两个日期相?date1 - date2Q返回天数?

select datediff('2008-08-08', '2008-08-01');  -- 7
select datediff('2008-08-01', '2008-08-08');  -- -7

MySQL timediff(time1,time2)Q两个日期相?time1 - time2Q返?time 差倹{?

select timediff('2008-08-08 08:08:08', '2008-08-08 00:00:00'); -- 08:08:08
select timediff('08:08:08', '00:00:00');                      -- 08:08:08

注意Qtimediff(time1,time2) 函数的两个参数类型必ȝ同?

四、MySQL 日期转换函数、时间{换函?
1. MySQL Q时间、秒Q{换函敎ͼtime_to_sec(time), sec_to_time(seconds)

select time_to_sec('01:00:05');  -- 3605
select sec_to_time(3605);        -- '01:00:05'

2. MySQL Q日期、天敎ͼ转换函数Qto_days(date), from_days(days)

select to_days('0000-00-00');  -- 0
select to_days('2008-08-08');  -- 733627

select from_days(0);          -- '0000-00-00'
select from_days(733627);      -- '2008-08-08'

3. MySQL Str to Date Q字W串转换为日期)函数Qstr_to_date(str, format)

select str_to_date('08/09/2008', '%m/%d/%Y');                  -- 2008-08-09
select str_to_date('08/09/08'  , '%m/%d/%y');                  -- 2008-08-09
select str_to_date('08.09.2008', '%m.%d.%Y');                  -- 2008-08-09
select str_to_date('08:09:30', '%h:%i:%s');                    -- 08:09:30
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); -- 2008-08-09 08:09:30

可以看到Qstr_to_date(str,format) 转换函数Q可以把一些杂乱无章的字符串{换ؓ日期格式。另外,它也可以转换为时间?#8220;format” 可以参看 MySQL 手册?

4. MySQL Date/Time to StrQ日?旉转换为字W串Q函敎ͼdate_format(date,format), time_format(time,format)

mysql> select date_format('2008-08-08 22:23:00', '%W %M %Y');

+------------------------------------------------+
| date_format('2008-08-08 22:23:00', '%W %M %Y') |
+------------------------------------------------+
| Friday August 2008                            |
+------------------------------------------------+

mysql> select date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s');

+----------------------------------------------------+
| date_format('2008-08-08 22:23:01', '%Y%m%d%H%i%s') |
+----------------------------------------------------+
| 20080808222301                                    |
+----------------------------------------------------+

mysql> select time_format('22:23:01', '%H.%i.%s');

+-------------------------------------+
| time_format('22:23:01', '%H.%i.%s') |
+-------------------------------------+
| 22.23.01                            |
+-------------------------------------+

MySQL 日期、时间{换函敎ͼdate_format(date,format), time_format(time,format) 能够把一个日?旉转换成各U各L字符串格式。它?str_to_date(str,format) 函数?一个逆{换?

5. MySQL 获得国家地区旉格式函数Qget_format()

MySQL get_format() 语法Q?

get_format(date|time|datetime, 'eur'|'usa'|'jis'|'iso'|'internal'

MySQL get_format() 用法的全部示例:

select get_format(date,'usa')          ;  -- '%m.%d.%Y'
select get_format(date,'jis')          ;  -- '%Y-%m-%d'
select get_format(date,'iso')          ;  -- '%Y-%m-%d'
select get_format(date,'eur')          ;  -- '%d.%m.%Y'
select get_format(date,'internal')    ;  -- '%Y%m%d'
select get_format(datetime,'usa')      ;  -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'jis')      ;  -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'iso')      ;  -- '%Y-%m-%d %H:%i:%s'
select get_format(datetime,'eur')      ;  -- '%Y-%m-%d %H.%i.%s'
select get_format(datetime,'internal') ;  -- '%Y%m%d%H%i%s'
select get_format(time,'usa')          ;  -- '%h:%i:%s %p'
select get_format(time,'jis')          ;  -- '%H:%i:%s'
select get_format(time,'iso')          ;  -- '%H:%i:%s'
select get_format(time,'eur')          ;  -- '%H.%i.%s'
select get_format(time,'internal')    ;  -- '%H%i%s'

MySQL get_format() 函数在实际中用到Z的比较少?

6. MySQL 拼凑日期、时间函敎ͼmakdedate(year,dayofyear), maketime(hour,minute,second)

select makedate(2001,31);  -- '2001-01-31'
select makedate(2001,32);  -- '2001-02-01'

select maketime(12,15,30);  -- '12:15:30'

五、MySQL 旉戻ITimestampQ函?
1. MySQL 获得当前旉戛_敎ͼcurrent_timestamp, current_timestamp()

mysql> select current_timestamp, current_timestamp();

+---------------------+---------------------+
| current_timestamp  | current_timestamp() |
+---------------------+---------------------+
| 2008-08-09 23:22:24 | 2008-08-09 23:22:24 |
+---------------------+---------------------+

2. MySQL QUnix 旉戟뀁日期)转换函数Q?

unix_timestamp(),
unix_timestamp(date),
from_unixtime(unix_timestamp),
from_unixtime(unix_timestamp,format)

下面是示例:

select unix_timestamp();                      -- 1218290027
select unix_timestamp('2008-08-08');          -- 1218124800
select unix_timestamp('2008-08-08 12:30:00');  -- 1218169800

select from_unixtime(1218290027);              -- '2008-08-09 21:53:47'
select from_unixtime(1218124800);              -- '2008-08-08 00:00:00'
select from_unixtime(1218169800);              -- '2008-08-08 12:30:00'

select from_unixtime(1218169800, '%Y %D %M %h:%i:%s %x'); -- '2008 8th August 12:30:00 2008'

3. MySQL 旉戻ItimestampQ{换、增、减函数Q?

timestamp(date)                                    -- date to timestamp
timestamp(dt,time)                                  -- dt + time
timestampadd(unit,interval,datetime_expr)          --
timestampdiff(unit,datetime_expr1,datetime_expr2)  --

LCZ部分Q?

select timestamp('2008-08-08');                        -- 2008-08-08 00:00:00
select timestamp('2008-08-08 08:00:00', '01:01:01');    -- 2008-08-08 09:01:01
select timestamp('2008-08-08 08:00:00', '10 01:01:01'); -- 2008-08-18 09:01:01

select timestampadd(day, 1, '2008-08-08 08:00:00');    -- 2008-08-09 08:00:00
select date_add('2008-08-08 08:00:00', interval 1 day); -- 2008-08-09 08:00:00

MySQL timestampadd() 函数cM?date_add()?

select timestampdiff(year,'2002-05-01','2001-01-01');                    -- -1
select timestampdiff(day ,'2002-05-01','2001-01-01');                    -- -485
select timestampdiff(hour,'2008-08-08 12:00:00','2008-08-08 00:00:00');  -- -12

select datediff('2008-08-08 12:00:00', '2008-08-01 00:00:00');          -- 7

MySQL timestampdiff() 函数比 datediff() 功能强多了,datediff() 只能计算两个日期QdateQ之间相差的天数?

六、MySQL 时区QtimezoneQ{换函?
convert_tz(dt,from_tz,to_tz)

select convert_tz('2008-08-08 12:00:00', '+08:00', '+00:00'); -- 2008-08-08 04:00:00

时区转换也可以通过 date_add, date_sub, timestampadd 来实现?

select date_add('2008-08-08 12:00:00', interval -8 hour);  -- 2008-08-08 04:00:00
select date_sub('2008-08-08 12:00:00', interval  8 hour);  -- 2008-08-08 04:00:00
select timestampadd(hour, -8, '2008-08-08 12:00:00');      -- 2008-08-08 04:00:00

]]>
ora-00054:resource busy and acquire with nowait specified解决Ҏhttp://www.aygfsteel.com/titanaly/archive/2009/07/22/287825.html不高?/dc:creator>不高?/author>Wed, 22 Jul 2009 03:39:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/07/22/287825.htmlhttp://www.aygfsteel.com/titanaly/comments/287825.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/07/22/287825.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/287825.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/287825.html当某个数据库用户在数据库中插入、更新、删除一个表的数据,或者增加一个表的主键时或者表的烦引时Q常怼出现ora-00054:resource busy and acquire with nowait specifiedq样的错误?/p>

主要是因为有事务正在执行Q或者事务已l被锁)Q所有导致执行不成功?/p>

1、用dba权限的用h看数据库都有哪些?/strong>

select t2.username,t2.sid,t2.serial#,t2.logon_time
from v$locked_object t1,v$session t2
where t1.session_id=t2.sid order by t2.logon_time;

如:testuser 339 13545 2009-3-5 17:40:05
知道被锁的用户testuserQsid?39Qserial#?3545

2、根据sid查看具体?a onclick="javascript:tagshow(event, 'sql');" href="javascript:;" target="_self">sql语句Q如果sql不重要,可以kill

select sql_text from v$session a,v$sqltext_with_newlines b
  where DECODE(a.sql_hash_value, 0, prev_hash_value, sql_hash_value)=b.hash_value
  and a.sid=&sid order by piece;

查出来的sqlQ如Q?begin :id := sys.dbms_transaction.local_transaction_id; end;

3、kill该事?/strong>
alter system kill session '339,13545';

4、这样就可以执行其他的事务sql语句?/strong>

如增加表的主键:
alter table test
  add constraint PK_test primary key (test_NO)Q?/p>

]]>
了解Oracle数据库中的系l参数【{?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/07/15/286815.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/286815.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/07/15/286815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/286815.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/286815.html</trackback:ping><description><![CDATA[<font class="content"><a >Oracle</a>数据库系l根据初始化参数文ginit.ora中设|的参数来配|自w的启动Q每个实例在启动之前Q首先读取这些参数文件中讄的不同参数?a >Oracle</a>pȝ中的参数Q根据系l用情况可以简单分Z大类Q普通参敎ͼ也就?a >Oracle</a>pȝ正常使用的一些参敎ͼ另外一cd是特D参敎ͼ包括三种Q过时参数、强调参数和隐藏参数。随着<a >Oracle</a>数据库新版本的发布,相应每次都会增加或者删除一些参数。如何查询当前版本数据库pȝ的参数情况以及当前系l版本相对于以前版本增加或者丢弃的那些参数呢?本文详l介l如何查询当前系l版本中的各U参数情c?<br /> <br /> <strong>一、过时参数和参数</strong> <br /> <a >Oracle</a>数据库中Q系l提供了几个视图可以查看pȝ参数的情c视图V$OBSOLETE_PARAMETER中含有所有的q时(obsolete)和强?underscored)参数。这里首先说明一下什么是<a >Oracle</a>的过?obsolote)和强?underscored)参数Q过时参敎ͼ֐思义是?a >Oracle</a>以前的版本中存在Q但在新版本中已l淘C的参敎ͼ已经不再使用Q而强调参敎ͼ是指那些在新版本中保留了下来Q但是除非特D需要不希望用户使用的那些参数。在视图V$OBSOLETE_PARAMETER中,包含q些参数的名U和一个标志字ISSPECIFIEDQ该标志字用来指个参数是否在init.ora文g中已实际讄?<br /> <br /> 下面的SQL脚本列出了当前系l中所有的q时参数名称以及它们是否在当前系l中讑֮?<br /> <br /> <table cellspacing="0" bordercolordark="#ffffff" cellpadding="0" width="580" bordercolorlight="black" border="1"> <tbody> <tr> <td class="code" bgcolor="#e6e6e6">SQL> COL name format a50;<br /> SQL> SELECT name, isspecified FROM v$obsolete_parameter;</td> </tr> </tbody> </table> <br /> 上面谈到Q?a >Oracle</a>pȝq没有将V$OBSOLETE_PARAMETER视图中的所有参数均丢弃Q而是其中的一部分转换为强调参敎ͼ下面来讨论如何查看q些参数是已被丢弃还是被转换。这可以通过pȝ视图X$KSPPO来查看,该视图中包含一个名为KSPPOFLAG的字D,用来指明该参数在当前版本中是被丢弃还是被Q如果该gؓ1Q则表示该参数已被丢弃,该gؓ2Q则表明该参数现为强调参数?<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 >Oracle</a>pȝ中还有一cd数称之ؓ隐藏参数(hidden parameters)Q是pȝ中用,?a >Oracle</a>官方没有公布的参敎ͼq些参数可能是那些还没有成熟或者是pȝ开发中使用的参数。这些参数在所?a 作ؓ参数的首字符Q诸?a >Oracle</a> 8i中的_trace_files_public和_lock_sga_areas{等?<br /> <br /> 下面的查询可以得到当前系l中的所有隐藏参?以sysw䆾d)Q?<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>三、系l当前参?/strong> <br /> 下面的脚本以英文字母序列出了系l当前用的所有参数。在列出的参CQ如果参数名U前面有#q个W号Q则表示该参数没有明指定,采用了系l中的默认参数。一般在一个新?a >Oracle</a>版本安装完成后,首先q行该脚本,则可以生成该版本数据库的标准init.ora文g?<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 /> 注意Q上面的SQL脚本没有列出pȝ中的隐藏参数</font> <img src ="http://www.aygfsteel.com/titanaly/aggbug/286815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-07-15 11:17 <a href="http://www.aygfsteel.com/titanaly/archive/2009/07/15/286815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle job 理http://www.aygfsteel.com/titanaly/archive/2009/07/11/286368.html不高?/dc:creator>不高?/author>Sat, 11 Jul 2009 04:45:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/07/11/286368.htmlhttp://www.aygfsteel.com/titanaly/comments/286368.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/07/11/286368.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/286368.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/286368.htmlSVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000  ;job_queue_interval = 10  //调度作业h频率Uؓ单位
DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  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)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?br /> show paramter background_dump_dest.
看alter.log 和trace

SVRMGR> select * from dba_jobs;

初始化相兛_数job_queue_processes
alter system set job_queue_processes=39 scope=spfile;//最大g能超q?000

job_queue_interval = 10  //调度作业h频率Uؓ单位


DBA_JOBS describes all jobs in the database.
USER_JOBS describes all jobs owned by the current user

1  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)
2 select job,what,last_date,next_date,interval from  dba_jobs where job in (1,3);


查询job的情c?br /> show paramter background_dump_dest.
看alter.log 和trace

请问我如何停止一个JOB
SQL> exec dbms_job.broken(1,true)

PL/SQL q程已成功完成?br /> SQL>commit  //必须提交否则无效

启动作业
SQL> exec dbms_job.broken(1,false)

PL/SQL q程已成功完成?/p>

停其他用Ljob
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;


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

exec dbms_job.broken(:job) 停止
exec dbms_job.broken(186,true) //标记位broken
exec dbms_job.broken(186,false)//标记为非broken
exec dbms_job.broken(186,false,next_day(sysdate,'monday')) //标记为非broken,指定执行旉
exec dbms_job.remove(:job)Q删?br /> exec dbms_job.remove(186);
commitQ?/p>

把一个broken job重新q行


三、查看相关job信息
1、相兌?br /> dba_jobs
all_jobs
user_jobs
dba_jobs_running 包含正在q行job相关信息


创徏JOB
variable jobno number;
begin
  dbms_job.submit(:jobno, 'statspack.snap;', trunc(sysdate+1/24,'HH'), 'trunc(SYSDATE+1/24,''HH'')', TRUE, :instno);
  commit;
end;
print jobno

例如Q我们已l徏立了一个存储过E,其名UCؓmy_jobQ在sql/plus中以scott用户w䆾dQ执行如下命令:
sql> variable n number;
sql> begin
dbms_job.submit(:n‘my_job;’,sysdate,
‘sysdateQ?/360’);
commit;
end;
Sql> print :n;

pȝ提示执行成功?
Sql> print :n;
pȝ打印此Q务的~号Q例如结果ؓ300?

单例?br /> 一个简单例子:

创徏试?br /> SQL> create table TEST(a date);

表已创徏?/p>

创徏一个自定义q程
SQL> create or replace procedure MYPROC as
  2  begin
  3  insert into TEST values(sysdate);
  4  end;
  5  /

q程已创建?/p>

创徏JOB
SQL> variable job1 number;
SQL>
SQL> begin
  2  dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟Q即一分钟q行testq程一?br />   3  end;
  4  /

PL/SQL q程已成功完成?/p>

q行JOB
SQL> begin
  2  dbms_job.run(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/p>

SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 旉 from TEST;


-------------------
2001/01/07 23:51:21
2001/01/07 23:52:22
2001/01/07 23:53:24

删除JOB
SQL> begin
  2  dbms_job.remove(:job1);
  3  end;
  4  /

PL/SQL q程已成功完成?/p>

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?/p>


a、利用dbms_job.run()立即执行该job
   sql>begin
   sql>dbms_job.run(:jobno) 该jobno为submitq程提交时返回的job number
   sql>end;
   sql>/
b、利用dbms_job.broken()重新broken标记为false
   sql>begin
   sql>dbms_job.broken (:job,false,next_date)
   sql>end;
   sql>/

Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
SQL> create table a(a date);
Table created

创徏一个过E?br /> SQL> create or replace procedure test as
  2  begin
  3  insert into a values(sysdate);
  4  end;
  5  /
Procedure created

提交作业
SQL> declare
  2  job1 number;   //定义一个数字型变量
  3  begin
  4  dbms_job.submit(:job1,'test;',sysdate,'sysdate+1/1440');  //按分钟算一?440分钟
  5  end;
  6  /
PL/SQL procedure successfully completed
job1
---------
4
SQL> commit;
Commit complete

q行作业
SQL> begin
  2  dbms_job.run(4);
  3  end;
  4  /
PL/SQL procedure successfully completed

删除作业
SQL> begin
  2  dbms_job.remove(4);
  3  end;
  4  /
PL/SQL procedure successfully completed
SQL> commit;
Commit complete


job change//修改作业
execute dbms_job.change(186,null,null,'sysdate+3');
execute dbms_job.change(186,'scott.test(update)');

DBA_JOBS
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?br /> 字段Q列Q?nbsp;         cd                 描述
JOB                NUMBER          d的唯一标示?
LOG_USER           VARCHAR2(30)    提交d的用?
PRIV_USER          VARCHAR2(30)    赋予d权限的用?
SCHEMA_USER        VARCHAR2(30)    对Q务作语法分析的用h?
LAST_DATE          DATE            最后一ơ成功运行Q务的旉
LAST_SEC           VARCHAR2(8)     如HH24:MM:SS格式的last_date日期的小Ӟ分钟和秒
THIS_DATE     DATE            正在q行d的开始时_如果没有q行d则ؓnull
THIS_SEC     VARCHAR2(8)     如HH24:MM:SS格式的this_date日期的小Ӟ分钟和秒
NEXT_DATE          DATE            下一ơ定时运行Q务的旉
NEXT_SEC           VARCHAR2(8)     如HH24:MM:SS格式的next_date日期的小Ӟ分钟和秒
TOTAL_TIME         NUMBER          该Q务运行所需要的L_单位为秒
BROKEN             VARCHAR2(1)     标志参数QY标示d中断Q以后不会运?
INTERVAL           VARCHAR2(200)   用于计算下一q行旉的表辑ּ
FAILURES    NUMBER     dq行q箋没有成功的次?
WHAT               VARCHAR2(2000)  执行d的PL/SQL?
CURRENT_SESSION_LABEL RAW          MLSLABEL 该Q务的信QOracle会话W?
CLEARANCE_HI      RAW MLSLABEL     该Q务可信Q的Oracle最大间?
CLEARANCE_LO      RAW              MLSLABEL 该Q务可信Q的Oracle最间?
NLS_ENV           VARCHAR2(2000)   dq行的NLS会话讄
MISC_ENV          RAW(32)          dq行的其他一些会话参?


描述                    INTERVAL参数?
每天午夜12?nbsp;           'TRUNC(SYSDATE + 1)'
每天早上8?0?nbsp;        'TRUNC(SYSDATE + 1) + Q?*60+30Q?(24*60)'
每星期二中午12?nbsp;        'NEXT_DAY(TRUNC(SYSDATE ), ''TUESDAY'' ) + 12/24'
每个月第一天的午夜12?nbsp;   'TRUNC(LAST_DAY(SYSDATE ) + 1)'
每个季度最后一天的晚上11?'TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), 'Q' ) -1/24'
每星期六和日早上6?0?nbsp;   'TRUNC(LEAST(NEXT_DAY(SYSDATE, ''SATURDAY"), NEXT_DAY(SYSDATE, "SUNDAY"))) + Q?×60+10Q?Q?4×60Q?

Oracle9i 中job_queue_interval已经废弃Qobsoleted)Qjob_queue_processes=10默认Q实际上Qjob_queue_interval的gؓ5Q假如实在要修改interval的|可以使用_job_queue_interval的隐藏参数?br />



]]>
Oracle中Null与空字符?'的区?/title><link>http://www.aygfsteel.com/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.aygfsteel.com/titanaly/archive/2009/06/17/282817.html</guid><wfw:comment>http://www.aygfsteel.com/titanaly/comments/282817.html</wfw:comment><comments>http://www.aygfsteel.com/titanaly/archive/2009/06/17/282817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/titanaly/comments/commentRss/282817.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/titanaly/services/trackbacks/282817.html</trackback:ping><description><![CDATA[1、Windows NT4.0+ORACLE 8.0.4 <br /> 2、ORACLE安装路径为:C:ORANT <br /> <br /> 含义解释Q?<br /> 问:什么是NULLQ?<br /> {:在我们不知道具体有什么数据的时候,也即未知Q可以用NULLQ我们称它ؓI,ORACLE中,含有I值的表列长度为零?<br /> ORACLE允许M一U数据类型的字段为空Q除了以下两U情况: <br /> 1、主键字D(primary keyQ, <br /> 2、定义时已经加了NOT NULL限制条g的字D?<br /> <br /> 说明Q?<br /> 1、等价于没有M倹{是未知数?<br /> 2、NULL?、空字符丌Ӏ空格都不同?<br /> 3、对I值做加、减、乘、除{运操作,l果仍ؓI?<br /> 4、NULL的处理用NVL函数?<br /> 5、比较时使用关键字用“is null”?#8220;is not null”?<br /> 6、空g能被索引Q所以查询时有些W合条g的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查?<br /> 7、排序时比其他数据都大(索引默认是降序排列,?#8594;大)Q所以NULL值L排在最后?<br /> <br /> 使用ҎQ?<br /> SQL> select 1 from dual where null=null; <br /> <br /> 没有查到记录 <br /> <br /> SQL> select 1 from dual where null=''; <br /> <br /> 没有查到记录 <br /> <br /> SQL> select 1 from dual where ''=''; <br /> <br /> 没有查到记录 <br /> <br /> SQL> select 1 from dual where null is null; <br /> <br /> 1 <br /> --------- <br /> 1 <br /> <br /> SQL> select 1 from dual where nvl(null,0)=nvl(null,0); <br /> <br /> 1 <br /> --------- <br /> 1 <br /> <br /> 对空值做加、减、乘、除{运操作,l果仍ؓI?<br /> SQL> select 1+null from dual; <br /> SQL> select 1-null from dual; <br /> SQL> select 1*null from dual; <br /> SQL> select 1/null from dual; <br /> <br /> 查询C个记? <br /> <br /> 注:q个记录是SQL语句中的那个null <br /> <br /> 讄某些列ؓI?<br /> update table1 set ?=NULL where ? is not null; <br /> <br /> 现有一个商品销售表saleQ表l构为: <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');Q注意:q条记录的sellgؓI) <br /> commit; <br /> p?2条记?<br /> <br /> SQL> 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 /> 查询?1记录. <br /> <br /> l果说明Q?<br /> 查询l果说明此SQL语句查询不出列gؓNULL的字D?<br /> 此时需对字DؓNULL的情况另外处理?<br /> SQL> select * from sale where sell like '%' or sell is null; <br /> SQL> 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 /> 查询?2记录. <br /> <br /> Oracle的空值就是这么的用法Q我们最好熟悉它的约定,以防查出的结果不正确?<br /> <br /> 以上来自<a >http://www.cnoug.org/viewthread.php?tid=15087</a> <p> </p> <p>但对于char 和varchar2cd的数据库字段中的null和空字符串是否有区别呢?</p> <p>作一个测试:</p> <p>create table test (a char(5),b char(5));</p> <p>SQL> insert into test(a,b) values('1','1');</p> <p>SQL> insert into test(a,b) values('2','2');</p> <p>SQL> insert into test(a,b) values('3','');--按照上面的解释,b字段有值的</p> <p>SQL> insert into test(a) values('4');</p> <p>SQL> select * from test;</p> <p>A B<br /> ---------- ----------<br /> 1 1<br /> 2 2<br /> 3<br /> 4</p> <p>SQL> select * from test where b='';----按照上面的解释,应该有一条记录,但实际上没有记录</p> <p>未选定?/p> <p>SQL> select * from test where b is null;----按照上面的解释,应该有一跌录,但实际上有两条记录?/p> <p>A B<br /> ---------- ----------<br /> 3<br /> 4</p> <p>SQL>update table test set b='' where a='2';<br /> SQL> select * from test where b='';</p> <p>未选定?/p> <p>SQL> select * from test where b is null;</p> <p>A B<br /> ---------- ----------<br /> 2<br /> 3<br /> 4</p> <p>试l果说明Q对char和varchar2字段来说Q?'是nullQ但对于where 条g后的'' 不是null?/p> <p>对于~省|也是一LQ?br />  </p> <p><a >http://yseraphi.itpub.net/post/720/114646</a></p> <img src ="http://www.aygfsteel.com/titanaly/aggbug/282817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/titanaly/" target="_blank">不高?/a> 2009-06-17 12:00 <a href="http://www.aygfsteel.com/titanaly/archive/2009/06/17/282817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>请问在Oracle中取W?0条记录到W?0条记录,效率最高的SQL语句怎么写?http://www.aygfsteel.com/titanaly/archive/2009/06/05/280260.html不高?/dc:creator>不高?/author>Fri, 05 Jun 2009 11:34:00 GMThttp://www.aygfsteel.com/titanaly/archive/2009/06/05/280260.htmlhttp://www.aygfsteel.com/titanaly/comments/280260.htmlhttp://www.aygfsteel.com/titanaly/archive/2009/06/05/280260.html#Feedback0http://www.aygfsteel.com/titanaly/comments/commentRss/280260.htmlhttp://www.aygfsteel.com/titanaly/services/trackbacks/280260.html
  • oracle   
  •   
  • select   *   from   table   where   rownum<20      
  •   minus      
  •   select   *   from   table   where   rownum<10      
  •   
  • //但这U查询的效率更高于前?nbsp;(556436条数据,试l果)   
  • select * from (select rownum r,a.* from blog a where rownum<=20) where r>=10;   
  •   
  •   
  •   
  • mysql> SELECT * FROM table LIMIT 5,10;  // 索记录行 6-15   
  •   
  • //Z索从某一个偏U量到记录集的结束所有的记录行,可以指定W二个参Cؓ -1Q?nbsp;   
  • mysql> SELECT * FROM table LIMIT 95,-1// 索记录行 96-last.   
  •   
  • //如果只给定一个参敎ͼ它表C回最大的记录行数目:    
  • mysql> SELECT * FROM table LIMIT 5;     //索前 5 个记录行   
  •   
  • //换句话说QLIMIT n {h?nbsp;LIMIT 0,n   
  •   
  •   
  •   
  • mysql limit查询优化[转蝲],׃limitl常用到Q却没有注意Q因为^时做的项目都比较,所以也没有考虑L么优化Q今天看了一关于mysql limit优化的文章,感觉很好 于是转蝲q来   
  •   
  • 原文地址在这?  
  • http://www.phpobject.net/blog/read.php?119   
  •   
  • MYSQL的优化是非常重要的。其他最常用也最需要优化的是limit。mysql的limitl分带来了极大的方便,但数据量一大的时候,limit的性能急剧下降?  
  •        同样是取10条数?  
  •   
  • select * from yanxue8_visit limit 10000,10        ?  
  •   
  •     
  •   
  • select * from yanxue8_visit limit 0,10    
  •   
  •   
  • ׃是一个数量别的?  
  •   
  •     |上也很多关于limit的五条优化准则,都是译自mysql手册Q虽然正但不实用。今天发C文章写了些关于limit优化的,很不错。原文地址Qhttp://www.zhenhua.org/article.asp?id=200   
  •   
  •     文中不是直接使用limitQ而是首先获取到offset的id然后直接使用limit size来获取数据。根据他的数据,明显要好于直接用limit。这里我具体使用数据分两U情况进行测试。(试环境win2033+p4双核 (3GHZ) +4G内存 mysql 5.0.19Q?  
  •   
  • 1、offset比较的时候?  
  •   
  • select * from yanxue8_visit limit 10,10    
  •   
  •   
  •    多次q行Q时间保持在0.0004-0.0005之间   
  •   
  • Select * From yanxue8_visit Where vid >=(   
  •   
  • Select vid From yanxue8_visit Order By vid limit 10,1  
  •   
  • ) limit 10    
  •   
  •   
  •   多次q行Q时间保持在0.0005-0.0006之间Q主要是0.0006  
  •  l论Q偏Uoffset较小的时候,直接使用limit较优。这个显然是子查询的原因?  
  •   
  •   
  • 2、offset大的时候?  
  •   
  • select * from yanxue8_visit limit 10000,10    
  •   
  •   
  •    多次q行Q时间保持在0.0187左右   
  •   
  • Select * From yanxue8_visit Where vid >=(   
  •   
  • Select vid From yanxue8_visit Order By vid limit 10000,1  
  •   
  • ) limit 10    
  •   
  •   
  • 多次q行Q时间保持在0.0061左右Q只有前者的1/3。可以预计offset大Q后者越优?  
  •   
  • 以后要注意改正自qlimit语句Q优化一下mysql?nbsp; 


  • ]]>
    վ֩ģ壺 ƽ˳| | | | | | | ʯʨ| ѽ| ض| | | ƽ| | | ɫ| | | ͨ| | ̫| ̫| | | ƽ| | ͤ| ƶ| | ²| ̨| ϲ| | | ̨| | ½| ϰ| | ̫| ׿|