oracle高級查詢,事物,過程及函數

                        第四章 oracle高級查詢,事物,過程及函數


(一).當行函數:輸入一位,輸出一位
         當行函數包含(日期函數,數值函數,字符函數,轉換函數,其它函數)
1.日期函數:
         add_months
         months_between
         last_day
         next_day

2.數值函數(abs,ceil,floor,power,sqrt,mod,round,trunc,sign)
(1)abs:絕對值
(2)ceil:向上取整
(3)floor:向下取整
(4)round(n,[m]):
         若m=0,則四捨五入到整數位
         若m<0,則四捨五入到小數點前m位
         若m>0,則四捨五入到小數點後m位
(5)trunc(n,[m])
         若m=0,則將數字n的小數部分截取掉
         若m<0,則將n截取到小數點前的m位
         若m>0,則將n截取到小數點後的m位
(6)power(n):n次方
(7)sqrt:開平方根
(8)mod:取餘
(9)sign:標記數值正負(整數爲1,0爲0,負數爲-1)

3.字符函數(lower,upper,ltrim,rtrim,substr,concat,replace,instr)
(1)lower:將字符串轉換爲小寫
(2)upper:將字符串轉換爲大寫
(3)length:返回字符串長度
(4)ltrim:去左邊的空格
(5)rtrim:去右邊的空格
(6)substr:截取字符串
         例如:select substr('cto',3,2) from dual;
         結果爲:o.
         3:從什麼位置開始,2是截取的多少位
(7)replace:替換
         例如:select replace('cto','t','e') from dual;
         結果爲:ceo
(8)instr:取得索引,從1開始 


4.轉換函數(to_number,to_char,to_date,nvl(expr1,expr2),nvl2(expr1,expr2,expr3))
(1)to_number(將符合數字格式的字符串轉變成數字值)
       select to_number('2000.22','999999D99') from dual;
       結果爲:2000.22
(2)to_char()
       select to_char(sysdate,'yyyy-mm-dd') from dual;
       結果爲:2013-12-27
(3)nvl(expr1,expr2)
       expr1,expr2可以是任何數據類型,但是兩者數據必須要匹配
       如果expr1是null,則返回expr2;如果expr1不爲null,則返回expr1;

       例如:select  nvl(1,2) from dual;
       結果爲:1
       select nvl(null,2) from dual;
       結果爲:2

(4)nvl2(expr1,expr2,expr3)
     如果expr1不是null,則返回expr2;如果expr1是null,則返回expr3;

     例如:select nvl2(1,2,3) from dual;
     結果爲:2
     select nvl2(null,2,3) from dual;
     結果爲:3
(5)to_date()
     例如:select to_date('13-12-27','yyyy-mm-dd') from dual;
     結果爲:0013-12-27
(二)多行函數:max,min,avg,sum,count  ->group by   having
     多行函數包含:分組函數,分析函數
(1)分析函數:
     分頁:row_number() over(order by 條件) 
     排行:rank,和row_number用法一樣
(三)多表查詢
1.集合操作符:
     (1)union:檢索所有不重複的行(補集)
     (2)union all:所有行(並集)
     (3)intersect:檢索查詢共有的行(交集)
     (4)minus:檢索查詢之外的行(差集)
2.鏈接查詢:
     (1)自連接
                例如:emp表包含empno員工號,mgr管理者號,檢索員工smith的上級領導
                select manager.ename from scott.emp manager,scott.emp worker
                where manager.empno=worker.mgr and worker.ename='SMITH';
                結果爲:FORD
     (2)內連接 :inner join ....  on
     (3)外連接:
              左(外)鏈接:left[outer] join ... on
              右(外)連接:right[outer] join ...on
              完全外鏈接:full join ... on
(四)事務處理:事務是用於確保數據庫數據的一致性,它由一組相關的DML語句組成.
    (1)提交事務(commit)
    (2)回退事務(rollback)
              [1]設置保存點:是使用SQL命名savepoint來完成,
              或者使用包dbms_transaction的過程savepoint來設這保存點.
              例如:
                    savepoint a;
                    或者
                    exec dbms_transaction.savepoint('a');
              [2]取消部分事務      
              爲了取消部分事務,用戶可以退回保存點,使用savepoint來完成,
              或者使用包dbms_transaction的過程savepoint.
              例如:
                    rollback to a ;
                    或者
                    exec dbms_transaction.rollback_savepoint('a');
              [3]取消全部事務(會取消所有事務變化,結束事務,刪除所有保存點並釋放鎖)
              例如
                    rollback;
                    或者
                    exec dbms_transaction.rollback('a');
    (3)事務的ACID屬性:
              原子性
              一致性
              隔離性
              持久性

(五)過程和函數
1.創建存儲過程
    create [or replace] procedure proc_name(argument1 [model1] datatype1,
           argument2 [model2] datatype2...)
    is [as]
    PL/SQL BLOCK;
    argument1,argument2爲指定過程的參數,當指定參數數據類型時,不能指定其長度
    modl是參數模式,包括輸入參數(in),輸出參數(out),輸入輸出參數(in out),默認爲in.
    PL/SQL或者as用於開始執行一個PL/SQL塊;              

    例題:
    (1)無參數的存儲過程
    create or replace procedure proc_name
    as 
    begin
      dbms_output.put_line(systimestamp);
      end;

    declare
    begin 
      proc_name;
      end;
    結果爲:27-12月-13 05.34.38.156000000 下午 +08:00
    (2)建立一個帶out參數的存儲過程
    create or replace procedure testout(value1 number,value2 out number)
    is 
    begin
      value2:=value1+50;
      end;
    調用存儲過程
    declare 
    result number;
    begin
      testout(10,result);
      dbms_output.put_line(result);
      end;

    輸出結果爲:60
2.刪除存儲過程
    drop procedure 存儲過程名;
3.創建函數
    create [or replace] function function_name(argument1 [model1] datatype1,
           argument2 [model2] datatype2...)
    is [as]
    PL/SQL BLOCK;
    argument1,argument2爲指定過程的參數,當指定參數數據類型時,不能指定其長度
    modl是參數模式,包括輸入參數(in),輸出參數(out),輸入輸出參數(in out),默認爲in.
    is或者as用於開始執行一個PL/SQL塊;
    (1)例如:
    create or replace function get_user 
    return varchar2
    is
    v_user varchar2(100);
    begin
      select ename into v_user from scott.emp where empno='7369';
      return v_user;
    end;
      使用變量接收函數返回值
      declare 
      username varchar2(50);
      begin
        username:=get_user;
        dbms_output.put_line(username);
        end;
    結果爲:SMITH

    在SQL語句中直接調用函數
    select get_user from dual;
    結果爲:SMITH

4.注意:函數必須要返回數據,所以只能作爲表達式的一部分調用,可以在SQL中調用函數,
  帶out和in out參數的函數不能在SQL中被調用,且必須只能使用SQL所支持的標準數據類.
   在包中如dbms_output調用函數:
      dbms_output.put_line('用戶名:'||函數名);
      例如:
      declare 
      username varchar2(50);
      begin
        username:=get_user;
        dbms_output.put_line('用戶名:'||get_user);
        end;
      結果爲:用戶名:SMITH

 

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