块(Block)是PL/SQL的基本程序单元。
PL/SQL块基本结构:
DECLARE
/* 定义部分 */
BEGIN
/* 执行部分 */
EXCEPTION
/* 例外处理部分 */
END;/* 块结束标记 */块分类:匿名块、命名块(<<>>)、子程序(过程、函数、包)、触发器
---------------------------------------------------------------------------------------------------------
定义并使用变量
a.标量(Scalar)类型、
aaa number(10);
bbb constant number(3,2) := 0.01;
ccc varchar2(20) default 'ccc';当定义PL/SQL变量存放列值时,必须确保变量使用合适的数据类型和长度,否则可能出错。为了避免错误,可以使用%TYPE属性定义变量,使用%TYPE定义变量时,会按照数据库列或其他变量来确定新变量的类型及长度。
v_ename emp.ename%TYPE;
v_sal emp.sal%TYPE;
v_sal2 v_sal%TYPE;b.复合(Composite)类型、
复合变量是用于存放多个值得变量。PL/SQL包括PL/SQL记录、PL/SQL表、嵌套表、VARRAY等四种复合数据类型。
PL/SQL记录:类似高级语言中的结构
create table emp(
id number(10),
ename varchar2(20),
etitle varchar2(20)
);
insert into emp values (1,'aaa','a_title');
DECLARE
TYPE emp_record_type IS RECORD(
v_name emp.ename%TYPE,
v_title emp.etitle%TYPE
);
emp_record emp_record_type;
BEGIN
select ename,etitle into emp_record from emp where id = 1;
dbms_output.put_line('name : ' || emp_record.v_name);
END;PL/SQL表:类似高级语言中的数组
DECLARE
TYPE ename_table_type IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
ename_table ename_table_type;
BEGIN
select ename into ename_table(0) from emp where id = 1;
dbms_output.put_line('name : ' || ename_table(0));
END;嵌套表(Nested Table):类似高级语言中的数组
CREATE OR REPLACE TYPE emp_type AS OBJECT(
name varchar2(20),title varchar2(20)
);
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;对象emp_type用于存储emp信息,而emp_array是基于emp_type的嵌套表类型,可以用于存储多个雇员信息。
VARRAY(变长数组):类似嵌套表,但是元素个数有限制。
CREATE OR REPLACE TYPE emp_type AS OBJECT(
name varchar2(20),title varchar2(20)
);
CREATE OR REPLACE TYPE emp_array IS VARRAY(20) OF emp_type;
c.参照(Reference)类型、
参照变量是用于存放数值指针的变量。可使用参照变量使得应用程序共享相同对象,降低占用空间。
游标变量(REF CURSOR)
declare
type c1 is ref cursor;
emp_cursor c1;
v_ename emp.ename%TYPE;
v_title emp.etitle%TYPE;
begin
open emp_cursor for select ename,etitle from emp where id = 1;
loop
fetch emp_cursor into v_ename,v_title;
exit when emp_cursor%notfound;
dbms_output.put_line(v_ename);
end loop;
end;
对象类型变量(REF obj_type)
d.LOB(Large Object)类型