oracle 视频笔记整理(3)

index 索引:当加主键约束或唯一约束,自动添加索引

  建立索引:

 

create index index_stu_email on stu(email); 

 

  删除索引:

 

drop index index_stu_email; 

 

 查看索引:

 

select index_name from user_indexes;

 

 

 增加读取的效率,降低修改的效率。


sequence 序列:seq.nextval下一个值 seq.currval当前值

建立序列:

 

create sequence seq start with 1 increment by 1 NOMAXVALUE NOCYCLE CACHE 10;

 

  

附加:hibernate中配置sequence

 

 

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="Student" table="Student"> <id name="student_id" column="student_id" type="java.lang.Integer"> <generator class="native"> <param name="sequence">student_sequence</param> </generator> </id> <property name="student_name" column="Student_Name" type="java.lang.String"/> <property name="student_age" column="Student_Age" type="java.lang.Integer"/> </class> </hibernate-mapping> 

 

三范式:不存在冗余数据

第一范式:有主键,列不可分
第二范式:当一张表中有过个字段做联合主键,非主键不能存在部分依赖将一张表分开
第三范式:不能存在传递依赖

 

 

 

plsql:oracle内部的编程语言
sqlserver:transactsql

declare:声明变量
begin:程序开始
exception:例外
end:程序结束;


打开输出:
   

set serveroutput on;
 

dbms_output.put_line('error'); 

  

 
赋值: :=

例子:

 

declare v_num number:=0;//定义变量,赋值 begin v_num:=2/v_num; dbms_output.put_line(v_num);//具体过程操作 exception//捕捉异常 when others then dbms_output.put_line('error');//打印错误 end; / 

 

变量声明
     --注释

变量类型

  binary_integer:整数,用来技术
  number:数字类型
  char:定长字符串
  varchar2:变长字符串
  date:日期
  long:长字符串
  boolean:true,false,null

例子

 

delare v_temp number(1); v_date date:=sysdate; v_pi constant number(3,2):=3.14; v_valis boolean:=false;

 

--利用表字段定义变量属性 %type
   

 

v_salary emp.empno%type; 

  

 

复杂变量

 

table:相当于java里的数组 type:定义一中新类型 table:类型名


  declare
      type    type_table_emp_empno   is table of   emp.empno%type  index by   binary_integer
  --用上面定义的类型定义变量 
 

  v_empnos type_table_emp_empmo;     begin v_empnos(0):=0; v_empnos(1):=1; v_empnos(-1):=2;     end; 

 

 

 record:有点类似于类

 

declare type_record_dept is record ( deptno dept.deptno%type, dname dept.dname%type, loc dept.loc%type ); --用%rowtype类型声明record类型 -- v_temp dept%rowtpe v_temp type_record_dept; begin v_temp.deptno:=50; v_temp.dname:='wxy' ; end; plsql:select语句必须返回一条语句,必须有into变量 declare v_ename emp.ename%type; v_sal emp.sal%type; begin select ename,sal into v_ename,v_sal from emp where empno=7369; dbms_output.put_line(v_ename||''||v_sal); end; 

 

 plsql中执行ddl语句execute immediate


 

begin execute immediate 'create table T(nnn varchar2(10) default ''aaa'')'; end; 

  
分支语句:if   then elsif then else end if;

 

declare v_sal emp.sal%type; begin select sal into v_sal from emp where empno=7369; if(v_sal<1200) then dbms_output.put_line('low'); elsif(v_sal<2000) then dbms_output.put_line('middle'); else dbms_output.put_line('high'); end if; end;

  

循环语句:

1.loop   exit when   end loop;
2.while  loop  end loop;
3.for k in 1..10 loop
  end loop;
  for k in reverse(逆序循环) 1..10 loop
  end loop;


错误处理:show error 编译错误


例外的类别:too_many_rows(数据太多),no data_found(没有数据)
           
     

exception when too_many_rows then when others then

 

 

 

传统记录错误:

建一个表存储错误

 

create table errorlog ( id number primary key, errcode number, errmsg varchar2(1024), errdate date );

 

 

--建一个序列,指向id create sequence seq_errorlog_id start with 1 increment by 1;

 

 

  

--创建程序

declare v_deptno dept.deptno%type:=10; v_errcode number; v_errmsg varchar2(1024); begin delete from dept where deptno=v_deptno; commit; exception when others then rollback; v_errcode:=SQLCODE; v_errmsg:=SQLERRM; insert into errorlog values (seq_errorlog_id.nextval,v_errcode,v_errmsg,sysdate); commit; end; 

  
  


游标:cursor指针

属性

 c%isopen:是否打开
 c%notfound:到了最后一条
 c%find:能找到记录

 

declare cursor c is select * from emp; v_emp c%rowtype; begin --打开游标 open c; --开始循环 loop --取一条记录 fetch c into v_emp; --当找不到记录了,退出 exit when (c%notfound); dbms_output.put_line(v_emp.ename); --结束循环 end loop; --关闭游标 close c; end; 

 

while循环: declare     cursor c is      select * from emp;      v_emp c%rowtype;  begin      open c;      fetch c into v_emp;      while(c%found) loop      dbms_output.put_line(v_emp.ename);      fetch c into v_emp;      end loop;      close c;   end;

 

 

for循环: --不需要open close --不需要定义变量 --不需要判断结束 declare    cursor c is       select * from emp; begin     for v_emp in c loop     dbms_output.put_line(v_emp.ename);     end loop; end; 

 

 

 带参数的游标:current of c:指向当前记录 

 

declare cursor c(v_deptno emp.empno%type,v_job emp.job%type) is select ename,sal from emp where deptno=v_deptno and job=v_job; begin for v_temp in c(30,'CLERK') loop dbms_output.put_line(v_temp.ename); --current of c 的应用 if(v_temp.sal<2000) then update emp ser sal=sal*2 where current of c; elsif(v_temp.sal=5000) then delete from emp where current of c; end if; end loop; end; / 

 

 

 
存储过程:
--建立存储过程 in 传入参数(默认),out 传出参数 in out既传入又传出
--单独执行存储过程exec p;
--显示错误 show error;

 创建:

 

create or replace procedure p (v_a in number,v_b number,v_ret out number,v_temp in out number ) is begin if(v_a>v_b) then v_ret:=v_a; else v_ret:=v_b; end if; v_temp:=v_temp+1; end;

 

--调用

 

declare v_a number:=3; v_b number:=4; v_ret number; v_temp number:=5; begin p(v_a,v_b,v_ret,v_temp); dbms_output.put_line(v_ret); dbms_output.put_line(v_temp); end;

 

 

 

--函数

create or replace function sal_tax(v_sal number) --声明返回值类型 return number is begin if(v_sal<2000) then return 0.10; elsif(v_sal<2750) then return 0.15; else return 0.20; end if; end;

 

 --调用函数
   

 

 

select sal_tax(sal) from emp;

 


触发器:

 for each row
 对每行的操作都做记录

 

 

create table emp2_log ( uname varchar2(20), action varchar2(10), atime date );

 

 

create or replace trigger trig after insert or delete or update on emp2 for each row begin if inserting then insert into emp2_log values(USER,'insert',sysdate); elsif updating then insert into emp2_log values(USER,'update',sysdate); elsif deleting then insert into emp2_log values(USER,'delete',sysdate); end if; end;
 

 

 

 rollback;自动退回。

 drop trigger trig; 删除触发器

 

 

--------利用触发器,修改外键

 

create or replace trigger trig after update on dept for each row begin update emp set deptno=:NEW.deptno where deptno=:OLD.deptno; end; 

 

例子:

 

 

create table article( id number primary key, cont varchar2(4000), pid number, isleaf number(1), alevel number(2) );

 

    插入值

  

 

 

insert into article values(10,'护士是蚂蚁',9,1,3);

 

  

create or replace procedure p_tree(v_pid article.pid%type,v_level binary_integer) is cursor c is select * from article where pid=v_pid; v_preStr varchar2(1024):=''; begin for i in 0..v_level loop v_preStr:=v_preStr||'---'; end loop; for v_article in c loop dbms_output.put_line(v_preStr||v_article.cont); if(v_article.isleaf=0) then p_tree(v_article.id,v_level+1); end if; end loop; end; 
 

 

   

 

 

 

exec p_tree;

 


  

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值