--===================================PLSQL基础篇============================
-- 数据类型:
---- 标量类型:数字 number,字符 varchar,varchar2,char,日期 ,
-- 布尔 boolean (true,false,null)(存储单个值)
--- 复合类型:record,集合类型 (存放多个值的变量)
--- 参照类型:cursor
--- LOB 类型:存储大数据类型(BFILE,BLOB,CLOB,NCLOB);
--============ ===================================
--- EMP , DEPT 表;
--===============================================
--变量声明
declare
v_realName varchar2(20);
-- := 赋值符号
v_baseCost number(7,2) :=5.9; --定义number类型,赋值5.9
v_count binary_integer :=0;
v_start boolean not null default false;
begin
select 'hello ' into v_realname from dual; -- 给 v_realName变量赋值
dbms_output.put_line('v_realName--'||v_realName);
dbms_output.put_line('v_baseCost---'||v_baseCost);
dbms_output.put_line('v_count---'||v_count);
end;
-- 执行 用 " / " ,下述同样操作
--dbms_output.put_line('v_start---'||v_start); -- boolean类型的不能输出,不能插入,不能将列值保存到boolean变量中
-- 只能对boolean变量执行逻辑操作(见后逻辑语句)
-- %type: 变量具有数据库的表中某列或其它变量相同的类型
declare
v_name emp.ename%type;
begin
select ename into v_name from emp where empno = 7900;
dbms_output.put_line('v_name---'||v_name);
end;
-- Record类型:处理单行多列问题
-- record变量的引用:记录类型变量的属性引用方法 " . "
declare
--t_emp_rec是记录类型
type t_emp_rec is record (
name emp.ename%TYPE, -- name 是t_emp_rec的成员.
job emp.job%TYPE);
emp_rec t_emp_rec; -- 声明--t_emp_rec记录类型的变量
begin
select ename , job into emp_rec from emp where empno = 7900; -- 读取数据到record类型
-- select ename , job , sal into emp_rec from emp where empno = 7900; -- error,没有足够的列值
dbms_output.put_line('emp_rec-name---'||emp_rec.name);
dbms_output.put_line('emp_rec-job---'||emp_rec.job);
end ;
-- 用%rowtype来定义record类型(作用:简化record的定义).
-- 当使用%rowtype定义记录类型时,record成员的名称和类型与表或者视图的列名称和类型完全相同.
declare
v_emp emp%rowtype ; -- v_cost的名称和类型和 cost表一样
begin
select * into v_emp from emp where empno = 7900; -- 读取数据到record类型
dbms_output.put_line('v_emp-name---'||v_emp.ename);
end ;
--================================================================
--=========流程控制:=============
/*
if 布尔表达式
then xxxx
elsif 布尔表达式
then xxxx
else xxxx
end if;
*/
declare
v_var boolean not null default false;
v_int integer :=5;
begin
if v_var
then dbms_output.put_line('v_var: true');
else
dbms_output.put_line('v_var: false');
-- then dbms_output.put_line('v_var: false'); error
end if; --必须结束if
-- 多个if嵌套
if(v_int > 5)
then dbms_output.put_line('v_int: >5');
elsif (v_int > 2)
then dbms_output.put_line('v_int: >2');
else
dbms_output.put_line('v_int: else');
end if;
end ;
/*
loop循环:
loop
语句 1 ;
语句 2;
exit when 表达式;
end loop;
*/
declare
v_int integer :=3;
begin
loop
dbms_output.put_line('v_int:'||v_int);
v_int :=v_int+1;
if(v_int > 10)
then exit; --退出
end if;
--exit when v_int > 10; 可以出现在循环的任何位置,注意是when ,不是then;
end loop;
end;
--where循环:
/*
while 布尔表达式 loop
语句1;
语句2;
end loop;
*/
declare
v_int integer :=1;
begin
while v_int < 10 loop
dbms_output.put_line('v_int:'||v_int);
v_int :=v_int+1;
end loop;
end;
/*
for循环:
for 循环计数器 in 下限 .. 上限 loop
语句1;
语句1;
end loop;
*/
declare
v_int integer :=0;
begin
for v_int in 1 .. 10 loop
-- 循环 包括1,包括10;
dbms_output.put_line('v_int:'||v_int);
--v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;
-- for循环 倒序
declare
v_int integer :=10;
begin
for v_int in reverse 1 .. 10 loop
dbms_output.put_line('v_int:'||v_int);
--v_int :=v_int+1; v_int不能用来作为赋值目标
end loop;
end;
--Notice: v_int 是 1.. 10循环中的每个变量,不能用来作为赋值目标
-- 把 v_int 初始化为5,输出的结果跟初始化为0是一样.类似如下的java程序:
int j = 5;
for (j = 1 ;j <= 10 ; j++){
System.out.println(j); // 1 .... 10;
}
--NULL
--NULL语句不会执行任何操作,并且会直接将控制传递到下一条语句,使用NULL语句主要是提高程序的可阅读性
DECLARE
v_sal emp.sal%TYPE;
v_ename emp.ename%TYPE;
BEGIN
SELECT ename,sal into v_ename,v_sal FROM emp WHERE empno=7900;
IF v_sal<3000 then
UPDATE emp SET comm=sal*1.2 WHERE ename=v_ename;
ELSE
NULL;
END IF;
END;