其实Oracle的管理没传说中那么难,刚到地税局搞运维,我基本就不会Oracle,仅仅熟悉MysqL,这东西听听课,只要笔记做得好,根本不用往脑子里记,用的时候翻出来照着颜色往上敲,就这么简单,又不是搞开发,大家真别被这破东西吓住了,不信往下看,绝对看一遍半小时全部掌握,不用记,用的时候看颜色往上敲就行了。本人blog全部位原创,转载请注明源地址。
第四代语言
查询语句、dml数据操作语句、ddl数据定义语句
PL/sql
declare 从这里变量声明
begin
exception catch到exception
when others then ---其他异常进行执行,任何错误的捕获
end; 结束,必须有分号
set serveroutput on; 执行了这一句才能看到输出结果
dbms_output.put_line('要打印的字符') --不能打印布尔类型
变量声明:
declare
1 binary_integer 整数,主要用来计数,效率很高
2 number 整数 小数
3 char
4 varchar2
5 date
6 long
7 boolean 可以true 可以false 也可以null,建议使用时一定要给个初始值,否则为null
复合类型
table:
相当于java中的数组
type[说明一种新的类型]类型名is table of某表的一列%typeindex by binary_integer[下标使用binary_integer 下标可以是负数]
table定义变量:变量名类型名
record:
相当于java中的class
typeis record
(
字段名变量基本类型
);
record定义变量:类型名
record使用:变量名.字段名:= 值
--使用%rowtype声明record变量
declare
变量名 某表%rowtype --此时的该变量就是一个record类型,它的列就是这个表所有的列
--PL/sql语言的语句运用
1、select必须返回一条记录,并且只能返回一条记录,如果不用游标,就必须用into 给某变量
select某列,某列into变量名,变量名 from 表名
select的一种用法:
先用%rowtype声明一个record类型的变量AT表%rowtype
然后 select*intoAfrom T表; --就可以将该表中所有字段的值放到A里
sql%rowcount --刚刚执行的sql语句被影响了多少行
--PL/sql语言的DDL
begin
execute immediate'create table T ......' --外层有单引号如果语句中有单引号,改为双引号
end;
--PL/sql语言的分支
if (...) then
elsif (...) then ...; --elsif elsif的else没有"e"要注意
else ...;
end if;
--PL/sql语言的循环
loop
end loop;
forkin1...10loop
end loop;
reverseloop--逆序
whilej<10loop
...;
j:=j+1;
end loop;
exception
when某类异常[异常名,oracle中已经定义了一些异常类型]then
........;
when others then --其他异常类型没有捕获到的,这里全部捕获
........;
end;
*游标(重点)
select 返回的是一个结果集,游标是在这个结果集上方的一个指针,游标和迭代器差不多。
游标的定义:
declarecursor游标名is --声明一个游标
select * from 表名; --这个游标就会指在这个结果集的脑袋上
声明record类型变量游标名%rowtype; --可以存一条游标指向结果集的一条记录
begin
open游标名; --打开游标,打开时plsql才会真正的执行这条select语句
loop --遍历游标
fetch游标名intorecord类型变量; --从游标中拿出一条记录,放到(into)这个record变量中去,fetch后,游标自动往下移一条记录;
exit when(notfound) --判断什么时候结束,如果fetch指到尾部还fetch,指针一直在尾部
dbms_output.put_line(游标名.字段名);
end loop;
while 循环写法:
declarecursor游标名is --声明一个游标
select * from 表名; --这个游标就会指在这个结果集的脑袋上
声明record类型变量游标名%rowtype; --可以存一条游标指向结果集的一条记录
begin
open游标名; --打开游标,打开时plsql才会真正的执行这条select语句
fetch游标名intorecord类型变量; --从游标中拿出一条记录,放到(into)这个record变量中去,fetch后,游标自动往下移一条记录;
while (游标名%found) loop
dbms_output.put_line(游标名.字段名);
fetch游标名intorecord类型变量;
end loop;
for循环的写法
declare
cursor 游标名is
select * from 表名;
begin
for record变量名 in 游标名 loop --用for循环cursor不用open,他会帮你打开,也不需要fetch,for自动帮你fetch;record变量也不需要声明
dbms_output.put_line(record变量名.表的字段名);
end loop; --cursor也不需要关闭,for自动帮你关闭
end;
所以for循环是最简单的循环,也不需要判断cursor是否结束。不容易出错
游标四属性:
1、isopen
2、notfound 最近的一条fetch语句没有返回记录
3、found 找着记录了,返回true
4、rowcount 当前返回的总数是多少
带参数的游标
declare
cursor 游标名(参数1,参数2 ...) is
select 列1,列2 ... from 表名 where 某列1=参数1 and 某列2=参数2;
例子:
declare
cursor c(v_deptno emp.deptno%type,v_job emp.job%type)
-- 参数1 emp表的deptno列类型 参数2 emp表的job列类型
可更新的游标(update )
例:
declare
cursor c is
select * from emp2for update;
begin
for v_temp iscloop
if(v_temp.sal<2000) then
update emp2 set sal = sal *2 wherecurrent ofc; --在当前游标位置更新
elsif (v_temp.sal =6000) then --等于号,赋值时是 :=
delete from emp2 wherecurrent ofc;
end if;
end loop;
commit;
end;
存储过程
带有名字的PL/sql程序块
除了create or replace procedure 存储过程名 is替代了 declare 之外,其他语句与PL/sql的写法一模一样
执行 存储过程:
exec 存储过程名
或者:
begin
存储过程名;
end;
/
带参数的存储过程
in 传入参数 只能传入,不能用
out 传出参数 可以运算赋值传出
create or replace procedure 存储过程名
(参数1 in 类型,参数2 类型,参数3 out 类型,参数4 in out 类型)
-- in 默认in out 既传入也传出:传入同时可以但与运算传出
is
create or replace function 函数名 (参数1 类型,参数2 类型)
return 类型
is
begin
... ...
end;
触发器
create or replace trigger 触发器名
数据库设计三范式
范式:数据库的一个规则,减少冗余
三范式的规则:不存在冗余数据
第一范式:1 任何表都要有主键 2 列不可分
第二范式:多对多表设计所要遵循的原则:当一张表里有多个字段作为主键,非主键不能依赖于部分主键,即:不能存在部分依赖
第三范式: