-
select * from Employee;
select * from dba_tab_cols t where t.table_name='EMPLOYEE';
-
-- 声明部分,用于定义变量
declare
constant用于定义常量,当定义常量时必须指定它的初始值,且数据不能改变。
-
n_aaa constant number(4,2) :=5.5;
boolean 类型的值只能用于sqlplus语句块中,不能用在表字段的数据类型中
not null 用于强制初始化变量不能为空,此时必须为变量指定值
default用于指定变量或常量的默认值
-
v_valid boolean not null default false;
v_name varchar2(20);
为了确保变量使用合适的数据类型和长度,可以使用%type属性定义变量,它会按照数据库列
或其它变量来确定新变量的类型和长度
-
v_job Employee.Job%type;
将v_job2定义为与变量v_job的数据类型和长度完全一致
-
v_job2 v_job%type;
复合变量:
处理单行单列数据时,用标量变量;处理单行多列时,用PL/SQL记录;处理单列多行时,
用集合;处理多行多列数据时,可以结合使用PL/SQL记录和集合
PL/SQL记录(RECORD):
方法一:
emp_recode_type 是PL/SQL记录类型并包含有三个成员(name,salary,job)
-
type emp_recode_type is record(
name employee.name%type,
salary employee.salary%type,
job employee.job%type
);
emp_recode是记录变量
-
emp_recode emp_recode_type;
方法二:
使用表名的%rowtype 属性定义记录变量
注意:用%rowtype 属性定义记录变量时,记录成员个数、名称、类型必须与
表或视图的列的个数、名称和类型完全相同
-
emp_recode2 employee%rowtype;
集合类型
PL/SQL 表(也称索引表,下标可以为负数,下标没有上限和下限,并且元素的个数无限)
-
--这里的table 实指集合
type name_table_type is table of employee.name%type index by binary_integer;
name_table name_table_type;
嵌套表:
嵌套表的下标不能为负值,其元素的个数没有限制并可以使用表列的数据类型
在使用嵌套表时必须先用create type 语句建立嵌套表类型
嵌套表只是比PL/SQL 表少了 index by binary_integer
-
type num_table_type is table of number(4);
num_table num_table_type;
varray(变长数组):
varray的元素个数是有限制的,在使用其之前必须先建立varray类型
在此创建的varray只能存放20个varchar2类型的数据
注意:嵌套表列数据需要存储在专门的存储表中,而varray数据则与
其它列数据一起存放在表字段中
-
type v_varray_type is varray(20) of varchar2(10);
n_empno employee.empno%type;
-
-- 程序开始
begin
执行部分,执行PL/SQL/和SQL语句
可以用into将从表人查询出来的值赋给指定的变量
将值赋给变量有两种方法,一是用 := ,二是用 into
& 符号用于提示用户输入一个值,& 为sqlplus的替代变量
-
n_empno := &输入你要查询的员工编号:;
select Name,Job into v_name,v_job from Employee where empno=n_empno;
这里的 || 号与Java中的 + 号类似,表示要将两边的字符串连接起来
dbms_output是Oracle所提供的系统包,用于输出数据或消息,
而put_line是该包所包含的过程,用于输出字符串信息并换行
当在CMD中使用dbms_output包时,必须要先将sqlplus 的环境变量
serveroutput 设置为 on
-
dbms_output.put_line('你查询的员工是:' || v_name || ' 他的工作是:' || v_job);
引用记录变量的成员并赋值(赋值可以用 := 和 into 两种方法)
注意:用select……into 语句给记录变量赋值时,select语句中的列名列表的名称和个数、
类型必须与记录变量的成员个数、名称、类型完全相同
-
dbms_output.put_line('你查询的员工是:' || v_name || ' 他的工作是:' || v_job);
emp_recode.name := '钱森';
dbms_output.put_line('引用记录变量的成员并赋值(Recode):' || emp_recode.name);
select name,job into emp_recode2.name,emp_recode2.job from employee where empno=2;
dbms_output.put_line('引用记录变量的成员并赋值(RowType):' || emp_recode2.name || ' 的工作是:' || emp_recode2.job);
-- 使用PL/SQL表(索引表)
select name into name_table(-50) from employee where empno=1;
dbms_output.put_line('雇员名:' || name_table(-50));
-- 使用嵌套表
-- 必须先设置嵌套表的下标,然后才能对该集合进行赋值
num_table := num_table_type(1,2,3,4,5);
num_table(1) := 10;
num_table(5) := 100;
dbms_output.put_line('使用嵌套表:' || num_table(1) || ',' || num_table(5));
exception
-- 异常处理部分
when NO_DATA_FOUND then dbms_output.put_line('查询不到员工编号为' || n_empno || '的员工!');
when TOO_MANY_ROWS then dbms_output.put_line('数据完整性错误,员工编号' || n_empno || '重复!');
when OTHERS then dbms_output.put_line('PL/SQL执行错误!' || sqlerrm);
-- 程序结束
end;
/