Oracle的体系结构
enter image description here
主要分为两大区域:内存区与硬盘区。其中内存区由4大缓存区域和5大后台进程构成;而外存区域由3种不同的文件构成,即Data files、Control files与Redo Log files.

用于修饰输出结果的函数。这样的函数一般包含两大类,即:
enter image description here
首先要介绍的是单行函数。单行函数包含了五大类的函数:即Character、Number、Date、Conversion和General。其中Character类的函数又分为两种:大小写调整和字符操作。大小写调整的函数有三个:

LOWER  /*使得字符串变成小写*/
UPPER   /*使得字符串变成大写*/
INITCAP /*首字母大写*/

而字符操作函数包含有

CONCAT('hello', 'world')
SUBSTR('hello, world', 1,5)
LENGTH('hello')
INSTR('hello,world','w')  /返回7
LPAD('hello',10,'*')
RPAD('hello',10,'*')
TRIM('H' from 'Hello, world!')
REPLACE('jack and jue','j','BL')

Number函数主要为

ROUND(45.986,2)    45.99
TRUNC(45.986,2)     45.98
MOD(1600,300)       100

CASE expression用于对输出进行更为方便的调整

SELECT last_name, job_id, salary,
CASE  job_id WHEN 'IT_PROG' THEN 1.10*salary
WHEN 'ST_CLERK' THEN 1.15*salary
ELSE salary END "REVISED_SALARY"
FROM employees;

而DECODE函数是对于CASE Expression的一个功能函数,使得使用更为方便:

SELECT last_name, job_id,salary,
DECODE(job_id,'IT_PROG',1.10*salary,
'ST_CLERK', 1.15*salary,salay) REVISED_SALARY
FROM employees; 

一般性函数(即可以作用于各种不同的数据类型) NVL (comm, 0) /将null值转换为一个真实值/ NVL2 (expr1, expr2, expr3) NULLIF( expr1, expr2) COALESCE(expr1,expr2,...,exprn) DECLARE中每个变量的声明都必须以分号结尾。

示例

MERGE INTO target t
       USING source s
       ON (t.id = s.id)
WHEN MATCHED THEN
       UPDATE SET
           t.firstName = s.firstName,
           .....
WHEN NOT MATCHED THEN
       INSERT VALUES(s.id, s.firstName....);
END;

关于Merge语句的语义

Use the ON clause to specify the condition upon which the MERGE operation either updates or inserts. For each row in the target table for which the search condition is true, Oracle Database updates the row with corresponding data from the source table. If the condition is not true for any rows, then the database inserts into the target table based on the corresponding source table row.

enter image description here
Merge语句中的ON子句可以将Target表和Source表作如图所示的划分,Target中的绿色部分在后继操作中是不涉及的,而红色部分则是UPDATE的对象,Source的黄色部分则为要插入Target表格的素材。也就是说,ON子句的作用是将两个目标表格做一个划分,同时将两者的红色部分逐条对齐。若ON子句不能满足上述功能,则会对Oracle的执行造成困扰。

PL/SQL中的循环

  1. Basic Loop

    LOOP statement1;
    ...
    EXIT [WHEN condition];
    END;

  2. While Loop

    WHILE condition LOOP statement1; .... END LOOP;

  3. For Loops

    FOR counter IN lower..higher statement1; ... END LOOP;

如何使用带参数的CURSOR?

DECLARE v_cursor(p_note varchar2) IS
    SELECT * FROM table WHERE field=p_note;
OPEN v_cursor('test');

%ROWTYPE与CURSOR

  1. %ROWTYPE

    DECLARE emp_rec employees%ROWTYPE; BEGIN SELECT * INTO emp_rec FROM table; emp_rec.id ...

  2. CURSOR

对CURSOR的显式使用
首先是对CURSOR的定义、打开、遍历、关闭这四个步骤.

DECLARE  
CURSOR emp_cur IS  
SELECT * FROM EMP_INFO;  
emp_rec emp_cur%ROWTYPE;  
BEGIN  
OPEN emp_cur;  
LOOP  
FETCH  emp_cur INTO emp_rec;  
EXIT WHEN emp_cur%ROWCOUNT>10 
OR emp_cur%NOTFOUND;  
...  
END LOOP;   
END; 

对CURSOR的隐式使用

DECLARE
CURSOR emp_cur IS 
SELECT * FROM EMPINFO;
emp_rec emp_cur%ROWTYPE;
BEGIN
FOR emp_rec IN emp_cur LOOP
//do something
END FOR;
END;

处理异常 系统定义的异常和用户定义的异常 预定义的异常包括:NO_DATA_FOUND, TOO_MANY_ROWS, INVALID_CURSOR, ZERO_DIVIDE,DUP_VAL_ON_INDEX.