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