PL/SQL块
PL/SQL程序由三个块组成,即声明部分、执行部分、异常处理部分
声明部分:declare
执行部分:begin
异常处理部分:exception
执行步骤
- 在命令行输入
set serveroutput on
ed
- 在文本框中以这样的结构写PL/SQL
declare
--声明的变量
begin
--程序执行部分
exception
--针对begin块中出现的异常,提供处理的机制
--when … then …
--when … then…
end;
命名规则
名称 | 规则 |
---|---|
程序变量 | v_name |
程序常量 | c_name |
游标变量 | name_curor |
异常标识 | e_name |
表类型 | name_table_type |
表 | name_table |
记录类型 | name_record |
例1:查询员工编号为100的员工的工资,email,入职日期
declare
v_sal number(20);
v_email varchar2(20);
v_hire_date date;
begin
select salary,email,haire_date into v_sal,v_email,v_hire_date from employees where employee_id=100;
dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;
使用%type
作用:
定义一个变量,其数据类型与已经定义的某个数据变量的类型相同,或者与数据库表的某个列的数据类型相同,这时可以用%type
优点:
所引用的数据库列的数据类型可以不必知道
所引用的数据库列的数据类型可以实时改变
例1:查询员工编号为100的员工的工资,email,入职日期(动态获取变量类型)
declare
v_sal employees.salary%type;
v_email employees.email%type;
v_hire_date employees.hire_date%type;
begin
select salary,email,hire_date into v_sal,v_email,v_hire_date from employees where employee_id=100;
dbms_output.put_line(v_sal||','||v_email||','||v_hire_date);
end;
记录类型
什么是记录类型?
记录类型是把逻辑相关的数据最为一个单元存储起来,称作PL/SQL RECORD的域,其作用是存放不相同但逻辑相关的信息。
可以将多个变量放入一个记录类型中,类似于java的类。
声明记录类型的格式:
type ... is record(变量1,变量2,...);
定义一个记录类型的成员变量:
v_name 记录类型名;
例1:查询员工编号为100的员工的工资,email,入职日期(使用记录类型)
declare
--声明一个记录类型
type emp_record is record(
v_sal employees.salary%type,
v_email employees.email%type,
v_hire_date employees.hire_date%type
);
--定义一个记录类型的成员变量
v_emp_record emp_record;
begin
select salary,email,hire_date into v_emp_record from employees where employee_id=100;
dbms_output.put_line(v_emp_record.v_sal||','||v_emp_record.v_email||','||v_emp_record.v_hire_date);
end;
例2:使用%rowtype
可以将整张表的所有数据类型声明在一块(employees表)
declare
v_emp_record employees%rowtype;
begin
select * into v_emp_record
from employees
where employee_id = 100;
dbms_output.put_line('employee_id:'||v_emp_record.employee_id||' salary:'||v_emp_record.salary);
end;
例3:动态获取SQL(动态获取employee_id)
declare
v_emp_record employees%rowtype;
v_emp_id employees%type;
begin
select * into v_emp_record
from employees
where employee_id = v_emp_id;
dbms_output.put_line('employee_id:'||v_emp_record.employee_id||' salary:'||v_emp_record.salary);
end;
流程控制
条件判断(两种)
第一种:if...then elsif then...else...end if;
例1:查询出150号员工的工资,若大于10000,打印"salary>=10000";若在5000-10000,
打印"5000<=salary<=10000";否则打印"salary<5000"
写法1:
declare
v_sal employees.salary%type;
begin
select salary into v_sal from employees where employee_id=150;
if v_sal>=10000 then dbms_output.put_line('salary>=10000');
elsif v_sal >=5000 then dbms_output.put_line('5000<=salary<=10000');
else dbms_output.put_line('salary<=5000');
end if;
end;
写法2:
declare
v_sal employees.salary%