文章目录
一、PLSQL块
1. 块的组成
- 匿名块
- 过程,函数和包
- 触发器
2. plsql块的基本组成
- declare 定义部分:声明变量,常量,异常,游标
- begin 可执行部分:以end结束
- exception 异常处理部分
3. plsql语法
declare
-变量、常量、游标、异常、用户自定义的特殊类型
begin -必须
-SQL语句
-PL/SQL语句
exception -可选
-错误发生时的处理动作
end; -必须
例子:
declare
v_name varchar2(10);--每个变量以分号结束
v_job varchar2(10);
begin --只能返回一条记录
select ename,job into v_name,v_job --into是将查询的结果给变量赋值
from emp
where empno=7369;
end;
二、变量的命名规则
- 至多有30个字符
- 不能是保留字
- 必须以字母开头
- 包含字母、$、_、#、数字符号
三、变量的惯例命名
标识符 | 惯例 | 例子 |
---|---|---|
Variable(变量) | v_name | v_sal |
Constant(常量) | c_name | c_company_name |
Cursor(游标) | name_cursor | emp_cursor |
Exception(异常) | e_name | e_too_many |
Table(表类型变量) | name_table | order_total_table |
Record(记录型变量) | name_record | customer_record |
SQL*Plus substitution parameter(形式参数) | p_name | p_sal |
SQL*Plus global variable(全局变量) | g_name | g_year_sal |
四、变量的类型
- 标量型
例子:
declare
v_date date;
v_deptno number(2) not null := 10; --如果加上not null约束,那么必须要赋初始值
v_name varchar2(10) not null := 'zs'; --字符类型必须使用单引号
c_job constant varchar2(10) not null := '研发'; --constant约束的为常量,常量必须要赋初始值,且其值不可变
v_valid boolean not null := true; --boolean类型有三个变量:true,false,null
- 复合型:记录和数组
- 引用型
- lob型
五、数据库中的列名与变量名不建议相同
案例:
declare
v_job varchar(10);
v_empno emp.empno%type := 7369; --%type:自动与表中字段类型匹配
begin
select job into v_job
from emp
where empno=v_empno;
end;
注意:匿名块只能检索一条数据
六、输出查询的数据:dbms_output.put_line()
案例:
declare
v_job varchar(10);
v_empno emp.empno%type := 7369; --%type:自动与表中字段类型匹配
begin
select job into v_job
from emp
where empno=v_empno;
dbms_output.put_line('工作岗位是:'||v_job); --通过||拼接
end;
七、注释
- 单行注释:–
- 多行注释:/* */
八、数据类型转换
转换函数:to_char to_date to_number
- to_char转换
declare
v_date varchar2(15);
v_empno emp.empno%type := 7369;
begin
select to_char(hiredate,'yyyy-mm-dd') into v_date
from emp
where empno=v_empno;
dbms_output.put_line('时间是:'||v_date);
end;
- 案例:显示员工号为7369的员工及部门号
declare
v_empno emp.empno%type := 7369;
v_ename emp.ename%type;
v_deptno emp.deptno%type;
begin
select ename,deptno into v_ename,v_deptno
form emp
where empno=v_empno;
dbms_output.put_line('员工名:'||v_ename||'部门号:'||v_deptno);
end;
- 案例:返回指定部门所有员工的工资总额
declare
v_sal_sum emp.sal%type; --接收sum(sal)的值
v_deptno emp.deptno%type := 10;
begin
select sum(sal) into v_sal_sum
from emp
where deptno = v_deptno;
dbms_output.put_line('部门'||v_deptno||'的工资总额是:'||v_sal_sum);
end;
九、实现增删改
1. 增
declare
v_empno copy_emp.empno%type := 3;
v_ename copy_emp.ename%type := '张三';
v_job copy_emp.job%type := '研发';
v_deptno copy_emp.deptno%type := 10;
begin
insert into copy_emp(empno,ename,job,deptno)
values(v_empno,v_ename,v_job,v_deptno);
end;
2. 改
declare
v_sal emp.sal%type := 800;
v_job emp.job%type := 'ANALYST';
begin
update emp
set sal=sal+v_sal
where job=v_job;
end;
3. 删
declare
v_name emp.ename%type := '张三';
begin
delete from emp
where ename=v_name;
end;