1. 程式人生 > >Oracle_PLSQL_常用功能說明及示例

Oracle_PLSQL_常用功能說明及示例

1.求字持串的長度LENGTH
您可用LENGTH函式求字串的長度。LENGTH返回一個數值。該值等於引數中的字元個數。
例:使用LENGTH函式
    SQL>select Last_Name, length(Last_Name) from customer order by LastName;

2.使用SUBSTR函式從字串中提取子串
語法:
    SUBSTR函式的語法如下:
    SUBSTR(string, string charcter, number of charcters)
    變數定義如下:
    string為字元列或字串表示式
  string charcter為子串的起始位置
  number of charcters為返回字元的個數c
例:說明了怎樣使用SUBSTR函式取得教師的姓的前四個字元
    SQL>select last_Name, substr(Last_Name, 1, 4) from instector order by Last_Name
例:在SUBSTR函式中使用LENGTH函式(取後三個字元)
    5Qt.>select last_Name, substr(Last_Name, Length(Last_Name) - 2, 3) from instector order by Last_Name

3.在字串中查詢模式
例:使用LIKE運算子
    SQL>column description format a40 word_wrapped
    SQL>column title format a35
    SQL>select Title, Description from Course where Description like '%thory%' or Description like '%theories%';

4.替換字串的一部分
  經常遇到的資料操縱任務是在特定的列中將資料由一種模式轉換成另一種模式。
  假設您希望在Course表中改變課程說明,將說明中的字seminar用字discussion替代.那麼您可用oracle提供的函式REPLACE,該函式使得某列的字串能被另一字串代替。
語法:
    REPLACE函式的語法如下:
    REPLACE(string, existion_string, [replacement_string])
    變數定義如下:
    string為字元表示式c
    existion_string為已存在的字串。
    replacement_string為用來替代的可選字串。
例:使用REPLACE函式
  顯示了在Course表中如何使用REPLACE來改變課程名稱(title):首先使用查詢顯示當前課程名稱,UPDATE語句中使用REPLACE函式將SEMINAR改變成DISCUSSION,另一查詢顯示了UPDATE語句的效果。
    SQL>update Course set Title = replace(Title, 'SEMINAR', "DISCUSSION');
注:如果在REPLACE函式中您沒有指明用什麼字串去替代,則列中的原字串將被刪除。

5.刪除字串的空格
  如果字串列中包含前導或尾部空格,按某指定值對列進行查詢,很可能返回錯誤結果。
LTRIM和RTRIM。

6.LPAD左填充函式
使用LPAD對字串進行左填充。
語法:
    LPAD(string, n, pad_string);
    變數定義如下:
  string為需左填充的字串直接值或字元申列。
  n為LPAD返回的字串長度。
  pad_string為左填充到string的字串。
  SQL>select lpad(my_col, 20) from test_trim;
  使用LENGTH函式人微言輕LPAD函式的引數:
  SQL>select lpad(my_col, length(my_col) + 8, 'you say') from test_trim;

7.改變字串的大小寫
  oracle提供了三個改變字串大小寫的函式:
  INITCAP轉換每個字的第一個字元為大寫
  LOWER轉換所有字元為小寫
  UPPER轉換所有字元為人寫

8.使用DECODE函式(值轉換函式)轉換字串
語法
    DECODE的語法是:
    DECODE(expression, value1, returned_value1, ... valueN, returned_valueN, [default_returned_value]
變數定義如下:
  Dexpression為合法的oracle表示式。
  valueN為此expression可能取的值:
  returned_valueN為expression等於valueN時DECODE的返回值。
  default_returned_value為可選項,它是expression不等於任何valueN時DECODE的返回值。
  SQL>select Schedult_id, Day, decode(Day, 1, 'sun', 2, 'mon', 3, 'tue', 4, 'wed', 5, 'thu', 6, 'fri', 7, 'sat')
         from Schedult_Type_Details order by Schedult_id, Day;

9.轉換字串為ASCII值
  SQL>select Last_Name, SCAII(Last_Name) from Instructor order by Last_Name;

10.當前日期和時間:SYSDATE

11.轉換日期為字串
語法:
    T0_CHAR函式的格式如下:
    TO_CHAR(date_value,format)
  SQL>select Last_Name, First_Name, to_char(Hire_Date, "MONTH DD, YYYY') H_DATE from Employee order by Hire_Date;
  在SUBSTR函式中嵌入to_char函式
  SQL>select Last_Name, First_Name, substr(to_char(Hire_date, 'MON), 1, 1) the_fist_letter_of_the_month from Employee;

12.轉換字串為日期
語法:
  to_date(string_value, date_format);
  SQL>select SYSDATE, to_date('07-04-1976', 'MM-DD-YYYY') from dual;

13.日期和時間
  在to_char函式中使用時間格式:
  SQL>select Employee_id, (to_char(time, clocked_in, 'HH:MM:SS') Time_Clocked_In from Time_Clock;

14.計算兩個日期的差值
  SQL>select sysdate + 7 from dual;

15.在Insert/Update等操作時,數字會自動轉換為字串。數字欄位可以用to_char轉換為串。

16.格式化數值欄位
  select to_char(Additional_Fees, '9,999.99') from Course;
  貨幣符號:
  select to_char(Additional_Fees, '¥9,999.99') from Course;
  科學計數法:
  select to_char(Additional_Fees, '9.9999EEEE') from Course;

17.將字串轉換成數字
  to_number是to_char的逆運算。
  update Security_Price set Last_Qtr_EPS = to_number('$2.81', '$999.99');

18.內部統計函式
  AVG(value):計算平均值,它的引數來自於它所作用的若干行。
  STDDEV(value):返回它所作用的若干行作為引數的標準差。
  VARIANCE(value):返回它所作用的若干行作為引數的。

19.四捨五入函式和擷取函式
  四捨五入ROUND(value, [scale]) ROUND(101.8) = 102 Round(123.37, 1) = 123.4
  擷取TRUNC(value, [scale]) Trunc(123.33) = 123 Trunc(123.567, 2) = 123.56
  求最大整數FLOOR(value) Floor(128.3)=128 Floor(129.8) = 129 除了不能擷取小數部分外,Floor幾乎等同於Trunc函式。
  求最小整數CELL(value) Cell(128.3)=129 Cell(129.8) = 130

20.求最大或最小值
  MAX和MIN。

21.替換NULL
  NVL(column, value)。
  select nvl(Additional, 0) from Course;

22.內部聚合函式
  COUNT函式:
  查詢相異的行:DISTINCT
  分組:GROUP BY: select Department_id, count(*) from curse group by Department_id;
  group by 和having: select Department_id, count(*) from Course group by Department_id having count(*) = 4; --哪些部門開設了4門課。
  avg和group by: select Department_id, avg(Additional_Fees) from Course group by Department_id;

23.EXISTS
  select Last_Name, Fist_Name from Instructor I where exists(select * from Class C where I.Instruetor_id = C.Instructor_id);

24.SELECT語句的集合操作
  INTERSECE(交)
    UNION(並): select Epicenter_Latitude, Epicenter_Longtitude from UNSD_Event UNION select Location_Lat, Location_Lon, Richter_Number from RIND_Event order by 1;
    MINUS(差): select Last_Name, First_Name from Instructor minus select Last_Name, First_Name from Hoover_Instructor;
   
25.用子查詢建立一個表
  create table Anthor as select * from instructor where 1 = 2;

26.建立一個簡單的檢視
  create view Stueent_No_Personal
    as
    select Student_ID, Last_Name, First_Name from Student;
   
27.PL/SQL塊的結構
  說明部分
  執行部分
  例外處理部分
  例:
  DECLARE
   max_records CONSTANT int := 100;
      i int := 1;
    BEGIN
      FOR i in 1..max_records LOOP
        INSERT INTO test_table(record_number, current_date) values(i, sysdate);
      END LOOP;
      COMMIT;
   END;
   /

28.用%TYPE宣告一個變數
  例:為了說明一個用來儲存修理倉庫技師名字的變數,可這樣 Tech_Name Dept_Esimate.Techican %TYPE;

29.用%ROWTYPE宣告一個變數
  例:用一個複合變數儲存Depot_Estimate表的一行。 Depot_Est_Row Depot_Esimate %ROWTYPE;
  Depot_Est_Row的元素可以用以下方法使用:Depot_Est_Row.Techniciam := 'yujj';

30.一些常見的控制結構
  IF語句:
  if MOD(i, 5) = 0 then
   rec_number := 5;
    elseif MOD(i, 7) = 0 then
      rec_number := 7;
    else
      rec_number := i;
    end if;
   
    簡單的LOOP/EXIT語句:
    LOOP
      EXIT WHEN...;
    ENDLOOP;
   
    WHILE_LOOP語句:
    WHILE i <100 LOOP
      i := i + 1;
    END LOOP;
   
    FOR_LOOP語句:
    for i in 1..max loop
      i :=  i + 1;
      dbms_output.put_line('j:'||to_char(j));
    end loop;
   
    GOTO語句:
    goto more_processing;
    ...
    <<more_processing>>
    ...
    end;
   
    NULL語句:
    if (mod(i, 10) = 0 ) then
      i := i + 1;
    else
      NULL;
    end if;
   
    賦值語句:
    pl/sql中使用:=進行賦值。
   
31.在PL/SQL中使用SQL語句
    PL/SQL和SELECT語句:
    set serveroutput on
    declare
      Average_Body_Temp Patient.Body_Temp.Deg_F%TYPE;
    begin
      dbms_output.enable;
      select avg(Body_Temp_Deg_F) into Average_Body_Temp from Patient;
      dbms_putput.put_line('Average body temp is Deg.F:' || to_char(Average_Body_Temp.'999.99'));
    end;
   
    子塊的應用:
    一個匿名塊,它包含另一個子塊
    declare
      max_i constrant int := 100;
      i int := 1;
      rec_number int;
    begin
      for i in 1..max_i loop
        if mod(i, 5) = 0 then
          rec_number := 5;
        else
          rec_number := i;
        end if;
        insert into test_table(record_number, current_date) values(record_number, sysdate);
       
        -- Here is a sub block;
        declare
          max_j constrant int := 20;
          j int := 1;
        begin
          for j in 1..max_j loop;
            rec_number := rec_number * j;
            insert into test_table(record_number, current_date) values(record_number, sysdate);
          end loop;
        end;
      end loop;
   
    一個過程的示例:
    declare
      New_Patient_ID Patient.Patient_ID%TYPE;
      High_Fever constant real := 42.0;
   
    procedure Record_Patient_Temp_Deg_C(Patient_ID varchar2, Body_Temp_Deg_C real) is
    Temp_Deg_F real;
    begin
      Temp_Deg_F := (9.0/5.0)*Body_Temp_Deg_C + 32.0;
      insert into Patient(Patient_ID, Body_Temp_Deg_F) values(Patient_ID, TempDeg_F);
      commit;
    end;
   
    begin
      New_Patient_ID := 'GG9999';
      Record_Patient_Temp_Deg_C(New_Patient_ID, High_Fever);
    end;
    /
    --一個過程內宣告的變數在過程體外不能被使用。
   
    一個函式的示例:
    function Max_Additional_Fees(Dept_ID IN varchar2)
      return varchar2 is
      Additional_Fees Course.Additional.Fees%TYPE;
    begin
      ...
      return something;
    end;
   
    過程和函式的引數型別:IN/OUT/IN OUT
   
32.關於dbms_output包的呼叫:先輸入set serveroutput on;

33.系統檢視USER_SOURCE,儲存有過程、函式、包等。它有以下四列:
  NAME 包括過程、函式、包或包體的名字
  TYPE 批出原始碼是屬於過程、函式包還是包體
  TEXT 包含原始碼中的一行
  LINE 包含在TEXT中原始碼所包含的行數
  例:select line, text from user_source where name = 'DROP_CLASS' order by line;

34.SELECT和儲存函式:
  在SELECT中可以使用存在的儲存函式
    create or replac function DegF_add10(Deg_F IN number)
      return number is
    Deg_C number;
    begin
      deg_c := deg_f + 10;
      return deg_c;
    end DegF_add10;
   
    select body_temp, DegF_add10(body_temp) from patient;

35.附加PL/SQL資料型別
    boolean    binary_integer, natural, positive    %type    %rowtype    pl/sql表或陣列    使用者自定義記錄
   
36.ORACLE預定義例外
  DUP_VAL_ON_INDEX:當SQL語句要在存在唯一索引的列中建立重複資料時發生。
  INVALID_NUMBER:當SQL語句指定無效數字時發生。
  NO_DATTE_FOUND:當SELECT語句沒有返回任何行時發生。
  TOO_MANY_ROWS:在PL/SQL環境中,一條SELECT語句檢索多行資料時發生。為了從一個查詢檢索任意數目的行,可使用遊標,可將遊標看成是查詢返回結果的視窗。
    在pl/sql中,一條SELECT語句返回多個數據行時就會發生這個例外。
  VALUE_ERROR:多數情況與截斷和轉換誤差有關。如給一個varchar2(5)的欄位賦值長度超過5的字串。

37.SQLCODE和SQLERRM
  SQLCODE包括當前執行oracle pl/sql語句的錯誤狀態。如果SQL語句沒有錯誤,則SQLCODE為0;
  SQLERRM包括與SQLCODE相關的錯誤資訊。如果SQL語句執行成功,則SQLCODE為0,SQLERRM為一個字串:ORA_0000:normal,successful completion.

38.使用遊標的步驟
  1.說明(declare)遊標,給遊標起個名字,並且與SELECT語句在語法上相關聯。
  2.開啟(open)遊標,Oracle RDBMS執行與遊標相關的查詢,並確定所限定的行(活動集)。
  3.用遊標提取資料行:將每一行的值返回到PL/SQL子程式環境中,一次返回一行。
  4.關閉(close)遊標,釋放相關資源。

39.說明遊標
  CURSOR cursor_name
    [(parameter1 parameter1_datetype[ := default1],
    ..
    [parameterN parameterN_datetype[ := derfaultN])]
    IS select_stmt;
 
40.開啟遊標
   Open cursor_name;
   說明:如果在定義遊標時,沒有宣告引數的型別,在OPEN遊標時,必須給相關的引數指定變數或是直接值。如open tempcur(20,30);

41.從遊標中取出行
    loop
      fetch tmpcur into field1, field2;
      exit when tmpcur%notfound;
     
      dbms_output.put_line(field1);
    end loop;

42.關閉遊標
    close tmpcur;
   
43.取遊標返回的行數
  dbms_output.put_line(tmpcur%rowcount);

44.在oracle資料庫中查詢結果的行號使用偽列ROWNUM表示(從1開始)。!!!資料庫分頁可以使用它!!!
    例如select * from employee where rownum<10 返回前10條記錄。但因為rownum是在查詢之後排序之前賦值的,所以查詢employee按birthday排序的第100到120條記錄應該這麼寫:
    select * from (
      select my_table.*, rownum as my_rownum from (select name, birthday from employee order by birthday
        ) my_table where rownum <120
    )where my_rownum>=100
    例:給多表查詢的結果加上序列號
  select rownum as "SerialNo", b."pName", a."compName" from "fundCompAccount" a, "fundPersonAccount" b
  where a."compAccount" = b."compAccount";

--以上已經列印20040511
  Oracle選定前20條資料
    select * from "fundDuty" where rownum < 20;
    Oracle選定21至40條資料
      select * from "fundDuty" where rownum <=40
      minus
      select * from "fundDuty" where rownum <=21;