PLSQL
SQL - DDL DQL DML TCL DCL
---- DBA(数据库管理员)
完成ARUD - 增删改查
星期三,2014年11月19日
PL/SQL 是过程语言(Procedure Language)与结构化查询语言(SQL)结合而成的编程语言
PL/SQL 是对 SQL 的扩展
支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构
可用于创建存储过程、触发器和程序包,给SQL语句的执行添加程序逻辑
与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性、灵活性和安全性
Pl/sql 是一种过程性语言具有:
变量和类型
过程和函数
控制结构
对象等…
具备pl/sql引擎就可以运行pl/sql所编写的程序,根据运行方式不同,通常将pl/sql所编写的程序分为:
匿名块
可以通过客户端直接在oracle服务器上执行
存储子过程
事先编译好存储在服务器上,需要时调用
分为函数和存储过程
触发器
事先编译好,特定事件发生自动调用
具备pl/sql引擎就可以运行pl/sql所编写的程序,根据运行方式不同,通常将pl/sql所编写的程序分为:
--匿名块
可以通过客户端直接在oracle服务器上执行
--存储子过程
事先编译好存储在服务器上,需要时调用
分为函数和存储过程
--触发器
事先编译好,特定事件发生自动调用
PL/SQL基本结构
一个PL/SQL单元称为一个“块”
三部分:
1.声明
2.可执行
3.异常处理
declare
变量等...
begin
可包括SQL语句和PL/SQL语句
SQL与PL/SQL区别:
SQL用来访问或处理数据库表中的数据
PL/SQL主要处理PL/SQL块中包含的数据及SQL语句
EXCEPTION标识-抓异常try-catch
出错时显示消息或执行其他错误
end; 标识结束
ps:declare 标识
在块中使用了任何变量,都必须在这一部分中指出
dbms_output.put_line('hello plsql');
------的含义 :使用dbms_output程序包的put_line函数显示输出
示例:
declare
v_name varchar2(40);
v_sex varchar2(3);
v_salary number (8,1);
begin
select sex into v_sex
from employee
where empno ='0002';
if v_sex ='男'then
select salary
into v_salary
from employee
where empno ='0002';
endif;
dbms_output.put_line(v_salary);
end;
ps:如果不能显示在控制器中,可能是因为 serveroutput没有打开,请做如下操作:
1. show serveroutput 显示当前状态
2. set serveroutput on 打开serveroutput
具体语法:
声明部分:
variablename [CONSTANT常量] datatype[(要加上长度)] [not null] [ := | DEFAULT value_or_expression];
:= default select .. Into .. Update|insert.. Returning ..into ..
1. 变量名位于前,变量类型位于后,用“:=”赋值
2.变量名称:
c_ 常量
g_ 全局变量
v_ 变量
3.前缀只是一种约定
4.不区分大小写
数据类型:
ps:
1. 变量没被初始化则为空值
2. 非数字数据类型声明的变量,初始化使用的值必须包括在单引号中
3. 当变量类型是常量时,必须赋初值
4. 当变量时not null时,也必须赋初值
5. 赋初值的符号要注意 ,是 :=
作用域:
可视域:
简单运算符:
运算符 |
运算 |
**,NOT |
求幂,逻辑非 |
+,- |
正、负 |
*,/ |
乘、除 |
+,-,|| |
加、减、连接 |
=,!=,<,>,<=,>=,is null,like, between,in |
比较 |
And |
与 |
or |
或 |
实例:
-- employee
empNO name sex age salary birthDate mobile year-工作时间
依据员工工作年限+薪
1+500
2+1000
3+10%
4+15%
>=5+20%
declare
v_empNo employee.empNo%type :='0001';
v_name employee.name%type;
v_salary employee.salary%type;
v_year employee.year%type;
begin
select name, salary, year into v_name, v_salary, v_year
from employee where empNo = v_empNo;
dbms_output.put_line('员工编号: '|| v_empNo ||' 姓名: '|| v_name ||' 原有工资: '|| v_salary ||' 工作年限: '||v_year);
if v_year =1then
v_salary := v_salary +500;
elsif v_year =2then
v_salary := v_salary +1000;
elsif v_year =3then
v_salary := v_salary + v_salary *0.1;
elsif v_year =4then
v_salary := v_salary + v_salary *0.15;
else
v_salary := v_salary + v_salary *0.2;
endif;
update employee set salary = v_salary, year = year +1where empNo = v_empNo
returning name, salary, year into v_name, v_salary, v_year;
dbms_output.put_line('员工编号: '|| v_empNo ||' 姓名: '|| v_name ||' 调薪后工资: '|| v_salary ||' 工作年限: '||v_year);
commit;
end;