PL-SQL

SQL連接操作

Oracle連接操作(left join ,right join,full join)的語法確與SQL標準完全不同，沒有左連接與右連接的概念，也不支持全外連接。Oracle語法如下所示：
 select * from t1,t2 where t1.id=t2.id(+)
採用(+)來表示外連接，在Oracle中它相當於左連接。Oracle9i中增加了標準外連接的語法支持，但使用不廣。

物化視圖

物化視圖（materialized view）或譯為實體化視圖。與普通視圖關係不同，物化視圖更像是一個表，保存了實實在在的數據，並且可以與表一樣定義存儲參數，可以與表一樣使用select,insert,update,delete。在其它資料庫中也有和物化視圖相似的解決方案，DB2叫物化查詢表(materialized query table)，sqlserver有索引視圖，但是索引視圖僅是起優化作用，與oracle的物化視圖還不太一樣。

ROWID & UROWID類型

在資料庫中的每一行都有一個地址。然而，一些表行的地址不是物理或永久的，或者不是ORACLE資料庫生成的。例如，索引組織表行地址存儲在索引的葉子，可以移動。例如,外部表的ROWID（如通過網關訪問DB2表）不是​​標準的ORACLE的rowid。
ORACLE使用通用的ROWID（UROWIDs）的存儲地址的索引組織表和外表。10個字節，格式為： ********.****.****，*為0或1。NROWID類型為二進位數據表中記錄的唯一行號，最大長度4000位元組
索引組織表有邏輯urowids的，和外表的外urowids。UROWID這兩種類型的存儲在ROWID（堆組織的表的物理行id）。
創建基於邏輯的rowid在表中的主鍵。邏輯的rowid不會改變，只要主鍵不改變。索引組織表的ROWID偽UROWID數據類型。你可以訪問這個偽列，你會堆組織表的ROWID偽（即使用一個SELECT ...ROWID語句）。如果你想存儲的rowid索引組織表，那麼你就可以定義一列的表型UROWID到列檢索值的ROWID偽。

指定列的數據類型

定義一個變量，其類型是指定表的指定列的數據類型：
Variable_name Table_name.Column_name%type;

自定義類型

程式設計師自定義類型：
type data_type is record (field_1 type_1 := xyz, field_2 type_2 := xyz, ..., field_n type_n := xyz);
例如：
declare
    type t_address is record (
        name address.name%type,
        street address.street%type,
        street_number address.street_number%type,
        postcode address.postcode%type);
    v_address t_address;begin
    select name, street, street_number, postcode into v_address from address where rownum = 1;end;
可以使用點表示（dot-notation）獲取結構中的域：
v_address.street := 'High Street';"

自增長數據類型

Oracle的數據類型里沒有自增長（auto-incremental）欄位類型，Oracle的官方解決方案是採用sequence實現。insert的時候需要用sequence.nextval。需要增加一張專用表來保存自增長欄位的表和欄位名，每次新增記錄時都把這個記錄值加1再取出使用。

條件語句

以下的代碼展示了IF-THEN-ELSIF結構。ELSIF和ELSE部分是可選的，從而可以創建更簡單的IF-THEN或者IF-THEN-ELSE結構。
IF x = 1 THEN
   sequence_of_statements_1;ELSIF x = 2 THEN
   sequence_of_statements_2;ELSIF x = 3 THEN
   sequence_of_statements_3;ELSIF x = 4 THEN
   sequence_of_statements_4;ELSIF x = 5 THEN
   sequence_of_statements_5;ELSE
   sequence_of_statements_N;END IF;
CASE語句簡化了一些大的IF-THEN-ELSE結構。
CASE
   WHEN x = 1 THEN sequence_of_statements_1;
   WHEN x = 2 THEN sequence_of_statements_2;
   WHEN x = 3 THEN sequence_of_statements_3;
   WHEN x = 4 THEN sequence_of_statements_4;
   WHEN x = 5 THEN sequence_of_statements_5;
   ELSE sequence_of_statements_N;END CASE;
CASE語句可以使用預定義的選擇符：
CASE x
   WHEN 1 THEN sequence_of_statements_1;
   WHEN 2 THEN sequence_of_statements_2;
   WHEN 3 THEN sequence_of_statements_3;
   WHEN 4 THEN sequence_of_statements_4;
   WHEN 5 THEN sequence_of_statements_5;
   ELSE sequence_of_statements_N;END CASE;

迴圈

比較常用的有三種形式。
For ... Loop
   ...
   End Loop;
loop循環是最簡單的循環語句，用於無限制的循環執行語句：
Loop
   ...
   End Loop;
while...loop;
如果退出循環，則必須使用exit語句終止循環。exit語句分兩種格式：
exit：该格式的语句用于无条件强迫终止循环。
exit...when：该格式用于有条件终止循环，首先检测when的条件是否满足。
例1：
loop
    if...then exit；
    end if；
end loop；
例2：
loop
   exit when；
end loop；
while...loop循環在執行語句時，首先檢測條件的值。例如：
declare
  div_name varchar2(20);
  div_num integer:=1;
begin
  while div_num<10 loop
    select name into div_name from div_tab where div_author ='A000'||to_char(div_num);
    div_num:=div_num+1;
  end loop;
end;
for...loop循環可以限定循環的次數例如：
declare
  div_name varchar2(20);
  div_num integer:=1;
begin
  for div_num in 1..9 loop
      select name into div_name from div_tab where div_author='A000'||to_char(div_num);
  end loop;
end;
例如：
declare
   div_name varchar2(20);
   div_num integer:=1;
begin
   for div_num in 1..9 loop
        EXIT WHEN div_num >7;
        DBMS_OUTPUT.put_line(div_num);
   end loop;
end;