Procedure Language/SQL,是Oracle对sql语言的过程化扩展,在原有sql命令语言(增删改查)中增加了过程处理语句(分支、循环等),使sql语言具有过程处理能力。PL/SQL是面向过程语言,但是更简单、灵活、高效和实用,是操作Oracle数据库效率最高的语言。

plsql desc plsql describe_plsql desc

PL/SQL 之Hello World
declare
    --说明部分(变量、光标、例外)
begin
   --程序体
dbms_output.put_line("Hello World!");
  -- 调用程序包中的方法,put_line方法是一个存储过程,可接收一个字符串参数。
end;
如果没有说明部分,declare可以不写。程序以begin开头,以endl;结束。注意程序体中每一句后面的分号以及end后的分号。

PL/SQL完整程序结构
declare
    --说明部分(变量常量说明、光标申请、例外说明)
begin
    --语句序列(DML语句)
exception
    --例外处理语句
end;

一、声明部分

1、基本变量类型
char、varchar2、long、boolean、date、number
例如:  var1  char(15);--定义一个字符,名称是var1,长度是15
            married boolean:=true;--变量赋值的形式是:=
            psal number(7,2);--定义一个有两位小数的数字
注意:是名字在前,类型在后。
例如:
declare
    pdate date;    --    定义一个date类型的变量
begin
    pdate := sysdate;    --获取当前日期
    dbms_output.put_line(pdate );    --打印当前日期
    dbms_output.put_line(pdate + 1 );    --打印明天的日期
end;
2、引用型变量:
my_name emp.ename%type;
定义一个引用型变量,名称是my_name,类型是emp表中enamel列的数据类型。
例如:
declare
customer_no  t_credit_agreement.customerno%type;
pdate t_credit_agreement.submitdate%type;
beginselect customerno,submitdate into customer_no,pdate from t_credit_agreement where agreementno='ZX-8143-2012-000009';
--into是另一种赋值方式,注意查询的字段顺序与赋值的字段要相匹配,这句就是将查询结果赋值给两个定义的引用型变量
dbms_output.put_line(customer_no||'    '||pdate);
--||是字符串连接符
end;
但是!!!
select customerno,submitdate into customer_no,pdate from t_credit_agreement;
如果这么写就会报错,因为一个变量无法被赋值很多行的数据。
3、记录型变量
emp_rec emp%rowtype
记录表中行的类型作为这个字段的类型,可以将记录型变量理解成一个数组,而数组中的每个元素的类型,与表中相对应顺序列的类型一致。
例如:
declare
--定义纪录型变量,代表一行数据
agreemnt_row  t_credit_agreement%rowtype;
begin
--获取一行信息,并赋值
select * into agreemnt_row from t_credit_agreement where agreementno='ZX-8143-2012-000009';
--打印customerno和submitdate字段的值
dbms_output.put_line(agreemnt_row.customerno||'  '||agreemnt_row.submitdate);end;

二、语句序列
1、IF语句
(1)IF 条件 THEN 语句一;
            语句二;
        END IF;
(2)IF 条件 THEN 语句序列一;
        ELSE 语句序列二;
        END IF;
(3)IF 条件 THEN 语句序列一;
        ELSIF 语句序列二;
        ELSE 语句序列三;
        END IF;
注意:ELSIF并不是常见的ELSEIF(少了一个E),以END IF结束(中间有空格)
例如:
declare
  pnum number := 1;
begin
if pnum = 0 then dbms_output.put_line('0');
elsif pnum = 1 then dbms_output.put_line('1');
else dbms_output.put_line('2');
end if;end;
2、循环语句
(1)WHILE 条件 LOOP
……
END LOOP;
例如:
(2)LOOP
EXIT WHEN 条件;
……
END LOOP;
当条件满足时,跳出循环;
例如:
declare
  pnum number := 1;

begin
  loop
  exit when pnum > 10;
    dbms_output.put_line(pnum);
    pnum := pnum+1;  --改变循环变量
  end loop;
end;(3)FOR I IN 1..3 LOOP  --连续的数字区间,首..尾(中间是两点)
……
END LOOP;
例如:
declare 

  pnum number := 1; 


begin 

  for pnum in 1..10 loop 

    dbms_output.put_line(pnum); 

  end loop; 

end;

注意:在FOR循环中,循环变量自动累加,默认每执行一次循环体,变量累加1.