PLSQL 匿名块 变量 基本类型 封装类型
封装类型:列类型 行类型 记录类型 表类型
匿名块
语法结构
declare
-- 存放变量
begin
-- 业务执行
exception
-- 抛出异常后处理
end;
示例
让用户输入员工编号 , 在控制台打印员工姓名
declare
v_id emp.empno%type := '&请输入员工id';
v_name emp.ename%type;
begin
select ename into v_name from emp where empno = v_id;
dbms_output.put_line('员工名称:'|| v_name);
exception
when no_data_found then
dbms_output.put_line('没有ID为'|| v_id ||'的员工');
end;
业务部分是必须存在的,其他部分可以省略,例如下面的语句
-- declare 可以省略
begin -- 必须存在
dbms_output.put_line('tetsabc');
-- exception 可以省略
end;
变量常量的声明和赋值
常量
声明常量需要加上 constant 关键字
declare
v_pi constant number(5,2) := 3.14;
begin
dbms_output.put_line('常量PI的值为:' || v_pi);
end;
变量
declare
v_r number(5) := '&请输入半径'; -- 声明Number类型的变量,并让他接收传传过来的值
v_pi constant number(5,2) := 3.14;
begin
dbms_output.put_line('常量PI的值为:' || v_pi);
dbms_output.put_line('变量r的值为:' || v_r);
dbms_output.put_line('圆的面积为:'|| v_r * v_r * v_pi);
end;
请输入半径: 3
控制台输出↓↓↓
常量PI的值为:3.14
变量r的值为:3
圆的面积为:28.26
变量类型
基本类型
number 数字类型如果长度为(3,2),则为float类型
varchar 字符串类型
varchar2 字符串类型
date 日期类型
timestamp 时间戳类型
封装类型
-
%type 列类型
v_id emp.empno%type := 7499; -- emp.empno%type 则是给v_id的类型设置为和emp表中empno的类型一致
-
%rowtype 行类型
declare v_row emp%rowtype; begin select * into v_row from emp where empno = 7499; dbms_output.put_line('EMPNO:'|| v_row.empno || ' EMPNAME:'|| v_row.ename); end;
-
record 记录类型
记录类型可以理解为自定义类型
declare -- 声明record类型 type emp_record is record( ename emp.ename%type, sal emp.sal%type, dname dept.dname%type ); v_test emp_record; v_id emp.empno%type := '&输入id'; begin select e.ename,e.sal,d.dname into v_test from emp e inner join dept d on e.deptno=d.deptno where e.empno = v_id; dbms_output.put_line('员工姓名:'|| v_test.ename||'基本工资:'|| v_test.sal || '部门名称:' || v_test.dname); end;
-
table 类型
我们在上面的一些类型,都只能操作单行的数据,但是如果我们要存储多行数据放到一个变量中,就需要用到table类型的变量了
在sql语句中使用into赋值时,前面需要加入 bulk collect关键字
declare --声明一个table类型,并指定表类型中下标的增长方式使用整数 type emp_table is table of emp%rowtype index by binary_integer; -- 声明一个table类型的变量 v_table emp_table; begin select * bulk collect into v_table from emp; dbms_output.put_line(v_table(1).ename); -- 单行输出,如果使用多行的话,就需要用到了循环 end;
PLSQL 条件分支 循环
条件分支
在java中的条件分支有 if-else,switch(expr1) case 而在plsql中也存在条件分支
IF-ELSE
在写else if时,要写成elsif (并不是elseif)
语法结构
if 条件表达式 then
语句块;
elsif 条件表达式 then
语句块;
else
语句块;
end if;
示例
declare
v_name varchar2(20) := '&输入姓名';
begin
if v_name = 'Fanxing' then
dbms_output.put_line('输入了 Fanxing');
elsif v_name = 'FX' then
dbms_output.put_line('输入了FX');
else
dbms_output.put_line('输入了'||v_name);
end if;
end;
CASE-WHEN
if else 和case when(相当于java中的switch case)
语法结构
case 变量
when 值 then
代码块;
when 值2 then
代码块;
else 值3 then
代码块;
end case;
示例
declare
v_s number(4) := '&输入s';
begin
case v_s
when 0 then
dbms_output.put_line('0');
when 1 then
dbms_output.put_line('1');
else
dbms_output.put_line(v_s);
end case;
end;
循环
LOOP循环
结构
loop
代码块;
if xxx then
exit; -- 满足条件跳出循环
end if;
end loop;
示例
declare
v_in number(5) :=1;
begin
loop
dbms_output.put_line(v_in);
if v_in = 100 then
exit;
end if;
v_in := v_in + 1;
end loop;
end;
IF循环
结构
for 变量 in [reverse] 范围[1..10]
loop
代码块;
end loop;
示例
declare
begin
-- 输出 1 到 100
for v_ins in 1..100
loop
dbms_output.put_line(v_ins);
end loop;
-- 输出 100 到 1
for v_ins in reverse 1..100
loop
dbms_output.put_line(v_ins);
end loop;
end;
WHILE循环
结构
while 条件
loop
代码块;
end loop;
示例
declare
v_in number(5) :=1;
begin
while v_in < 100
loop
dbms_output.put_line(v_in);
v_in := v_in +1;
end loop;
end;