Procedure Language/SQL,是Oracle对sql语言的过程化扩展,在原有sql命令语言(增删改查)中增加了过程处理语句(分支、循环等),使sql语言具有过程处理能力。PL/SQL是面向过程语言,但是更简单、灵活、高效和实用,是操作Oracle数据库效率最高的语言。
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;
begin
select 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;
例如:
declarepnum number := 1;
begin
for pnum in 1..10 loop
dbms_output.put_line(pnum);
end loop;
end;
注意:在FOR循环中,循环变量自动累加,默认每执行一次循环体,变量累加1.