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函数显示输出
示例:
declarev_name varchar2(40);v_sex varchar2(3);v_salary number (8,1);beginselect sex into v_sexfrom employeewhere empno ='0002';if v_sex ='男'thenselect salaryinto v_salaryfrom employeewhere 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 |
或 |

实例:
-- employeeempNO name sex age salary birthDate mobile year-工作时间依据员工工作年限+薪1+5002+10003+10%4+15%>=5+20%declarev_empNo employee.empNo%type :='0001';v_name employee.name%type;v_salary employee.salary%type;v_year employee.year%type;beginselect name, salary, year into v_name, v_salary, v_yearfrom employee where empNo = v_empNo;dbms_output.put_line('员工编号: '|| v_empNo ||' 姓名: '|| v_name ||' 原有工资: '|| v_salary ||' 工作年限: '||v_year);if v_year =1thenv_salary := v_salary +500;elsif v_year =2thenv_salary := v_salary +1000;elsif v_year =3thenv_salary := v_salary + v_salary *0.1;elsif v_year =4thenv_salary := v_salary + v_salary *0.15;elsev_salary := v_salary + v_salary *0.2;endif;update employee set salary = v_salary, year = year +1where empNo = v_empNoreturning name, salary, year into v_name, v_salary, v_year;dbms_output.put_line('员工编号: '|| v_empNo ||' 姓名: '|| v_name ||' 调薪后工资: '|| v_salary ||' 工作年限: '||v_year);commit;end;