这是我总结的新学的oracle数据库,适合学过的新手复习


----------------------------------------------------------------------------------
                    05_Oracle
----------------------------------------------------------------------------------

每周一看 升官发财 (0^0)

DDL数据定义语言 语句自动提交
    create drop truncate alter
DML数据操作语言 用commit,rollback结束当前事物
    update delete insert
TCL事务控制语言 :commit rollback savepoint(保留点)
DCL数据控制语言 grant rowke

d:    用数字表达一周内的第几天 1代表周日
day:    全拼表达星期几(sunday)
month:    全拼表达月(march)
mon:    简拼表达月(mar)
months_between('',''):    相差多少月
add_months(,n):        加n个月
next_day('','星期'):    出现下个参数的日期
last_day(''):        同月的最后一天

数据类型(day01-21页)
number
char
varchar2(一定要有值)(空格敏感)

exists         存在
default     缺省(默认)
sysdate     系统时间
show user     显示用户名
rollback     回滚(到上次提交后)
commit         提交(旧事物的结束,新事物的开始)
where         过滤行
group by     分组
having         过滤组
order by     排序(自然小-->大,asc升序)desc降序
||         拼接运算符
distinct     消除重复行
case 1 when 2 then 3 when 4 then 5 else 6 end;
decode(1,2,3,4,5,6)
cross join    
inner join on    内连接
outer join(left join,right join) on
union/union all 并
intersect     交
minus         差
rownum         伪列 行标号1,2,3...
rowid        伪id
constraint     给约束写个名字,可以不写(也是系统自动创建
        索引的名字)
primary key     主键约束
unique key     唯一约束
not null    非空约束
check(col_name ....)
references foreign key   
多个表级约束用','分隔.
外键后面加:
on delete cascade;delete父表时将删除子表对应的行
on delete set null;delete 父表时将子表对应的列赋值为 null
transaction 事物(undo segment 未提交保存的地方)
锁 day06_50页
synonym 同义詷    create synonym ytf for account;
inline view
view 约束 with check option,with read only;
index (index segment,rowid)


单行函数
数值函数:round,trunc
转换函数:to_char(,''),to_date(,''),to_number
字符类型:upper 大写,lower 小写,initcap 首字母大写,
         concat 拼接 length lpad 右对齐 rpad
一般函数  nvl,ltrim/rtrim(去空格的函数 fm也行写字符串里面)
组函数
max,min,count,sum,avg

--过滤条件
in like is_null between_and =
and or not    <>,!=,^=
col_name like 'h\_%' escape '\'; '找h_开头的
(case when 1=2... then 3...
    when 1=4...then 5...
    else 6...
end)=decode(1,2,3,4,5,6);

from-where-group_by-having-select-order_by
--执行顺序

alter session set nls_date_format=
    'yyyy mm dd hh24:mi:ss';
--改变session中的日期格式
alter table tab_name drop constraint_name/primary key;
--删除约束/删除主键约束
alter table tab_name drop(col_name)
--删除一列
alter table tab1_name add 表级约束语法(constraint constraint_name foreign key(col_name) references tab2_name(col_name))
--增加约束
alter table tab_name add(c1 char)
--增加一列
alter table tab_name modify(col_name null);
--将not null改为null列
alter index index_name rebuild;
--重建索引
alter procedure/package/function p_name compile;
--编译过程/包/函数
alter package pkg_ytf compile body;
--编译包体
alter trigger trig_name compile;
--编译触发器
alter trigger trig_name disable/enable
--触发器无效/有效
alter table tab_name disable/enable all triggers;
--该表所有触发器无效/有效


create index index_name on table_name(col);
--按照某表的列创建索引
create table table_name (
 col_name1 类型,col_name2 类型....);
--创建表
create table table_name as select...;
--创建表,类型和数据与子查询结果一样
create or replace view as select....;
--创建视图
create sequence se_name    start with 1(缺省 1) maxvalue 5
        cache 3    ; (day309.sql(day08 42页面))
--创建序列号
create or replace procedure p_name(
      v_name in/out/in_out type...)]is[可以定义变量]     
      begin exception end;
--创建过程
create or replace function f_name(...) return type is
            [可以定义变量] begin end;
--创建函数
create or replace package pkg_name is end;
--创建包
create or replace package body pkg_name
  is begin <初始化代码>  end;
--创建包体


insert into table_name values();
--添加一行数据
insert into table_name select....;
--添加子查询的数据

delete from table_name where...;
--删除行,表数据删除高水位线没动,表占的空间没有释放,可以回滚
drop table tab_name purge;
--删除表
drop index/view/sequence/procedure/function/package _name;
--删除索引/视图/序列号
truncate table table_name;
--删除所有记录,DDL语句自动提交,没有回滚,空间释放,不可以回滚

update table_name set col_name=....where...;
--改数据

select * from table_name;
select * from (select....);
--查询


/******************PL/SQL*****************************/
--procedure language/SQL
4个关键字 declare begin exception end
type rc_name is record(变量名1 类型1,变量名2 类型2...);
--记录类型的声明
type type_name is table of val_type index by key_type
--关联数组声明 index_by_table
关联数组的方法:exists(i)第i个元素是否存在,避免抛出异常
     count返回联合数组的元素个数,空数组值是0
     first/last 返回最小/最大下标号,为空则返回 null
     next(n)/prior(n)返回第n个元素的前一个元素下标和后一个
            元素的下标,如果不存在,则返回 null
     trim(n) 从最后一个元素删除n个元素
     delete 删除所有元素 delete(n)删除第n个 delete(m,n)删除m到n
遍历数组,由于下标可以不连续,要判断元素是否存在v_name.exists(i)


v_id account.id%type(v_id的类型是表account中id列的类型)
v_a account%rowtype(v_a的类型是记录类型,包含account中所有列的类型)
if .. then end;
if .. then .. else .. end;
if .. then elsif then .. else .. end;
--分支
loop exit when .. end loop;
while .. loop .. end loo;
for i in 下限..上限 loop...end loop;
--循环
动态语句:execute immediate 'DDL,DML';
cursor cur_name is select * from account;(返回0或者多条记录)
对cursor %isopen cursor是open其值为true
    %notfound %found%rowcount
隐式cursor SQL%....
cursor--open--fetch--close--用cursor的顺序

异常:    ORACL预定义异常
NO_DATA_FOUND 没有数据 too_many_rows多行 invalid_cursor 没open
zero_divide 除0  dup_val_on_index重复索引  value_error值类型不对
    非预定义异常:先声明异常,绑定异常
    pragma exception_init(e_name,-0001)
    用户自定义异常:先声明异常,绑定异常,抛出异常
    (raise e_name),再捕获
sqlcode:返回当前错误代码 sqlerrm:返回当前错误的消息文本,用文件保存
procedure 参数是形参in不能作赋值目标 out有个返回值 in_out
想要在存储过程中用DDL语句,要DBA直接给用户授权
    grant create table to user_name;
调用其他用户的过程,必须由过程的属主授予权限
    grant execute on proc_name to user_name
exec p_name;可以直接执行一个过程/函数...
绑定变量 variable a number; exec :a:=1;
print :a;打印绑定变量的值

难点: trigger 触发器 (enable,disable)
触发时间:before,after
触发事件:insert,update,delete
触发器类型:statement,row
触发顺序:before_statement before_row after_row after_statement
create or replace trigger tri_name
  before/after insert/update/delete
  on tab_name
  for each row
  declare
  begin
    <执行语句>
  end;
 
           :old       :new
insert    null          要插入的值
update   原始值        新值
delete   原始值        null
:old,:new会在当条SQL语句(包含trigger)执行完毕后才会改变,不是瞬发的


create or replace procedure
1 匿名程序(declare begin exception end)。
2 过程头(in;out;in out;形参,实参,对于out,in out 型参数要求实参必须是变量)。
3 用户 角色 权限 怎么在存储过程中正确执行DDL语句。
4 变量(for 循环变量 局部变量 全局变量 绑写变量)。
5 SQL语句分析过程soft parse 软分析,hard parse硬分析,程序员要写带定变量的规范的sql。
6 静态sql,动态sql。静态sql效率高。
PL/SQL中的静态SQL
  oracle 在解析sql时会把plsql中定义的变量转为绑定变量,减少了硬分
  析次数
  server process将执行完的SQL cache起来,cursor不关闭,当再次执行
  SQL时,不需要软分析
  过程中的参数会自动转化为绑定变量

匿名块
 数据类型(记录 集合 遍历 方法)变量 控制结构SQL(ddl dml select)
 cursor 表态sql动态sql 绑定变量sql(编译(soft parse;hard parse)
 执行)session exception()
有名块
 procedure function 参数问题
 package变量(局部 全局 绑定)
 trigger dml(update insert delete)
PL/SQL的特点
 结构化模块化编程
 良好的可移植性 跨平台(操作系统)
 良好的可维护性
 提升系统性能
 (最大问题)不便于向异构数据库移植应用程序


--面试 一定要知道的 添彩哦
truncate table table_name;--删除大表快
FTS全表扫描,找到HWM高水位线,之下所有的Date bolck
scan based index基于索引的扫描
transaction 事物
server process oracletarena
每创建一个连接,oracle服务器端多一个server prcess进程,
oracle中多了一个session
数据库上的并发连接
JDBC与PL/SQL的优缺点:静态 动态 的优缺点
编译(软 硬分析) 执行

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值