<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-124  評論-49  文章-56  trackbacks-0
     

    數字函數

    1.1、ABS(n)函數
    描述:返回數值n的絕對值。

    Examples:select abs(-15) “test” from dual;

    1.2、ACOS(n)函數
    描述:返回數值n的反余弦值。輸入數值范圍在-1~1之間,返回值為弧度。

    Examples:select acos(0.6) “test”,acos(-.6) “test1” from dual;

    1.3、COS(n)函數
    描述: 返回數值n的余弦值。返回值為弧度。

    Examples:select cos(1.6) “test”,cos(-6) “test1” from dual;

    1.4、SIN(n)函數
    描述: 返回數值n的正弦值。

    Examples:select sin(1.6) “test”,sin(-6) “test1” from dual;

    1.5、ASIN(n)函數
    描述: 返回數值n的反正弦值。輸入數值范圍在-1~1之間,返回值為弧度。

    Examples:select asin(0.6) “test”,asin(-0.6) “test1” from dual;

    1.6、TAN(n)函數
    描述: 返回數值n的正切值。

    Examples:select tan(6) “test”,tan(-0.6) “test1” from dual;

    1.7、ATAN(n)函數
    描述: 返回數值n的反正切值。輸入數值任意,返回值為弧度。

    Examples:select atan(6) “test”,atan(-0.6) “test1” from dual;

    1.8、ATAN2(n,m)函數
    描述: 返回數值n/m的反正切值。輸入數值任意,返回值為弧度。

    Examples:select atan2(19,3) “test”,atan2(-9,-0.9) “test1” from dual;

    1.9、SINH(n)函數
    描述: 返回數值n的雙曲正弦值。輸入數值任意。

    Examples:select sinh(6) “test”,sinh(-0.6) “test1” from dual;

    1.10、TANH(n)函數
    描述: 返回數值n的雙曲正切值。輸入數值任意。

    Examples:select tanh(6) “test”,tanh(-0.6) “test1” from dual;

    1.11、CEIL(n)函數
    描述: 返回大于等于數值n的最小整數。

    Examples:select ceil(6) “test”,ceil(6.6) “test1” from dual;

    1.12、COSH(n)函數
    描述: 返回數值n的雙曲余弦值。

    Examples:select cosh(6) “test”,cosh(6.6) “test1” from dual;

    1.13、EXP(n)函數
    描述: 返回e的n次冥。(e=2.71828183…)

    Examples:select exp(6) “test” from dual;

    1.14、FLOOR(n)函數
    描述: 返回小于等于數值n的最大整數。

    Examples:select floor(6) “test”,floor(9.3) “test1” from dual;

    1.15、LN(n)函數
    描述: 返回數值n的自然對數。(n必須大于0)

    Examples:select ln(6) “test” from dual;

    1.16、LOG(m,n)函數
    描述: 返回以m為底的數值n的對數。(m>1,n>0)

    Examples:select log(6,3) “test” from dual;

    1.17、MOD(m,n)函數
    描述: 返回m/n后的余數,若n=0,則返回m(求模運算)

    Examples:select mod(6,3) “test” from dual;

    1.18、POWER(m,n)函數
    描述: 返回m的n次冥

    Examples:select power(6,3) “test” from dual;

    1.19、ROUND(n,[m])函數
    描述: 執行四舍五入運算,m可以省略,當省略m時,四舍五入到整數位;當m為正數時,四舍五入到小數點后m位;當m為負數時,四舍五入到小數點前m位。

    Examples:select round(6.698,2) “test” from dual;

    1.20、SIGN(n)函數
    描述: 檢測數值的正負,當n<0則返回-1;當n>0則返回1,當n=0返回0。

    Examples:select sign(6.698) “test”,sign(-9) “test1”,sign(0) “test2” from dual;

    1.21、SQRT(n)函數
    描述: 返回數值n的平方根。(n>=0)

    Examples:select sqrt(6.698) “test” from dual;

    1.22、TRUNC(n,[m])函數
    描述: 截取數值n,m可以省略,當省略m時則截取n的小數部分;當m為正數時則將n截取到小數點后m位;當m為負數時則將n截取到小數點前m位

    Examples:select trunc(6.698,2) “test”,trunk(696.3,-2) “test1” from dual;

    字符函數


    說明:字符函數輸入值為字符類型,返回值為字符類型或數字類型,可以在sql語句中直接使用,也可以在pl/sql塊中使用。

    2.1、ASCII(n)函數
    描述: 返回字符串的ascii碼(當輸入為字符串時返回第一個字符的ascii碼)

    Examples:select ascii(‘A’) “test”,ascii(‘我們’) “test1” from dual;

    2.2、CHR(n)函數
    描述: 返回對應的ascii碼的字符(n必須為數字類型)

    Examples:select ascii(54992) “test” from dual;

    2.3、CONCAT(n,m)函數
    描述: 連接n和m,n和m可以是字符,也可以是字符串。作用和”||”一樣。

    Examples:select concat(‘中國’,’人民’) “test” from dual;

    2.4、INITCAP(n)函數
    描述: 將字符串n中每個單詞首字母大寫,其余小寫(區分單詞的規則是按空格或非字母字符;可以輸入中文字符,但沒有任何作用)

    Examples:select initcap(‘中 國 人 民’) “test”,initcap(‘my word’) “test1”,initcap(‘my中國word’) “test2” from dual;

    2.5、INSTR(chr1,chr2,[n,[m]])函數
    描述: 獲取字符串chr2在字符串chr1中出現的位置。n和m可選,省略是默認為1;n代表開始查找的起始位置,當n為負數從尾部開始搜索;m代表字串出現的次數。

    Examples:select instr('pplkoopijk','k',-1,1) “test” from dual;

    備注:當n為負數從尾部搜索,但返回值仍然是按正向排列得出的位置。

    2.6、LENGTH(n)函數
    描述: 返回字符或字符串長度。(當n為null時,返回nll;返回的長度包括后面的空格)

    Examples:select length('ppl ') “test”,length(null) “test1” from dual;

    2.7、LOWER(n)函數
    描述: 將n轉換為小寫。

    Examples:select lower('KKKD') “test” from dual;

    2.8、LPAD(chr1,n,[chr2])函數
    描述: 在chr1左邊填充字符chr2,使得字符總長度為n。chr2可選,默認為空格;當chr1字符串長度大于n時,則從左邊截取chr1的n個字符顯示。

    Examples:select lpad('kkk',5) “test”,lpad(‘kkkkk’,4) “test1”,lpad(‘kkk’,6,’lll’) “test2” from dual;

    2.9、LTRIM(chr,[n])函數
    描述: 去掉字符串chr左邊包含的n字符串中的任何字符,直到出現一個不包含在n中的字符為止。

    Examples:select ltrim('abcde',’a’) “test”,ltrim(‘abcde’,’b’) “test1”,ltrim(‘abcdefg’,’cba’) “test2” from dual;

    2.10、NLS_INITCAP(chr,[’nls_param’])函數
    描述: 將chr首字母大寫。Nls_param可選,指定排序的方式。(有SCHINESE_RADICAL_M(部首、筆畫),SCHINESE_STROKE_M(筆畫、部首),SCHINESE_PINYIN_M(拼音))

    Examples:select nls_initcap('ab cde') “test”,nls_initcap(‘a b c d e’,’nls_sort= SCHINESE_PINYIN_M’) “test1” from dual;

    2.11、NLS_LOWER(chr,[‘nls_param’])函數
    描述: 將字符串轉換為小寫。Nls_param可選,指定排序的方式。(有SCHINESE_RADICAL_M(部首、筆畫),SCHINESE_STROKE_M(筆畫、部首),SCHINESE_PINYIN_M(拼音))

    Examples:select nls_lower('ABC') “test”,nls_lower(‘ABC’,’nls_sort= SCHINESE_PINYIN_M’) “test1” from dual;

    2.12、NLSSORT(col,[’nls_param’])函數
    描述: 根據nls_param指定的方式對col字段進行排序。

    Examples:SELECT part_number FROM cux_om_part_all ORDER BY nlssort(part_number,'nls_sort=SCHINESE_RADICAL_M')

    2.13、NLS_UPPER(chr,[‘nls_param’])函數
    描述: 將chr轉換為大寫。Nls_param可選,用于指定排序規則

    Examples:SELECT nls_upper('ddddd','nls_sort=xdanish') FROM dual

    2.14、REGEXP_REPLACE(source_string,pattern,replace_string,position,occurtence,match_parameter)函數(10g新函數)
    描述:字符串替換函數。相當于增強的replace函數。Source_string指定源字符表達式;pattern指定規則表達式;replace_string指定用于替換的字符串;position指定起始搜索位置;occurtence指定替換出現的第n個字符串;match_parameter指定默認匹配操作的文本串。

    其中replace_string,position,occurtence,match_parameter參數都是可選的。

    2.15、REGEXP_SUBSTR(source_string, pattern[,position [, occurrence[, match_parameter]]])函數(10g新函數)
    描述:返回匹配模式的子字符串。相當于增強的substr函數。Source_string指定源字符表達式;pattern指定規則表達式;position指定起始搜索位置;occurtence指定替換出現的第n個字符串;match_parameter指定默認匹配操作的文本串。

    其中position,occurtence,match_parameter參數都是可選的

    Examples:select regexp_substr(‘http://www.oracle.com/products’,’http://([[:alnum:]]+\.?) {3,4} / ?’) “regexp_substr” from dual

    2.16、REGEXP_LIKE(source_string, pattern
    [, match_parameter])函數(10g新函數)
    描述:返回滿足匹配模式的字符串。相當于增強的like函數。Source_string指定源字符表達式;pattern指定規則表達式;match_parameter指定默認匹配操作的文本串。

    其中position,occurtence,match_parameter參數都是可選的

    Examples:

    2.17、REGEXP_INSTR(source_string, pattern
    [, start_position
    [, occurrence
    [, return_option
    [, match_parameter]]]])函數(10g新函數)

    描述: 該函數查找 pattern ,并返回該模式的第一個位置。您可以隨意指定您想要開始搜索的 start_position。 occurrence 參數默認為 1,除非您指定您要查找接下來出現的一個模式。return_option 的默認值為 0,它返回該模式的起始位置;值為 1 則返回符合匹配條件的下一個字符的起始位置

    Examples:

     

    附注:上面紅色標題的四個函數是oracle 10g才有的函數,使用正則表達式可以實現很強大的功能。鑒于變化太多,可以參考oracle的官方文檔:SQL Reference(第七章)
    2.18、REPLACE(chr,search_string,[,replacement_string])函數
    描述:將chr中滿足search_string條件的替換為replacement_string指定的字符串,當search_string為null時,返回chr;當replacement_string為null時,返回chr中截取掉search_string部分的字符串。

    Examples: SELECT REPLACE('abcdeef','e','oo') "test",REPLACE('abcdeef','ee','oo') "test1",REPLACE('abcdeef',NULL,'oo') "test2",REPLACE('abcdeef','ee',NULL) "test3" FROM dual

    2.19、RPAD(chr1,n,chr2)函數
    描述:在chr1右邊填充chr2,使返回字符串長度為n..當chr1長度大于n時,返回左端n個字符。參考LPAD()函數。

    2.20、RTRIM(chr,[set])函數
    描述:去掉chr右邊包含的set中的任何字符,直到出現一個不是set中的字符結束。參考LTRIM()函數。

    2.21、SOUNDEX(chr)函數
    描述:返回字符串的語音表示,可以用來比較字符串的發音是否相同。

    Examples:select soundex(‘ship’) “test”,soundex(‘sleep’) “test1” from dual;

    2.22、SUBSTR(chr,m[,n])函數
    描述:取chr的子串。M代表開始位置,n是要取的長度。當m為0時從首字符開始,當m為負時從字符串尾部開始截取。

    Examples:select substr(‘abcdef’,0,3) “test”,substr(‘abcdef’,1,3) “test1”,substr(‘abcdef’,-3,3) “test2”,substr(‘abcdef’,-1,3) “test3” from dual

    注意:m取0或1時,開始位置是一樣的,都是從第一位開始,m為負的時候,仍然是按從左到右的順序取,所以如果m為-1,n的長度再大,也只能取到最后一個字符,因為chr右邊已經沒有字符了。

    2.23、TRANSLATE(chr,from_str,to_str)函數
    描述:另一種替換函數的用法。

    Examples: SELECT translate('abcdeabc','abc','fgh') "test",translate('abcdeabc','abc','hf') "test1",translate('abcdeabc','ab','hfgh') "test2",translate('abcdeabc','abc',' ') "test3" FROM dual

    注意:匹配的規則是from_str和to_str每個字符按順序相對應,如果from_str字符少于to_str中的字符,則只替換能對應的字符,to_str后面不能和from_str對應的字符則不管,如果from_str字符多于to_str字符,則from_str中找不到對應字符按照null來處理。

    2.24、TRIM(chr)函數
    TRIM函數將字符串的前綴(或尾隨)字符刪除。

    其具體的語法格式如下:

    TRIM([LEADING|TRAILING|BOTH][trimchar FROM] string)

    其中:

    LEADING 指明僅僅將字符串的前綴字符刪除

    TRAILING 指明僅僅將字符串的尾隨字符刪除

    BOTH 指明既刪除前綴字符,也刪除尾隨字符。這也是默認方式

    string 任意一待處理字符串

    trimchar 可選項。指明試圖刪除什么字符,默認被刪除的字符是空格

    下面是該函數的使用情況:

    TRIM(’ Ashley ’)=‘Ashley’

    TRIM(LEADING ’*’ FROM’***Ashley***’)=‘Ashley***’

    2.25、UPPER(chr)函數
    UPPER函數間返回字符串的大寫形式。

    其具體的語法格式如下:

    UPPER(string)

    其中:

    string 任意VARCHAR2或CHAR型字符串

    下面是該函數的使用情況:

    UPPER(’THIS IS a Test’)=‘THIS IS A TEST’

    日期函數

    3.1、add_months(d,n)
    說明:用于從一個日期值增加或減少一些月份,d代表一個日期,n為正數則代表在d日期 上增加n月份,n為負數則代表在d日期上減少n月
    例:select add_months(sysdate,12) "Next Year" from dual;
    3.2、current_date()

    說明:返回當前會話時區中的當前日期時間
    alter session set time_zone=’-11:00’(更改當前會話時區命令)
    例:select sessiontimezone,current_date from dual;
    3.3、dbtimezone()

    說明:返回數據庫實例時區
    select dbtimezone from dual;
    3.4、extract()

    說明:顯示指定格式的日期值。
    select extract(month from sysdate) "This Month" from dual;
    select extract(year from add_months(sysdate,36)) "3 Years Out" from dual;
    3.5、last_day()

    說明:返回包含了日期參數的月份的最后一天的日期
    select last_day(sysdate) "last" from dual;
    3.6、months_between(d1,d2)

    說明:返回d1和d2兩個月份之間相差的月數,若d1<d2,返回負數;d1>d2,返回正數;若d1和d2都是月底或者天數相同,則返回整數,否則以每月31天為基準數返回小數。
    select months_between(to_date('2007-01-31','yyyy-mm-dd'),to_date('2006-11-30','yyyy-mm-dd')) from dual;
    3.7、next_day(d,varchar2)

    說明:返回日期d指定的在日期d之后的第一個工作日;

    SELECT next_day(SYSDATE,'星期四') FROM dual;

    Select next_day(sysdate,’monday’) from dual; 錯誤,不能使用英文單詞

    返回當前日期后的第一個星期四的日期。若當前日期已經是星期四或過了星期四,則返回下周的星期四對應的日期,否則返回本周星期四的日期。

    注意:varchar2指定工作日的時候和當前數據庫實例的參數設置有關,字符串需要用中文寫,如果中文不行,就使用英文星期代表。

    3.8、round(d,fmt)
    說明:返回日期時間的四舍五入結果。如果fmt指定年,則以7月1日為分界;如果指定月,則以16日為分界;關于按天來四舍五入,在測試時無法理解(資料上解釋按天的時候是以中午12:00為分界)

    Select round(sysdate,’month’) from dual;

    3.9、trunc(d,fmc)
    說明:按照指定的格式截斷日期,如果指定格式為年,則結果為本年1月1日,如果格式指定為月,則結果為本月1日,關于格式指定為天還未理解。

    SELECT trunc(SYSDATE,'month') FROM dual;

    3.10、sysdate

    應用:
    1. 日期和字符轉換函數用法(to_date,to_char)

    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期轉化為字符串
    select to_char(sysdate,'yyyy') as nowYear from dual; //獲取時間的年
    select to_char(sysdate,'mm') as nowMonth from dual; //獲取時間的月
    select to_char(sysdate,'dd') as nowDay from dual; //獲取時間的日
    select to_char(sysdate,'hh24') as nowHour from dual; //獲取時間的時
    select to_char(sysdate,'mi') as nowMinute from dual; //獲取時間的分
    select to_char(sysdate,'ss') as nowSecond from dual; //獲取時間的秒


    select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from dual//

    2. select to_char( to_date(222,'J'),'Jsp') from dual

    顯示Two Hundred Twenty-Two

    3.求某天是星期幾
    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual;
    星期一
    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
    monday
    設置日期語言
    ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
    也可以這樣
    TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American')

    4. 兩個日期間的天數
    select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;

    5. 時間為null的用法
    select id, active_date from table1
    UNION
    select 1, TO_DATE(null) from dual;

    注意要用TO_DATE(null)

    6.月份差
    a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
    那么12月31號中午12點之后和12月1號的12點之前是不包含在這個范圍之內的。
    所以,當時間需要精確的時候,覺得to_char還是必要的

    7. 日期格式沖突問題
    輸入的格式要看你安裝的ORACLE字符集的類型, 比如: US7ASCII, date格式的類型就是: '01-Jan-01'
    alter system set NLS_DATE_LANGUAGE = American
    alter session set NLS_DATE_LANGUAGE = American
    或者在to_date中寫
    select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day','NLS_DATE_LANGUAGE = American') from dual;
    注意我這只是舉了NLS_DATE_LANGUAGE,當然還有很多,
    可查看
    select * from nls_session_parameters
    select * from V$NLS_PARAMETERS
    8.
    select count(*)
    from ( select rownum-1 rnum
    from all_objects
    where rownum <= to_date('2002-02-28','yyyy-mm-dd') - to_date('2002-
    02-01','yyyy-mm-dd')+1
    )
    where to_char( to_date('2002-02-01','yyyy-mm-dd')+rnum-1, 'D' )
    not in ( '1', '7' )

    查找2002-02-28至2002-02-01間除星期一和七的天數
    在前后分別調用DBMS_UTILITY.GET_TIME, 讓后將結果相減(得到的是1/100秒, 而不是毫秒).

    9. 查找月份
    select months_between(to_date('01-31-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
    1
    select months_between(to_date('02-01-1999','MM-DD-YYYY'),to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
    1.03225806451613

    10. Next_day的用法
    Next_day(date, day)

    Monday-Sunday, for format code DAY
    Mon-Sun, for format code DY
    1-7, for format code D

    11
    select to_char(sysdate,'hh:mi:ss') TIME from all_objects
    注意:第一條記錄的TIME 與最后一行是一樣的
    可以建立一個函數來處理這個問題
    create or replace function sys_date return date is
    begin
    return sysdate;
    end;

    select to_char(sys_date,'hh:mi:ss') from all_objects;

    12.獲得小時數
    extract()找出日期或間隔值的字段值
    SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 2:38:40') from offer
    SQL> select sysdate ,to_char(sysdate,'hh') from dual;

    SYSDATE TO_CHAR(SYSDATE,'HH')
    -------------------- ---------------------
    2003-10-13 19:35:21 07

    SQL> select sysdate ,to_char(sysdate,'hh24') from dual;

    SYSDATE TO_CHAR(SYSDATE,'HH24')
    -------------------- -----------------------
    2003-10-13 19:35:21 19


    13.年月日的處理
    select older_date,
    newer_date,
    years,
    months,
    abs(
    trunc(
    newer_date-
    add_months( older_date,years*12+months )
    )
    ) days

    from ( select
    trunc(months_between( newer_date, older_date )/12) YEARS,
    mod(trunc(months_between( newer_date, older_date )),12 ) MONTHS,
    newer_date,
    older_date
    from (
    select hiredate older_date, add_months(hiredate,rownum)+rownum newer_date
    from emp
    )
    )

    14.處理月份天數不定的辦法
    select to_char(add_months(last_day(sysdate) +1, -2), 'yyyymmdd'),last_day(sysdate) from dual

    16.找出今年的天數
    select add_months(trunc(sysdate,'year'), 12) - trunc(sysdate,'year') from dual

    閏年的處理方法
    to_char( last_day( to_date('02' | | :year,'mmyyyy') ), 'dd' )
    如果是28就不是閏年

    17.yyyy與rrrr的區別
    'YYYY99 TO_C
    ------- ----
    yyyy 99 0099
    rrrr 99 1999
    yyyy 01 0001
    rrrr 01 2001

    18.不同時區的處理
    select to_char( NEW_TIME( sysdate, 'GMT','EST'), 'dd/mm/yyyy hh:mi:ss') ,sysdate
    from dual;

    19.5秒鐘一個間隔
    Select TO_DATE(FLOOR(TO_CHAR(sysdate,'SSSSS')/300) * 300,'SSSSS') ,TO_CHAR(sysdate,'SSSSS')
    from dual

    2002-11-1 9:55:00 35786
    SSSSS表示5位秒數

    20.一年的第幾天
    select TO_CHAR(SYSDATE,'DDD'),sysdate from dual

    310 2002-11-6 10:03:51

    21.計算小時,分,秒,毫秒
    select
    Days,
    A,
    TRUNC(A*24) Hours,
    TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
    TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
    TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
    from
    (
    select
    trunc(sysdate) Days,
    sysdate - trunc(sysdate) A
    from dual
    )

    select * from tabname
    order by decode(mode,'FIFO',1,-1)*to_char(rq,'yyyymmddhh24miss');

    //
    floor((date2-date1) /365) 作為年
    floor((date2-date1, 365) /30) 作為月
    d(mod(date2-date1, 365), 30)作為日.

    23.next_day函數 返回下個星期的日期,day為1-7或星期日-星期六,1表示星期日
    next_day(sysdate,6)是從當前開始下一個星期五。后面的數字是從星期日開始算起。
    1 2 3 4 5 6 7
    日 一 二 三 四 五 六

    ---------------------------------------------------------------

    select (sysdate-to_date('2003-12-03 12:55:45','yyyy-mm-dd hh24:mi:ss'))*24*60*60 from ddual
    日期 返回的是天 然后 轉換為ss

    24,round[舍入到最接近的日期](day:舍入到最接近的星期日)
    select sysdate S1,
    round(sysdate) S2 ,
    round(sysdate,'year') YEAR,
    round(sysdate,'month') MONTH ,
    round(sysdate,'day') DAY from dual

    25,trunc[截斷到最接近的日期,單位為天] ,返回的是日期類型
    select sysdate S1,
    trunc(sysdate) S2, //返回當前日期,無時分秒
    trunc(sysdate,'year') YEAR, //返回當前年的1月1日,無時分秒
    trunc(sysdate,'month') MONTH , //返回當前月的1日,無時分秒
    trunc(sysdate,'day') DAY //返回當前星期的星期天,無時分秒
    from dual

    26,返回日期列表中最晚日期
    select greatest('01-1月-04','04-1月-04','10-2月-04') from dual

    27.計算時間差
    注:oracle時間差是以天數為單位,所以換算成年月,日

    select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual //時間差-年
    select ceil(moths_between(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual //時間差-月
    select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual //時間差-天
    select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual //時間差-時
    select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual //時間差-分
    select floor(to_number(sysdate-to_date('2007-11-02 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual //時間差-秒

    28.更新時間
    注:oracle時間加減是以天數為單位,設改變量為n,所以換算成年月,日
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n*365,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-年
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),add_months(sysdate,n) as newTime from dual //改變時間-月
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-日
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-時
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-分
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss'),to_char(sysdate+n/24/60/60,'yyyy-mm-dd hh24:mi:ss') as newTime from dual //改變時間-秒

    29.查找月的第一天,最后一天
    SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH') First_Day_Last_Month,
    Trunc(SYSDATE, 'MONTH') - 1 / 86400 Last_Day_Last_Month,
    Trunc(SYSDATE, 'MONTH') First_Day_Cur_Month,
    LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 Last_Day_Cur_Month
    FROM dual;

    轉換函數

    4.1、asciistr(str)
    說明:將任意字符集的字符串轉換為當前數據庫實例對應的ascii字符串。

    SELECT asciistr('中華民族') FROM dual;

    備注:和該函數相似的有ascii,它是取得字符串第一個字符的ascii碼,后面的字符不管;chr是將ascii碼轉換為對應的字符。

    4.2、cast()
    說明:將一個內置數據類型或集合類型轉變為另一個內置數據類型或集合類型。

    SELECT CAST(SYSDATE AS VARCHAR2(100)) FROM dual;

    4.3、chartorowid(str)
    說明:將字符串轉變為rowid數據類型,但字符串必須符合rowid格式。

    4.4、convert(str,char_set,source_char_set)
    說明:將字符串從一個字符集轉變為另一個字符集。Str為要轉變的字符串,char_set為轉變后的字符集,source_char_set為該字符串原始的字符集。

    SELECT convert('中國','US7ASCII','ZHS16GBK') FROM dual;

    4.4、rowidtochar(rowid)
    說明:將rowid轉換為對應的varchar2數據類型值。

    4.5、to_char()
    select to_char(n’中國’) from dual; 轉變為本地字符集類型

    select to_char(10000,’L99G999D99MI’) from dual; 轉換成貨幣格式

    4.6、to_date()
    轉變為日期格式。

    4.7、to_number()
    將字符串轉變為數字值,但字符串必須是數字(0~9)。

    單行函數

    decode(exer.search1,result1[search2,result2,...][,defalut])
    用于匹配特定表達式的結果,如果search1匹配于exer,則返回result1,如果search2匹配于exer則返回result2,
    依次類推,如果沒有任何匹配關系則返回defalut

    分組函數


    6.1AVG 取平均值
    Select AVG(SAL) From EMP

    6.2max 取最大值
    select max(sal) from emp

    6.3min 取最小值
    select min(sal) from emp

    6.4count 取記錄數
    SELECT COUNT(*) FROM EMP
    也可以
    select count(empno) from emp
    注意:
    要么count(*)
    要么count(沒有null值的列---主鍵)

     

    6.5sum 求和
    Select SUM(SAL*12) From EMP

    應用:

    1.分組函數和distinct關鍵詞的搭配
    Select COUNT(Distinct SAL) From EMP

     

    2.組函數與空值
    select count(comm) from emp
    空值不參與運算,直接被過濾掉

     

    3.分組數據
    group by子句
    SELECT COUNT(*) FROM EMP GROUP BY DEPTNO

    4.使用group by規則
    A.group by后面的字段不必顯示在select列表中
    B.反之則不行
    也就是說:select后面的字段必須在group by子句中出現
    例外的是:
    在組函數(count,max,min等)中出現的字段除外

    5.關于group by條件分組的問題
    A.group by可以和where來搭配
    where只能在group by的前面
    Select JOB From EMP Where SAL>2000 Group By JOB
    group by后面不能有where

    B.where子句中不能包括組函數
    條件的表達只能使用having來表示
    Select DEPTNO,Max(SAL),Min(SAL) From EMP Group By DEPTNO Having Max(SAL)>2000

    對象函數

    posted @ 2010-07-28 18:22 junly 閱讀(773) | 評論 (0)編輯 收藏
    --1定義標量變量
    --
    (1)定義語法
    變量名 [constant] 數據類型 [not null] [:= | default expr]
    -- constant:用于指定常量。必須指定初始值
    --
     := 用于為變量和常量指定初始值
    --
     expr初始值的pl/sql表達式,可以是文本值、變量、函數等
    --
    示例1:
    v_name varchar2(10);
    v_rate constant 
    number(3,2) := 5.5;
    v_valid boolean 
    not null default false;
    --(2)使用
    --
    變量賦值使用等號前加冒號(:=)
    --
    示例2:
    declare
    v_name 
    varchar2(10);
    v_money 
    number(6,2);
    c_tax_rate constant 
    number(3,2) := -0.03;
    v_tax_money 
    number(6,2);
    begin
     
    select user_name,game_money into v_name,v_money 
     
    from user_info where user_id = 100000;
     v_tax_money :
    = v_money*c_tax_rate;
     dbms_output.put_line(
    'name:'||v_name);
     dbms_output.put_line(
    'money:'||v_money);
     dbms_output.put_line(
    'rate:'||v_tax_money);
    end
    --(3)使用%TYPE屬性
    v_name user_info.user_name%TYPE;
    v_money user_info.game_money
    %TYPE;
    c_tax_rate constant 
    number(3,2) := -0.03;
    v_tax_money v_money
    %TYPE;
    --變量v_name,v_money與user_info表的user_name,game_money列的類型和長度完全一致
    --
    變量v_tax_money與變是v_money的類型和長度完全一致

    --2復合變量
    --
    (1)pl/sql記錄(類似于結構)
    --
     在定義部分定義記錄類型和記錄變量,在執行部分引用該記錄變量
    --
     引用記錄成員時必須要加記錄變量作為前綴(記錄變量。記錄成員)
    --
    示例3:
    declare
    TYPE record_type 
    IS RECORD(
      v_name user_info.
    user_name%TYPE,
      v_money user_info.game_money
    %TYPE
    );
    emp_record record_type;
    begin
     
    select user_name,game_money into emp_record 
     
    from user_info where user_id = 100000;
     dbms_output.put_line(
    'name:'||emp_record.v_name);
     dbms_output.put_line(
    'money:'||emp_record.v_money);
    end
    --(2)pl/sql表(類似于數組)
    --
     pl/sql表與數組區別:下標沒有上下限,個數年沒有限制,下票可以為負值
    --
     必須先在定義部分定義pl/sql表類型和pl/sql表變量,在執行部分引用該pl/sql表變量
    --
    示例4:
    declare
    TYPE name_table_type 
    IS TABLE OF user_info.user_name%TYPE 
      
    INDEX BY BINARY_INTEGER;
    v_name name_table_type;
    begin
     
    select user_name into v_name(-1
     
    from user_info where user_id = 100000;
     dbms_output.put_line(
    'name:'||v_name(-1));
    end
    --(3)嵌套表
    --
    (4)VARRAY(變長數組)

    --3 參照變量
    --
     用于存放數值指針的變量。
    --
    (1)游標變量(REF CURSOR)
    --
     靜態游標:需要在定義游標時指定相應的select語句
    --
     示例5:
    declare
      type c1 
    is ref cursor;--c1為ref cursor類型
      emp_cursor c1;--emp_cursor為游標變量
      v_name user_info.user_name%TYPE;
      v_money user_info.game_money
    %TYPE;
    begin
      
    open emp_cursor for --打開游標變量時指定了對應的select語句
      select user_name,game_money from user_info where  user_id = 100000;
      loop
        
    fetch emp_cursor into v_name,v_money;
        
    exit when emp_cursor%notfound;
        dbms_output.put_line(v_name);
      
    end loop;
    end;
    -- 動態游標:在定義游標變量時不要需指定相應的select語句,而是打開游標時指定select語句
    --
    (2)對象類型變量(REF obj_type)
    --
     是指向對象實例的指針
    --
     示例6:
    create or replace type home_type as object(--建立對象類型
      street varchar2(50),city varchar2(20),
      state 
    varchar2(20),zipcode varchar2(6),
      owner 
    varchar2(10)
    );
    create table homes of home_type;--建表
    insert into homes values('上海路100號','上海','200000','junly');
    commit;
    --對象表homes存放家庭地址及戶主姓名,如每個家庭有四口人,為了同一家庭成員共享家庭地址,
    --
    可使用REF引用home_type對象類型,從而降低占用空間。
    create table person(
      id 
    number(6primary key,
      name 
    varchar2(10),
      addr ref home_type
    );
    insert into person select 1,'junly',ref(p) from homes p where p.owner='junly'
    insert into person select 2,'junl2',ref(p) from homes p where p.owner='junly'
    --person表插入數據時,addr列將存入指向homes表相應數據的地址指針

    --4 LOB變量
    /*用于存儲大批量數據的變量
    (1)內部LOB
     CLOB    支技事務操作   存儲數據庫中   用于存儲大批量字符數據
     BLOB    支技事務操作   存儲數據庫中   用于存儲大批量二進制數據
     NCLOB   支技事務操作   存儲數據庫中   用于存儲大批量字符數據
    (2)外部LOB
     BFILE   不支技事務     存在OS文件中   存儲指向OS文件的指針
    */


    --5非PL/SQL變量
    posted @ 2010-07-28 12:01 junly 閱讀(1106) | 評論 (0)編輯 收藏
    1

    table:citys
    city       ran

    廣州     A
    廣州     B
    廣州     C
    廣州     D

    city        ran

    廣州     A,B,C,D

    請問oracle  的sql語句要怎么寫?

    select city,wmsys.wm_concat(ran)
    from citys
    group by city


    2 備忘

    insert into emp (id,name,sex,tim) --dual
    values(id_seq.nextval,'junly',default,to_date('2010-5-11 11:25:00','yyyy-mm-dd hh24:mi:ss'))


    3 直接裝載

    --直接裝載方式
    insert /*+append*/ into emp (field1,field2,field3)
    select f1,f2,f3 from tep
    where f4=20;


    4 更新

    --更新
    update emp set (field1,field2,field3)=(
    select f1,f2,f3 from tep where f4=20)
    where field4=100;

    5 取消重復
    select count(distinct user_nameas num
    from user_info

    6 group by + rollup 橫向小計
    -- group by + rollup 橫向小計
    select num1,sum(num2),sum(num3) from tmp_tb
    group by rollup (num1)

    7 group by + cube  縱向小計
    -- group by + cube  縱向小計
    select num1,sum(num2),sum(num3) from tmp_tb
    group by cube(num1)

    8 自連接
    -- 自連接
    /* user_info
    id    name    pid
    -------------------
    7888  king    
    7889  blank   7888
    7900  jones   7888
    */

    select manager.name from user_info manager,user_info worker
    where manager.id=worker.pid
    and worker.name='jones';
    ----------
    king

    9 ALL和ANY(不能單獨使用,與單行比較符[=,>,<,>=,<=,<>]結合使用)
    --ALL和ANY(不能單獨使用,與單行比較符[=,>,<,>=,<=,<>]結合使用)
    /*
    ALL 必須要符合子查詢結果的所有值
    ANY 只要符合子查詢結果的任一個值即可
    */

    select user_name,money from user_info where money >all(
    select money form user_game where id=10);
    select user_name,money from user_info where money >any(
    select money form user_game where id>10);

    10 合并查詢
    --(1)union 取兩個結果集的并集,自動去掉重復行并以第一列的結果排序
    --
    (2)union all 取兩個結果集的并集,不去重復行也不進行排序
    --
    (3)intersect 取兩個結果集的交集
    --
    (4)minus 取兩個結果集的差集
    select uname,sal from emp where sal>200
    union 
    select uname,sal from emp where job='aaa'

    11 case條件分支
    select name,case when money>3000 then 3
    when money>2000 then 2 when money>1000 then 1 end
    from user_info where user_id=10000;

    12 with子名重用子查詢
    --with子名重用子查詢
    with summary as (
    select name,sum(moneyas total from user_info
    group by name
    )
    select name,total from summary 
    where total>3000;

    13 connect by (感謝廣州Nicholas兄)
    select sysdate - rownum rn from dual connect by rownum<100
    --
    select to_number(to_char(rn,'yyyymmdd'))rn from(select sysdate - rownum rn 
    from dual connect by rownum<(
    select floor(sysdate-regist_time)from sales_info where user_id=15587657))
    --月份
    select to_number(to_char(rn,'yyyymm'))rn from(
    select add_months(sysdate,-rownum) rn 
    from dual connect by rownum<(
    select floor(months_between(sysdate,regist_time)) from sales_info where user_id=15587657))

    14 批理修改
    merge into sales_info s 
    using tb_rd_user_info u
    on (s.user_id=u.user_id)
    when matched then
    update
    set s.user_name=u.user_name;
    commit;

    15 刪除重復記錄
    delete from user where rowid in (
    select max(rowid) from user group by userName having count(userName)>1)
    posted @ 2010-07-28 09:46 junly 閱讀(383) | 評論 (0)編輯 收藏
    --例1
    declare
    v_name 
    varchar2(10);
    begin 
     
    select user_name into v_name from tb_rd_user_info where user_name='ywj12';
     dbms_output.put_line(
    'name:'||v_name);
    exception
     
    when no_data_found then
     dbms_output.put_line(
    'error name');
    end;

    --匿名塊
    --
      沒有名稱的pl/sql塊,如例1
    --
    命名塊
    --
    子程序
    --
      (1)過程
    --
         建立過程時可以指定輸入參數(in),輸出參數(out)
    create or replace procedure update_money(uname varchar2,num number)
    is
    begin
    update tb_rd_user_info set game_money = num 
    where user_name = uname;
    end update_money;
    --     刪除
    drop   procedure   update_money;
    --     調用
    exec update_money('ywj123',100000);
    call update_money(
    'ywj123',100000);
    --     重新編譯
    alter procedure update_money compile;
    --     授權student用戶使用該過程
    grant execute on update_money to student;  
    --  (2)函數
    --
         創建
    create or replace function get_user_id(uname varchar2)
    return number is
      uid 
    number;
    begin
     
    select user_id into uid from tb_rd_user_info 
     
    where user_name=uname;
     
    return uid;
    end;
    --     調用
    var rs number
    call get_user_id(
    'ywj123'into :rs;
    --     刪除
    drop function get_user_id;
    --     重新編譯
    alter function get_user_id compile;
    --  (3)包
    --
         創建(包由包規范和包體兩部分組成)
    --
           包規范
    create package emp_pkg is
      
    procedure update_money (uname varchar2,num number);
      
    function get_user_id(uname varchar2return number;
    end;
    --       包體
    create package body emp_pkg is
      
    procedure update_money(uname varchar2,num number)
      
    is
      
    begin
        
    update tb_rd_user_info set game_money = num 
        
    where user_name = uname;
      
    end update_money;
      
      
    function get_user_id(uname varchar2)
      
    return number is
        uid 
    number;
      
    begin
        
    select user_id into uid from tb_rd_user_info 
        
    where user_name=uname;
        
    return uid;
      
    end;
    end;
    --     調用
    call emp_pkg.update_money('ywj123',100000);
    var rs number
    call emp_pkg.get_user_id(
    'ywj123'into :rs;

    --解發器

    存儲過程參數傳遞

    參數的作用是向存儲過程傳遞數據,或從存儲過程獲得返回結果。正確的使用參數可以大大增加存儲過程的靈活性和通用性。
    參數的類型有三種,如下所示。

    參數的定義形式和作用如下:
    參數名 IN 數據類型 DEFAULT 值;
    定義一個輸入參數變量,用于傳遞參數給存儲過程。在調用存儲過程時,主程序的實際參數可以是常量、有值變量或表達式等。DEFAULT 關鍵字為可選項,用來設定參數的默認值。如果在調用存儲過程時不指明參數,則參數變量取默認值。在存儲過程中,輸入變量接收主程序傳遞的值,但不能對其進行賦值。
    參數名 OUT 數據類型;
    定義一個輸出參數變量,用于從存儲過程獲取數據,即變量從存儲過程中返回值給主程序。
    在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。在存儲過程中,參數變量只能被賦值而不能將其用于賦值,在存儲過程中必須給輸出變量至少賦值一次。
    參數名 IN OUT 數據類型 DEFAULT 值;
    定義一個輸入、輸出參數變量,兼有以上兩者的功能。在調用存儲過程時,主程序的實際參數只能是一個變量,而不能是常量或表達式。DEFAULT 關鍵字為可選項,用來設定參數的默認值。在存儲過程中,變量接收主程序傳遞的值,同時可以參加賦值運算,也可以對其進行賦值。在存儲過程中必須給變量至少賦值一次。
    如果省略IN、OUT或IN OUT,則默認模式是IN。 
    CREATE OR REPLACE PROCEDURE CHANGE_SALARY(P_EMPNO IN NUMBER DEFAULT 7788,P_RAISE NUMBER DEFAULT 10)
            
    AS
             V_ENAME 
    VARCHAR2(10);
    V_SAL 
    NUMBER(5);
            
    BEGIN
             
    SELECT ENAME,SAL INTO V_ENAME,V_SAL FROM EMP WHERE EMPNO=P_EMPNO;
             
    UPDATE EMP SET SAL=SAL+P_RAISE WHERE EMPNO=P_EMPNO;
             DBMS_OUTPUT.PUT_LINE(
    '雇員'||V_ENAME||'的工資被改為'||TO_CHAR(V_SAL+P_RAISE));
    COMMIT;
            EXCEPTION
             
    WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(
    '發生錯誤,修改失敗!');
             
    ROLLBACK;
            
    END;
    參數的值由調用者傳遞,傳遞的參數的個數、類型和順序應該和定義的一致。如果順序不一致,可以采用以下調用方法。如上例,執行語句可以改為:
     EXECUTE CHANGE_SALARY(P_RAISE=>80,P_EMPNO=>7788);
      可以看出傳遞參數的順序發生了變化,并且明確指出了參數名和要傳遞的值,=>運算符左側是參數名,右側是參數表達式,這種賦值方法的意義較清楚。
    posted @ 2010-07-26 18:20 junly 閱讀(734) | 評論 (0)編輯 收藏
    最近一直被內存溢出捆擾,現在對這幾天的工作做個小小的總結!另外給首次與到此類問題的小鳥們作個提示,希望大家早日變成老鳥!

    1 首先確認是不是內存溢出,如果直接報OutOfMemoryException,那肯定是內存溢出,有時可能沒有發現這個錯誤,但WEB服務到最后還是掛了,也有可能是由Memory Out,如何確認,最好的辦法就是查看gc日志。

    2 如果確認是內存溢出,不要急著跟蹤,因為要找到確切位置還是有一定困難的,個人建議對最近修改的代碼作一次全面檢查,對于有可能出現內存溢出的地方作些修改。
    可能出現的原因:
    (1) 遞歸、循環,這里要注意隱性的地筆,如攔載器,我自已遇到一次攔載器的死循環
    (2) static 的對象,查看static里面是不是有大量的對象塞進去
    (3)Set/List/Map對象,查看Set/List/Map里面是不是有對象用完了沒有釋放
    (4)session/application,查看session里的對象、過期時間等,看是不是無法即時釋放
    (5)ClassLoader,Java ClassLoader結構的使用為內存泄漏提供了許多可乘之機。這個我不知道深層原因,有知道的可以告訴我,將不勝感謝!
    (6)String,字符串累加也容易出現溢出。一般順序StringBuilder,StringBuffer,String。
    (7)全局變量,盡量不使用,使用了即時釋放
    修改后再查看日志,也許問題已經解決了。

    3 如果還是有溢出就只能上工具了,我使用的是JProfiler,功能很強大,首先我在window上遠程監控linux,結果失敗,原因是因為JProfiler本身就有很大的消耗,而且在測試中還要不斷gc,影響生產,所以選用在測試環境中配合jmeter測試。

    4 測試方法:循環測試,查看gc后是否有對象數量不斷增加,即有對象未釋放。

    5 其此是要了解java內存分配原理和gc的工作原理,這樣才可以定位到問題的具體位置。

    6 對jvm進行優化。




    具體操作未詳細說明,可以參考相關資料

    java內存泄漏原因 http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/

    gc原理http://chenchendefeng.javaeye.com/blog/455883

    jvm優化http://www.cjsdn.net/post/view?bid=1&id=197954

    JVM調優-解決native heap持續增長 http://sw1982.javaeye.com/blog/724626 薦



    posted @ 2010-07-22 11:11 junly 閱讀(2191) | 評論 (1)編輯 收藏

    在開始動手之前,我一般習慣整體盤算一遍,這樣感覺下起手來,比較順. 只是有時盤算的過于細致,往往會被某個小細節拖住步子. 所以這個時候,老大總會叫我move on,先把架子搭起來,如果什么都考慮,那么永遠也無法前進.
    做了一些東西之后,真的發現這個理想中成立實際中困難的理論. 設想,最好把目光放在方向上.
           先感嘆一下.

           404錯誤頁出現這個問題,我在web.xml定義了如下的定義,
        <error-page>
        <error-code>404</error-code>
        <location>/error_404.htm</location>
      </error-page>
        路徑的是對的,奇怪的是我測試時輸入一個不存在的頁,出現404錯誤提示出現的卻不是我所定義的頁面,這就怪了.我記得在weblogic中我也是這樣定義的,所以我首先想到的時服務器的問題. 只是這種問題,不要分析,我試著在javaworld發了一貼,問了一下. 二樓給了一個鏈接, 我進去才發現這個問題已經有很多人在討論了.這是實際出問題,要是一直照著課本,應該不會想到這些問題,只是自己實際操作的才發現這些.

    通看了所有的帖子,出現這種問題,主要有以下幾個因素:
    1.使用 tomcat 服務器
    2.tomcat服務器版本
    3.瀏覽器問題
    4.IE的設置
    5.錯誤頁本身的大小

    第一點,我想我的經歷應該可以算個證明.

    第二點.很多人用tomcat5.5可以順利的找到錯誤頁

    第三點.換了一下FF,可以順利找到指定的錯誤頁

    第四點.我設置了 工具-->Internet選項-->高級--->顯示http友好錯誤信息(取消選擇) ,可以順利定向到指定錯誤頁,
               說明可以

    第五點,我試著發狠輸了一大堆東西進去, 指定錯誤頁順利出現了.


    下面是提供的解決方法:

    1.升級tomcat (換成其它服務器,代價沉重)
    2.ie 設定   工具-->Internet選項-->高級--->顯示http友好錯誤信息(取消選擇) ,
    3. 把錯誤頁做大一點,具體幾個字節,沒測試,估計三四百足夠了, (加一個div塊,display設為none就可以了)
    4.設置指定錯誤頁頁狀態為正確,騙過IE的自定義錯誤頁 方法
    <%
        response.setStatus(200); // 200 = HttpServletResponse.SC_OK
    %>

     

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/leniz/archive/2006/01/18/582765.aspx

    感謝這位仁兄
    posted @ 2010-06-24 10:19 junly 閱讀(3506) | 評論 (0)編輯 收藏

    當用戶從表單處完成遞交,如無問題已將注冊信息寫入數據庫,但有問題的是,如何防止用戶刷新頁面,這相當于將原有的信息再次寫入數據庫,在網絡上尋找解決方法,試用后將本人認為最管用的方法記下。

    網絡中給出如下解決方式:

    第一種:禁用提交按鈕

    當用戶提交表單后,使用JAVASCRIPT腳本語言,將提交鈕禁用。

    分析:如客戶端沒有開啟腳本功能就出現問題;這也僅是在表單處理前有用,防止用戶多次點擊提交鈕;現在很多網站都啟用驗證碼解決此問題了。

    第二種:使用 Session

    在第一次寫入數據庫代碼后,將Session標記;在數據庫代碼前判斷Session是否曾經標記過并與剛才的標記是否相等。

    代碼:

    Session("User") = True

       Response.write "您剛才已經注冊過了……"
    Else

       ...... '省略寫入數據庫部分

       Session("User") = True

    End if

    分析:比較管用的;但Session默認時效為20分鐘,雖然可以設置時效長度,但由于網站服務器設置不同,也許達不到理想效果。

    第三種:重新定向

    注冊完畢后直接將網頁重新定向到其他頁面。

    代碼:Response.Redirect "Index.html"

    分析:使用此方法,需要配合客戶端腳本清除歷史(history)才行,沒有試用,因為用戶可以使用后退按鈕,繼續刷新。

    第四種:禁止緩存

    在寫入數據一頁最下邊添加下面的代碼,然后導向新頁,可以使用戶點擊后退按鈕后,頁面提示網頁過期。

    代碼:

    ASP:
    Response.Buffer = True   
    Response.ExpiresAbsolute = Now() - 1   
    Response.Expires = 0   
    Response.CacheControl = "no-cache"

    ASP.NET:
    Response.Buffer=true;
    Response.ExpiresAbsolute=DateTime.Now.AddSeconds(-1);
    Response.Expires=0;
    Response.CacheControl="no-cache";

    分析:試用后,發現一個問題,雖然表面看到網頁過期字樣,但在過期網頁上刷新,仍可以再次刷新多次注冊。

    第五種:用彈出窗口

    提交表單的時候彈出新窗口(在新窗口頁面完成數據庫的寫入),關閉本窗口。對于window.open()打開的窗口是無法用后退按鈕的。

    第六種:調數據庫進行對比

    這一種是得不償失的方法,因為會加重服務器的負擔,如果在表單沒有進行AJAX方式的驗證,這也算是一種必要的方法。

    代碼:(假設已連接數據庫)

    Dim Rs,SQL,UserId

    UserId = Request("Userid") '從表單從取數據內容

    If UserId <> "" then '不為空的時候
    Set Rs=Server.CreateObject("Adodb.Recordset")
       SQL = "Select Userid From 表 Where Userid='"& UserId &"'"
       Rs.Open Sql, Conn, 2, 2
      
    If Rs.Eof And Rs.Bof Then
       Response.Write "沒有相同數據!"
    Else
       Response.Write "有相同數據!"
    End If

       Rs.Close
       Set Rs = Nothing
       Response.End
    End If

     

    經過測試,如果不想太費事,直接用第六種方法,用戶刷一次就對數據庫檢索一次,這種方式最大的弊端就是有可能把服務器累死;

    由于,我采用了第二種方法,結合了第四種(效果不大),在代碼最前端加入了驗證由何處來本站的函數,這樣可以防止用戶自己在本機模仿網站表單提交數據(hi.baidu.com/76512/blog/item/b8d9be8f168d3aedf01f3680.html),也可以防止用戶在本站直接在網址末端加變量值刷新數據。

    由于在表單處已加入隨機驗證碼,并已寫入Session中,在處理數據前,可以先檢測Session是否為空,空為已提交過了,不為空是第一次提交,在第一次提交后將該Session清空。

    代碼:

    If Session("RndNum") = ""
       Response.Write "已提交過數據了呀!"
    Else

    ...... '省略寫入數據庫代碼

       Session("RndNum") = ""
    End if

    分析:只要是從正常的途徑遞交的表單,Session("RndNum")的數值不會為空的,從非正常途徑(比如說,直接打開網址,或在本機模擬表單遞交,或在網址后添加變量值,是無法寫入數據庫的。Session默認的20分鐘,清空后仍然符合邏輯。也不怕用戶打開幾個注冊頁面,來回刷新注冊。




    禁用頁面緩存的幾種方法(靜態和動態)
    1、在Asp頁面首部<head>加入   
    以下是引用片段:
      Response.Buffer   =   True   
      Response.ExpiresAbsolute   =   Now()   -   1   
      Response.Expires   =   0   
      Response.CacheControl   =   "no-cache"   
      Response.AddHeader   "Pragma",   "No-Cache"  

      2、在HtML代碼中加入   
    以下是引用片段:
      <HEAD>   
      <META   HTTP-EQUIV="Pragma"   CONTENT="no-cache">   
      <META   HTTP-EQUIV="Cache-Control"   CONTENT="no-cache">   
      <META   HTTP-EQUIV="Expires"   CONTENT="0">   
      </HEAD>  
     
        
      3、在重新調用原頁面的時候在給頁面傳一個參數   Href="****.asp?random()" 

      前兩個方法據說有時會失效,而第三種則是在跳轉時傳一個隨機的參數! 因為aspx的緩存是與參數相關的,如果參數不同就不會使用緩存,而會重新生成頁面,每次都傳一個隨機的參數就可以避免使用緩存。這個僅適用于asp&asp.net

      4、在jsp頁面中可使用如下代碼實現無緩存:

    以下是引用片段:
    response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
    response.setHeader("Pragma","no-cache"); //HTTP 1.0
    response.setDateHeader ("Expires", 0); //prevents caching at the proxy server

      這些代碼加在<head> </head>中間具體如下

    以下是引用片段:
    <head>
    <%
    response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
    response.setHeader("Pragma","no-cache"); //HTTP 1.0
    response.setDateHeader ("Expires", 0); //prevents caching at the proxy server
    %>
    </head>

      5、window.location.replace("WebForm1.aspx");  
      參數就是你要覆蓋的頁面,replace的原理就是用當前頁面替換掉replace參數指定的頁面。   
    這樣可以防止用戶點擊back鍵。使用的是javascript腳本,舉例如下:

      a.html

    以下是引用片段:
    <html>
        <head>
            <title>a</title>     
            <script language="javascript">
                function jump(){
                    window.location.replace("b.html");
                }
            </script>
        </head>
        <body>
           <a href="javascript:jump()">b</a>
       </body>
    </html>  

      b.html

    以下是引用片段:
    <html>
        <head>
            <title>b</title>     
            <script language="javascript">
                function jump(){
                    window.location.replace("a.html");
                }
            </script>
        </head>
        <body>
           <a href="javascript:jump()">a</a>
       </body>
    </html>  

      前4種只是清空了cache,即存儲在Temporary Internet Files文件夾中的臨時文件,而第五種則是使用跳轉頁面文件替換當前頁面文件,并沒有清空cache,也就是說Temporary Internet Files產生了相關的臨時文件,兩者搭配使用真是清空緩存,必備良藥。


     

    posted @ 2010-06-21 17:33 junly 閱讀(2652) | 評論 (1)編輯 收藏
    request.getRequestURI() /jqueryWeb/resources/request.jsp
    request.getRequestURL() http://localhost:8080/jqueryWeb/resources/request.jsp
    request.getContextPath()/jqueryWeb
    request.getServletPath()/resources/request.jsp


    注: resources為WebContext下的目錄名
    jqueryWeb 為工程名

    -----------------------------------------------------
    <%=request.getRequestURI() %><br/>
    <%=request.getRequestURL() %><br/>
    <%=request.getContextPath()%><br/>
    <%=request.getServletPath() %><br/>
    <%=request.getPathInfo() %><br/>
    結果:
    /test-struts.jsp
    http://127.0.0.1:8080/test-struts.jsp

    /test-struts.jsp
    null

    配置:
    <action name="test" class="testStrutsAction" method="test"> 
       <result>/test-struts.jsp</result>
    </action>

    posted @ 2010-06-09 20:31 junly 閱讀(2215) | 評論 (0)編輯 收藏
    13:35:42,129  INFO EncryptLocalSessionFactoryBean:742 - Building new Hibernate SessionFactory
    13:35:42,145  INFO XmlConfigurationProvider:380 - Unable to verify action class [faqAction] exists at initialization
    13:35:42,254  INFO Configuration:332 - Reading mappings from file: D:\opt\ASF\Tomcat6.0\webapps\cityunion\WEB-INF\classes\com\c6\orm\model\bull\BullInfo.hbm.xml
    13:35:42,442  INFO HbmBinder:322 - Mapping class: com.c6.orm.model.bull.BullInfo -> TB_BULL_INFO
    13:35:42,442  INFO Configuration:332 - Reading mappings from file: D:\opt\ASF\Tomcat6.0\webapps\cityunion\WEB-INF\classes\com\c6\orm\model\coin\CardInfo.hbm.xml
    13:35:42,457  INFO HbmBinder:322 - Mapping class: com.c6.orm.model.coin.CardInfo -> TB_CARD_INFO
    13:35:42,473  INFO Configuration:332 - Reading mappings from file: D:\opt\ASF\Tomcat6.0\webapps\cityunion\WEB-INF\classes\com\c6\orm\model\coin\Payment.hbm.xml
    13:35:42,489  INFO HbmBinder:322 - Mapping class: com.c6.orm.model.coin.Payment -> TB_PAYMENT
    13:35:42,489  INFO Configuration:332 - Reading mappings from file: D:\opt\ASF\Tomcat6.0\webapps\cityunion\WEB-INF\classes\com\c6\orm\model\coin\TbBankExchangeLog.hbm.xml
    。。。。。。。。。。。。

    描述:提示信息Unable to verify action class  exists at initialization
                不停的加載.hbm.xml文件,導致tomcat無法啟動。
    被提示信息誤導,在網上找了大量資料,都沒有解決。原來由于自已不小心寫錯了配置文件
    <property name="slaveSelfTotal" type="int" column="SLAVE_SELF_TOTAL"/>
    <property name="slaveSelfTotal" type="int" column="SLAVE_SELF_TOTAL"/>
    寫了兩次。
    出現些問題大多是因為配置文件出錯而引起的,仔細查看最近修改的置配文件就找到問題了
    posted @ 2010-05-27 13:49 junly 閱讀(1813) | 評論 (0)編輯 收藏
         摘要: 獲取一組radio被選中項的值 var item = $('input[@name=items][@checked]').val(); 獲取select被選中項的文本 var item = $("select[@name=items] option[@selected]").text(); select下拉框的第二個元素為當前選中值 $('#select_id')[0].selected...  閱讀全文
    posted @ 2010-05-11 09:31 junly 閱讀(22176) | 評論 (2)編輯 收藏
    僅列出標題
    共18頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 亚洲成人黄色在线| 亚洲综合无码精品一区二区三区 | 久久国产精品一区免费下载| 亚洲日本中文字幕天天更新| 日木av无码专区亚洲av毛片| 特级精品毛片免费观看| 一级做a爱过程免费视| 国产成人精品久久亚洲高清不卡 | 国产h视频在线观看网站免费| 色www永久免费| 亚洲电影免费在线观看| 亚洲精品专区在线观看| 日韩成人免费aa在线看| 一级人做人爰a全过程免费视频| 亚洲色成人WWW永久在线观看 | 在线观看亚洲网站| 2021精品国产品免费观看| 亚洲国产精品线观看不卡| 亚洲区小说区激情区图片区| 桃子视频在线观看高清免费视频| a级毛片免费网站| 久久久久亚洲av无码专区| 亚洲无人区一区二区三区| 亚洲乱码中文字幕手机在线 | 久久亚洲综合色一区二区三区| 亚洲成av人片一区二区三区| 日韩免费一级毛片| 午夜高清免费在线观看| 国产在线观看片a免费观看| AV无码免费永久在线观看| 精品福利一区二区三区免费视频| 国产产在线精品亚洲AAVV| 亚洲国产成人久久综合| 国产亚洲精品岁国产微拍精品| 浮力影院亚洲国产第一页| 毛片视频免费观看| jizz免费观看| 免费人人潮人人爽一区二区| 国产成人亚洲精品播放器下载| 精品久久久久久亚洲综合网| 国产成人综合亚洲一区|