PL/SQL學習筆記[3]-常用函數

1、常用數字函數

-- abs(n) : 返回n的絕對值
-- ceil(n) : 返回大於等於數字n的最小整數
-- floor(n) : 返回小於等於數字n的最大整數
-- mod(m,n) : 取m/n的餘數
-- power(m,n) : 返回m的n次冪
-- round(n[,m]) : 執行四捨五入運算;省略m,則四捨五入到整數位;m爲負,四捨五入到小數點前m位;m爲正,四捨五入到小數點後m位
-- trunc(n[,m]) : 截取數字。省略m,數字n去掉小數部分;m爲負,數字n截取小數點前m位;m爲正,數字n截取小數點後m位

SELECT   ABS (-12),                                                      -- 12
         CEIL (12.4),                                                    -- 13
         FLOOR (12.9),                                                   -- 12
         MOD (100, 3),                                                    -- 1
         POWER (2, 3),                                                    -- 8
         ROUND (12.4),                                                   -- 12
         ROUND (12.5),                                                   -- 13
         ROUND (12.09, -1),                                              -- 10
         ROUND (12.09, 1),                                             -- 12.1
         TRUNC (30.3),                                                   -- 30
         TRUNC (20.358899, 3),                                       -- 20.358
         TRUNC (28.3565, -1)                                             -- 20
  FROM   DUAL;
 

2、常用字符函數

-- 常用字符函數
-- ascii(char) : char字符的ascii碼
-- chr(n) : 將ascii碼值n轉換成字符
-- concat(str1,str2) : 連接str1\str2爲一個字符串。相當於連接符(||)
-- initcap(char) : 將字符串中的每個單詞首字母大寫,其他字符小寫
-- instr(char1,char2[,n[,m]]) : 獲取子串char2在字符串char1中的位置。n爲其實搜索位置,m爲子串出現的次數。n爲負,則從尾部開始搜索;n\m默認爲1
-- length(char) : 返回字符串的長度。如果char = null則返回null
-- lower(char) : 返回char的小寫格式
-- upper(char) : 返回char的大寫格式
-- lpad(char1,n,char2) : 在字符串char1的左端填充字符串char2直到長度達到n;char2默認爲空格,如果char1.length>n,則返回char1左端的n個字符
-- rpad(char1,n,char2) : 在字符串char1的右端填充字符串char2直到長度達到n;char2默認爲空格,如果char1.length>n,則返回char1左端的n個字符
-- ltrim(char1[,set]) : 去掉字符串char1左端包含的set中的任意字符。
-- rtrim(char1[,set]) : 去掉字符串char1右端包含的set中的任意字符。
-- nls_initcap(char,'nls_param') : 同initcap,但這裏的char用於指定NCHAR或者NVARCHAR2類型字符串;nls_param的格式爲 nls_sort=sort,用於指定特定語言特徵
-- nls_lower(char,'nls_param') : 同lower,參數同nls_initcap
-- nls_upper(char,'nls_param') : 同upper,參數同nls_initcap
-- replace(char,search_str[,replacement_str]) : 將字符串char中的子串search_str替換成replacement_str;如果search_str=null,返回char;如果replacement_str=null,則會去掉char中的search_str
-- soundex(char) : 返回字符串char的語音表示,使用該函數可比較發印相同的字符串
-- substr(char,m[,n]) : 獲取char的子字符串。m爲字符起始位置,n爲子串長度。m爲0,從首字符開始;m爲負從尾部開始
-- trim(char|char From string) : 從字符串的頭尾或者兩端截斷特定字符。
-- translate(string,from_str,to_str) 將string按照from_str與to_str的對應關係進行轉換

SELECT   ASCII ('a'),                                         -- 字符的assii碼
         CHR (68),                                           -- 數字對應的字符
         CONCAT ('a', 'cd'),                                     -- 字符串連接
         ('a' || 'cd'),                                          -- 字符串連接
         INITCAP ('ok abc'),                                 -- 單詞首字母大寫
         INSTR ('abccdcdc',
                'c',
                1,
                2),
         LENGTH (NULL),                                        -- 字符串的長度
         LENGTH ('abc'),
         LOWER ('ABCD'),                                         -- 小寫字符串
         UPPER ('abcd'),                                         -- 大寫字符串
         LPAD ('ac', 6, '$'),      -- 在字符串前面填補$字段直到字符串長度達到6
         LPAD ('accc', 2, '$'),
         RPAD ('ac', 4, '*'),      -- 在字符串後面填補*字段直到字符串長度達到4
         RPAD ('acccc', 4, '*'),
         LTRIM ('1234', '1'),                   -- 去掉字符串最左邊爲'1'的字符
         LTRIM ('1234', '23'),
         RTRIM ('1234', '234'),               -- 去掉字符串最右邊爲'234'的字符
         RTRIM ('1234', '23'),
         NLS_INITCAP (n'ok abc'),                            -- 單詞首字母大寫
         NLS_LOWER (n'SQL'),                                       -- 單詞小寫
         REPLACE ('abc', 'b', '123'),                            -- 字符串替換
         REPLACE ('abc', 'b'),
         REPLACE ('', 'b'),
         SOUNDEX ('lawer'),                              -- 返回字符串語音表示
         SOUNDEX ('lier'),
         SOUNDEX ('ok'),
         SUBSTR ('hello', 2, 2),            -- 子字符串 substr(str,offset,len)
         SUBSTR ('hello', 2),
         SUBSTR ('hello', -2),
         SUBSTR ('hello', -3, 2),
         TRANSLATE ('234abcd', '12345abcde', 'ahellojack'),
         '  adc',
         TRIM ('  adc '),                                -- 去除字符串兩端空格
         TRIM ('a' FROM 'aa123ab')                   -- 去除字符串兩端指定字符
  FROM   DUAL;
 

3、常用日期時間函數(一)

SELECT   TO_CHAR (SYSDATE, 'yyyy-MM-dd hh24:mi:ss'),
         ADD_MONTHS (SYSDATE, 2),                          -- 當前時間加兩個月
         CURRENT_DATE,                                             -- 當前日期
         CURRENT_TIMESTAMP,                                    -- 當前日期時間
         DBTIMEZONE,                                               -- 當前時區
         EXTRACT (YEAR FROM SYSDATE) AS year,            -- 獲取from日期的年份
         EXTRACT (MONTH FROM SYSDATE) month,
         EXTRACT (DAY FROM SYSDATE) day,
         FROM_TZ (TIMESTAMP '2011-10-12 21:49:30', '5:00'),
         LAST_DAY (SYSDATE),                     -- 當前日期所在月份的最後一天
         MONTHS_BETWEEN (SYSDATE + 1, SYSDATE) AS 相差月數,
         NEW_TIME (SYSDATE, 'bst', 'est'),       -- bst的時區對應est時區的時間
         NEXT_DAY (SYSDATE, '星期二')              -- 指定日期後的第一個工作日
  FROM   DUAL;
 

4、常用日期時間函數(二)

SELECT   SESSIONTIMEZONE,                              -- 返回當前會話所在時區
         -- numtodsinterval(n,char_expr) 將數字 n 轉換成相應的 char_expr 日期格式
         NUMTODSINTERVAL (60, 'SECOND'),                               -- 60秒
         NUMTODSINTERVAL (60, 'MINUTE'),                             -- 60分鐘
         NUMTODSINTERVAL (60, 'HOUR'),                               -- 60小時
         NUMTODSINTERVAL (60, 'DAY'),                                  -- 60天
         NUMTOYMINTERVAL (60, 'MONTH'),                                -- 60月
         NUMTOYMINTERVAL (60, 'YEAR'),                                 -- 60年
         ROUND (SYSDATE, 'month'),                             -- 四捨五入到月
         SYSDATE,                                              -- 系統日期時間
         SYSTIMESTAMP,                                   -- 系統日期時間及時區
         SYS_EXTRACT_UTC (SYSTIMESTAMP),          --特定時區時間的格林威治時間
         TO_TIMESTAMP ('2012-09', 'yyyy-mm'), -- 將符合特定格式的字符串轉換成timestamp類型
         TO_TIMESTAMP_TZ ('2012-09', 'yyyy-mm'),
         TO_YMINTERVAL ('11-11'), -- 將yyyy-mm/yy-mm格式的字符串轉換成時間格式注意 mm 的取值範圍在0-11
         -- 日期截斷函數
         TRUNC (SYSDATE, 'MONTH'),                                   -- 取到月
         TRUNC (SYSDATE, 'YEAR'),                                    -- 取到年
         TRUNC (SYSDATE, 'mm')
  FROM   DUAL;
 

5、轉換函數

set serveroutput on;

DECLARE
   v_cast   VARCHAR2 (20);
BEGIN
   v_cast := CAST (SYSDATE AS varchar2);           -- 日期格式轉換成字符串格式
   DBMS_OUTPUT.put_line (v_cast);
END;

SELECT   ASCIISTR ('中國'),             -- 返回參數的數據庫字符串的ascii字符串
         BIN_TO_NUM (1, 0),                      -- 返回二進制10表示的十進制數
         CAST ('123' AS number),              -- 將字符串123轉成number類型輸出
         CONVERT ('abc', 'us7ascii', 'we8iso8859p1'), -- 將字符串有編碼us7ascii轉成we8iso8859p1編碼
         TO_CHAR (n'中國'),
         TO_NCHAR ('中國'),
         TO_CHAR (SYSDATE, 'yyyy-mm-dd hh24:mi:ss'),
         TO_CHAR (100, 'L99G999D99MI'),       -- 將數字100轉換成人民幣式字符串
         TO_CLOB ('abc'),                            -- 將字符串轉化成clob類型
         TO_DATE ('2000-12-23', 'yyyy-mm-dd'), -- 將字符日期格式轉化成日期格式
         TO_NUMBER ('¥100', 'L99999D99')
  FROM   DUAL;
 

6、其他單行函數

SELECT   id, money, DECODE (id, 1, money * 10, 2, money * 20, money)
  FROM   customer;

-- coalesce(expr1[,expr2][,expr3]..) : 返回第一個不爲null的表達式結果

SELECT   COALESCE (NULL, NULL, 'ab') FROM DUAL;

-- dump(expr,return_frm) : 返回表達式所對應的數據類型代碼、長度及內部表示格式

SELECT   DUMP ('abc', '1016') FROM DUAL;

-- empty_blob() : 初始化blob變量或字段
-- empty_clob() : 初始化clob變量或字段

-- 更新clob字段content爲 empty_clob() 注意content = empty_clob() 與 content = null是不同的
UPDATE   yt_uniform_information
   SET   content = EMPTY_CLOB ()
 WHERE   key_id = 20;
 
-- greatest(expr1[,expr2]...) : 返回表達式中值最大的一個
-- least(expr1[,expr2]...) : 返回表達式中值最小的一個
-- nls_charset_id(text) : 返回字符集的id號
-- nls_charset_name(number) : 返回特定ID號所對應的字符集名
-- nls_charset_decl_len(byte_count,charset[id]) : 返回字節數在特定字符集中佔用的字符個數
-- nullif(expr1,expr2) : expr1 = expr2 返回 null ; 否則返回expr1。可用在字段上
-- nvl(expr1,expr2) : expr1 = null 返回 expr2 否則返回expr1
-- nvl2(expr1,expr2,expr3) : expr1 != null 返回 expr2; expr1 = null 返回 expr3;參數expr1爲任意數據類型,而expr2\expr3爲long外之外
-- sys_context('context','attribute') : 返回上下文特定屬性值。context爲應用上下文名 attribute爲指定屬性名
-- uid : 當前會話對應的用戶ID號
-- user : 當前會話對應數據庫用戶名
-- userenv(parameter) : 返回當前上下文的屬性信息。paramer = isdba|language|terminal|client_info
-- vsize(expr) : oracle內部存儲expr的實際字節數.只能在SQL語句中使用

SELECT   GREATEST (1,
                   2,
                   4,
                   4,
                   10),
         LEAST (1,
                2,
                4,
                4,
                10),
         NULLIF ('abc', 'abc'),
         NVL (100, 23),
         SYS_CONTEXT ('userenv', 'os_user') "OS用戶",
         SYS_CONTEXT ('userenv', 'session_user') "數據庫用戶",
         UID,
         USER,
         USERENV ('isdba'),                                 -- 是否具有DBA權限
         USERENV ('language'),                     -- 當前會話語言地區和字符集
         USERENV ('terminal'),                   -- 當期會話所在終端的OS標識符
         USERENV ('client_info'), -- 返回有包dbms_application_info所存儲的用戶會話信息(最長64字節)
         VSIZE ('ad')
  FROM   DUAL;
 
-- sys_dburigen(colname) :根據列或者屬性生成類型爲DBUriType的URL
-- sys_xmlgen(expr[,fmt]) : 根據數據庫表的行和列生成一個XMLType實例
-- sys_xmlagg(expr[,fmt]) : 彙總所有xml文檔,並生成一個xml文檔(用於可分組的數據列中(一對多))
-- xmlelement(identifier[,xml_attribute_clause][,value_expr] : 返回XMLType實例.identifier必選,指定元素名,xml_attribute_clause可選,指定元素屬性子句,value_expr可選,指定元素值
-- xmlcolattval(value_expr1[,value_expr2]...) : 生成XML塊,並增加column做爲屬性名
-- xmlconcat(XMLType_instance1[,XMLType_instance2]...) : 連接多個XMLType實例,並生成一個新的XMLType實例
-- xmlforest(value_expr1[,value_expr2]...) : 返回XML塊
-- xmlsequence(XMLType_instance) : 返回XMLType實例中頂級節點一下的 VARRAY 元素

SELECT   name,
         SYS_DBURIGEN (name),
         SYS_XMLGEN (name),
         XMLELEMENT (id, name, money),                   -- <id>namemoney</id>
         XMLCOLATTVAL (name),         -- <column name = "NAME">leeyee</column>
         XMLCOLATTVAL (name, money), -- <column name = "NAME">leeyee</column><column name = "MONEY">12.23</column>
         XMLELEMENT ("customer", XMLCOLATTVAL (id, name, money)),
         XMLCONCAT (XMLELEMENT (id, name), XMLELEMENT (money, money)),
         XMLFOREST (name, money),
         XMLSEQUENCE (
            XMLELEMENT ("customer", XMLCOLATTVAL (id, name, money))
         )
  FROM   customer a;
 
-- sys_xmlagg(expr[,fmt]) : 彙總所有xml文檔,並生成一個xml文檔
-- xmlagg(XMLType_instance[ORDER BY sor_list]) : 彙總多個XML塊,生成XML文檔。

SELECT   SYS_XMLAGG (SYS_XMLGEN (name)), XMLAGG (XMLELEMENT (name, name))
  FROM   yt_site_function_menu
 WHERE   function = 3;
 
CREATE TABLE xml_tables OF XMLTYPE;

INSERT INTO xml_tables
  VALUES   (
               xmltype('<address>
    <province name="北京市">
        <city name="北京轄區">
            <country name="東城區" />
            <country name="西城區" />
            <country name="崇文區" />
            <country name="宣武區" />
            <country name="朝陽區" />
            <country name="豐臺區" />
            <country name="石景山區" />
            <country name="海淀區" />
            <country name="門頭溝區" />
            <country name="房山區" />
            <country name="通州區" />
            <country name="順義區" />
            <country name="昌平區" />
            <country name="大興區" />
            <country name="懷柔區" />
            <country name="平谷區" />
        </city>
        <city name="北京轄縣">
            <country name="密雲縣" />
            <country name="延慶縣" />
        </city>
    </province>
    <province name="天津市">
        <city name="天津轄區">
            <country name="和平區" />
            <country name="河東區" />
            <country name="河西區" />
            <country name="南開區" />
            <country name="河北區" />
            <country name="紅橋區" />
            <country name="塘沽區" />
            <country name="漢沽區" />
            <country name="大港區" />
            <country name="東麗區" />
            <country name="西青區" />
            <country name="津南區" />
            <country name="北辰區" />
            <country name="武清區" />
            <country name="寶坻區" />
        </city>
        <city name="天津轄縣">
            <country name="寧河縣" />
            <country name="靜海縣" />
            <country name="薊縣" />
        </city>
    </province>
</address>')
           );

INSERT INTO xml_tables
  VALUES   (
               xmltype('<body>
    <form onsubmit="javascript:return check(this);">
        <button onclick="test();">fd</button>
        <div id="ad"></div>
        <input type="submit" value="check" />
    </form>
<div id="test">作爲試驗,還是讓我們來測試一下效果吧。</div>
</body>')
           );

-- existsnode(xmltype_instance,Xpath_string) : 確定xml節點路徑是否存在。存在返回1否則返回0
-- extract(xmltype_instance,Xpath_string) : 返回xml節點路徑下的內容
-- extractvalue(xmltype_instance,Xpath_string) : 返回xml節點路徑下的內容值
-- updatexml(xmltype_instance,Xpath_string,value_expr) : 更新特定XMLType實例相應節點路徑內容

SELECT   EXISTSNODE (VALUE (p), '/address/province/city[0]'),
         EXTRACT (VALUE (p), '/address/province[1]/city[1]/country[1]'),
         EXTRACT (VALUE (p), '/body/div'),
         EXTRACTVALUE (VALUE (p), '/body/div'),
         XMLSEQUENCE (EXTRACT (VALUE (p), '/address/province/city/*'))
  FROM   xml_tables p;

UPDATE   xml_tables p
   SET   p =
            UPDATEXML (VALUE (p),
                       '/body/div/text()',
                       '作爲試驗,還是讓我們來測試一下效果吧。');
 

7、分組函數

-- avg([ALL|DISTINCT]expr) : 平均值
-- count([ALL|DISTINCT]expr) : 總行數
-- MAX([ALL|DISTINCT]expr) : 最大值
-- MIN([ALL|DISTINCT]expr) : 最小值
-- SUM([ALL|DISTINCT]expr) : 求和

  SELECT   name,
           COUNT ( * ),
           SUM (money),
           AVG (money),
           MAX (money),
           MIN (money),
           MAX (money) KEEP (DENSE_RANK LAST ORDER BY id DESC),
           MIN (money) KEEP (DENSE_RANK FIRST ORDER BY id DESC),
           GROUP_ID ()
    FROM   customer
GROUP BY   name;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章