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;