`
zhouxianglh
  • 浏览: 268133 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Oracle 学习笔记

阅读更多
select * from user_tables;
drop table t_user_role;
drop table t_user;
drop table t_role;
drop sequence user_seq;

create sequence user_seq--建立序列(自动增长列)
increment by 1 --自增系数
start with 1 --初始值
--maxValue 最大值,noMaxValue 无最大值
--minValue 最小值,nominValue 无最小值
--cycle 循环取值 ,nocycle 不循环取值
--cache 缓冲区
;

create table t_user
(
 userId number(10) primary key,
 userName varchar2(16) not null
);
insert into t_user values(user_seq.nextval,'good');
insert into t_user values(user_seq.nextval,'haha');
insert into t_user values(user_seq.nextval,'flyCat');
insert into t_user values(user_seq.nextval,'fullCat');
select * from t_user;
select user_seq.currval from dual;

create table t_role(
 roleId number(10) primary key,
 roleName varchar(16) not null
)
partition by hash(roleId) --散列分区
partitions 2 --分区数目
--分区方式2(自己指定分区名)
--partition by hash( roleId )
--(
--          partition role_p1,
--          partition role_p2
--);
;

insert into t_role values(user_seq.nextval,'一级');
insert into t_role values(user_seq.nextval,'二级');
insert into t_role values(user_seq.nextval,'三级');
insert into t_role values(user_seq.nextval,'四级');
select * from t_role;

create table t_user_role
(
 infoId number(10) primary key,
 userId number(10) not null,
 roleId number(10) not null,
 remark varchar2(16) not null,
 foreign key (userId) references t_user(userId),
 foreign key (roleId) references t_role(roleId) 
)
partition by range(infoId)--范围分区
subpartition by list(userId) --这里用到复合分区,首先必须是范围分区,然后是列表分区
(
 partition p1 values less than(100)
 (
  subpartition p1s1 values(1),
  subpartition p1s2 values(3),
  subpartition p1s3 values(default)--剩下的结果存放在这里
 ),
 partition p2 values less than(200)
 (
  subpartition p2s1 values(2),
  subpartition p2s2 values(4),
  subpartition p2s3 values(default)
 ),
 partition p3 values less than(maxvalue)
 (
  subpartition p3s1 values(default)
 )
);
insert into t_user_role values(user_seq.nextval,1,5,'手动输入');
insert into t_user_role values(user_seq.nextval,1,6,'手动输入');
insert into t_user_role values(user_seq.nextval,1,7,'手动输入');
insert into t_user_role values(user_seq.nextval,1,8,'手动输入');
insert into t_user_role values(user_seq.nextval,2,5,'手动输入');
insert into t_user_role values(user_seq.nextval,2,6,'手动输入');
insert into t_user_role values(user_seq.nextval,4,5,'手动输入');
select * from t_user_role;

create public t_u_r for t_user_role;--创建同义词
select * from t_u_r;
--联合查询
select tur.infoId as id, tu.userName as userName,tr.roleName as roleName from t_u_r tur,t_user tu,t_role tr where tur.userId = tu.userId and tur.roleId = tr.roleId;
--创建视图
create view v_info as select tur.infoId as id, tu.userName as userName,tr.roleName as roleName from t_u_r tur,t_user tu,t_role tr where tur.userId = tu.userId and tur.roleId = tr.roleId;
select * from v_info;
create view v_info(id ,userName,roleName) as select tur.infoId as id, tu.userName as userName,tr.roleName as roleName from t_u_r tur,t_user tu,t_role tr where tur.userId = tu.userId and tur.roleId = tr.roleId;
select * from v_info;

--创建索引
create index ind_info on t_u_r(remark);
create inde1,m v_now; ind_info2 on t_u_r(userId,roleId,remark);--组合索引
create unique index i1,m v_now;d_info3 on t_role(roleName);--唯一索引
create index ind_info4 on t_use1,m v_now;(userName) reverse;--反向索引
--create bitmap index ind_info5 on t_u_r(1,m v_now;emark);--位图索引
create table t_sex

(
 sexId number(2) primary key,
 sexName varchar(2) not null
) organization index;--索引组织表(查询快,修改慢)

--触发器
create trigger tri_user --sys 用户数据中不可建
before insert on t_user --before ,after ,instead of 
for each row--行级触发器,不加则为语句级触发器
begin
 dbms_output.put_line('trigger Result:'||:NEW.userId||'  '||:NEW.userName);--:NEW 代表新数据 :OLD 代表旧数据条件表达示如:while 中不需要':'
end;

--pl/sql 语句
begin 
 dbms_output.put_line('hello '||'world');
end;

declare
 uName t_user.userName %type;--当前列的数据类型
 uResult t_user %Rowtype;--%rowtype 代表一行,类似于面向对象中的对象
 type uType is record(mId t_user.userId %type,mName t_user.username %type);--自定义类型
 myResult uType;--使用自定义类型
begin
 uName := 'goodboy';
 dbms_output.put_line('my name is '||uName);
 select userName into uName from t_user where userId = 4;
 dbms_output.put_line('Result:userId = 4 ,userName = '||uName);
 select * into uResult from t_user where userId = 1;
 dbms_output.put_line('Result:userId = '||uResult.userId ||' ,userName = '|| uResult.userName);
 select * into myResult from t_user where userId = 1;
 dbms_output.put_line('Result:mId = '||myResult.mId ||' ,mName = '|| myResult.mName);
end;

declare 
 uNumber number(4) default 5;--默认值
begin
 dbms_output.put_line('Result:uNumber ='||uNumber);
 if uNumber > 30 then
  uNumber := uNumber - 10;
  dbms_output.put_line('Result:if uNumber >30, uNumber - 10='||uNumber);
 elsif uNumber < 10 then
  dbms_output.put_line('Result:if uNumber >10, uNumber + 10='||(uNumber + 10));
 else 
  dbms_output.put_line('Result:if uNumber, uNumber='||uNumber);
 end if;
 
 case uNumber--case 用法1
  when 30 then dbms_output.put_line('Result:case uNumber =30, uNumber = '||uNumber);
  when 10 then dbms_output.put_line('Result:case uNumber =10, uNumber = '||uNumber);
  else dbms_output.put_line('Result:case uNumber else, uNumber = '||uNumber);
 end case;
 case --case 用法2
  when uNumber > 30 then dbms_output.put_line('Result:case uNumber > 30, uNumber = '||uNumber);
  when uNumber < 10 then dbms_output.put_line('Result:case uNumber < 10, uNumber = '||uNumber);
  else dbms_output.put_line('Result:case uNumber else, uNumber = '||uNumber);
 end case;
 
 while uNumber < 20--while loop
 loop
  uNumber := uNumber + 5;
  dbms_output.put_line('Result:while loop, uNumber = '|| uNumber);
 end loop;
 loop --loop 
  exit when uNumber < 10;
  uNumber := uNumber - 5;
  dbms_output.put_line('Result:loop, uNumber = '|| uNumber);
 end loop;
 for resultNumber in 9..16--这里 resultNumber无需定义,每次会自+1,for loop
 loop
  dbms_output.put_line('Result:for loop, resultNumber = '|| resultNumber);
  if resultNumber = 12 then
   dbms_output.put_line('Result:for loop, resultNumber = '|| resultNumber||' exit loop');--exit 类似于break ,return 会从这里退出
   exit;
  end if;
 end loop;
 
 if uNumber < 40 then 
  dbms_output.put_line('use goto to goto1.');
  goto goto2;-- goto 的使用
 end if;
 <<goto1>>--goto 节点
  dbms_output.put_line('goto1');
 <<goto2>>
  dbms_output.put_line('goto2');

 dbms_output.put_line('over-------------');
end;

declare
 myException exception;--自定义异常
 uException exception;
 pragma exception_init(myException,-20001);--  -20000 ~-20999之间
begin
 --raise myException;
 raise_application_error(-20001,'哈哈,我是-20001!');
Exception--捕捉异常
 when uException then
  dbms_output.put_line('raise uException.');
 when others then--其它异常
  dbms_output.put_line('other 猜猜它是谁?');
  raise;--重新把当前异常抛出
end;

declare 
sqlString varchar(60);
userName t_user.userName %type;
begin
sqlString :='insert into t_user values(user_seq.nextval,:1)';--注意这里 :1
userName := 'isw2';
execute immediate sqlString using userName;--动态SQL
execute immediate 'select * from t_user';
end;
select * from t_user;

--游标
declare 
 uId t_user.userId %type default 3;
begin
 select userid into uid from t_user where t_user.userid = uId;--隐示游标(返回结果只能一行)
 if sql%Isopen then dbms_output.put_line('游标打开');--DML 语句执行时游标打开执行完关闭
 elsif sql%found then dbms_output.put_line('游标有效');
 elsif sql%Notfound then dbms_output.put_line('游标无效');
 end if;
 dbms_output.put_line('影响行数' || sql%rowCount );
end;

declare 
 cursor ucur is select * from t_user;--显示游标
 uRow t_user %Rowtype;
begin
 open ucur;--打开游标
 if ucur%isopen then dbms_output.put_line('游标成功打开.');
 end if;
 loop 
  fetch ucur into uRow;
  exit when ucur%notfound;
   dbms_output.put_line('cursor result: userId = ' || uRow.userId ||' userName= ' || uRow.userName);
  end loop;
  dbms_output.put_line('影响行数:' || ucur%rowCount);
  close ucur;
end;--在这里销毁

declare 
 cursor ucur(maxVal t_user.userId %type) is select * from t_user where userid < maxVal;--带参游标
 uRow t_user %Rowtype;
 type nullCur is ref cursor;--引用游标(弱类型) type nullCur is ref cursor return t_user %Rowtype(强类型,不可改变);
 ncur nullCur;
begin
 for uRow in ucur(10)--循环游标
 loop 
   dbms_output.put_line('当前行数:' || ucur%rowCount);
   dbms_output.put_line('cursor result: userId = ' || uRow.userId ||' userName= ' || uRow.userName);
  end loop;
  
  open ncur for select * from t_user;--打开游标
  if ncur%isopen then dbms_output.put_line('引用游标成功打开.');
  end if;
  loop 
  fetch ncur into uRow;
  exit when ncur%notfound;
   dbms_output.put_line('cursor result: userId = ' || uRow.userId ||' userName= ' || uRow.userName);
  end loop;
  close ncur;
end;

--存储过程
create procedure pro_first
as
begin
 dbms_output.put_line('存储过程');
end;

call pro_first();--调用存储过程
begin
pro_first();
end;

create procedure pro_second (info in varchar2,uname out varchar2,uinfo in out varchar2)--这里varchar2 不能限制大小
as--in 输入参数,out 输出参数 in out 输入输出参数
 urole varchar2(20);
begin
 urole := 'good';
 uname := 'boy';
 dbms_output.put_line('pro_second Result:urole='||urole||' uname ='||uname||' uinfo='||uinfo||' info='||info);
 uinfo := 'over';
end;

declare
 info varchar2(20) default ' valueinfo ';
 uname varchar2(20)  default ' valueuname ';
 uinfo varchar2(20)  default ' valueuinfo ';
begin
 pro_second(info,uname,uinfo);
 dbms_output.put_line('Result: uname ='||uname||' uinfo='||uinfo||' info='||info);
end;

--函数 drop function fun_first;
create function fun_first return varchar2--返回类型
as
begin
 return 'good';--返回值
end;
select fun_first() from dual;--区别于存储过程,它可以做为表达式的一部分

--包
--drop package pac_study1;
create package pac_study1 
as 
procedure pro_study1 ;
function fun_study1 return number ;
userNo t_user.userid%type;
cursor cur_study1 is select * from t_user where userId = userNO;--先定义后使用
end pac_study1;
-- 包体
create package body  pac_study1
as 
procedure pro_study1
is
begin
 dbms_output.put_line('我是 pac_study1.pro_study1');
end pro_study1;
function fun_study1 return number
is
begin
 return 144;
end fun_study1;
end pac_study1;
--可以不完全声明, 这不会出错但没意义
begin
 pac_study1.pro_study1();
end;
select pac_study1.fun_study1() from dual;

 
分享到:
评论

相关推荐

    Oracle学习笔记精华版

    Oracle学习笔记精华版是针对数据库管理系统Oracle的一份重要学习资源,涵盖了从基础概念到高级特性的全面知识。Oracle,作为全球广泛使用的大型企业级数据库系统,对于IT专业人员尤其是数据库管理员(DBA)来说,是...

    Oracle学习笔记 PDF

    ### Oracle学习笔记知识点详解 #### 一、Oracle简介 Oracle是一家知名的软件公司,以其数据库管理系统闻名全球。该公司成立于1977年,总部位于美国加利福尼亚州。Oracle不仅提供数据库解决方案,还涉及中间件、...

    Oracle学习笔记

    Oracle学习笔记 Oracle学习笔记是李兴华老师编写的Oracle从入门到精通的学习笔记,涵盖了 Oracle 的多表查询、连接、组函数和分组统计等知识点。在本篇笔记中,李兴华老师详细介绍了多表查询的基本语法、左右连接...

    Oracle学习笔记.pdf

    在Oracle学习笔记中,对安装卸载和配置的详尽讲解,不仅为学习者提供了操作指导,而且还涉及到了数据库管理的一些基础知识点。这些内容对于数据库管理员和开发人员来说都是十分重要的,因为它们是操作Oracle数据库的...

    Oracle学习笔记.doc

    Oracle学习笔记 以下是我这一周学习oracle整理的笔记,包括课堂的内容和自己看额外看的视频补充的一些内容,基本上囊括了所有oracle的基本知识。主要的形式是例子代码加代码解释加运行结果,我个人认为对于没有学习...

    Oracle学习笔记-日常应用、深入管理、性能优化

    资源名称:Oracle学习笔记-日常应用、深入管理、性能优化内容简介:Oracle学习笔记-日常应用、深入管理、性能优化Oracle 11g是最具代表性的高端关系型数据库管理系统,它在世界各地的大型商务数据库应用系统中被广泛...

    oracle学习笔记整理

    以下是对Oracle学习笔记整理的主要知识点的详细说明: 1. **数据库选择**: 在决定使用哪种数据库时,通常需要考虑项目的规模、性能需求、安全性要求以及可用资源。Oracle数据库因其稳定性、可扩展性和高性能而被...

    oracle学习笔记下载

    ### Oracle 学习笔记知识点概览 #### 一、Oracle 数据库系统参数查询与管理 在 Oracle 数据库的学习过程中,了解如何查看和管理数据库的系统参数是非常重要的。这些参数直接影响着数据库的性能和稳定性。 ##### ...

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1/2

    ORACLE学习笔记:日常应用、深入管理、性能优化.part1

    oracle学习笔记-入门基础

    Oracle数据库是世界上最流行的数据库管理系统之一,它提供了丰富的特性和功能来优化数据管理和查询性能。本文主要探讨Oracle数据库的入门基础知识,特别是与索引相关的概念。 首先,我们要理解ROWID的概念。ROWID是...

    全网最全的oracle学习笔记

    全网最全的oracle学习笔记,oracle学习笔记,oracle,### 4、oracle的七个服务 ```sql 1、Oracle ORCL VSS Writer Service Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(比如...

    Oracle学习笔记 Oracle学习笔记

    根据提供的信息,我们可以总结出以下Oracle数据库学习的关键知识点: ...以上是基于提供的内容整理出的Oracle学习笔记中的关键知识点。通过理解这些基础知识,可以更好地管理和操作Oracle数据库。

    Oracle学习笔记——日常应用、深入管理、性能优化 示例代码

    Oracle 11g是最具代表性的高端关系型数据库管理系统,它在世界各地的大型商务数据库应用系统中被广泛应用。本书设计了大量的应用情景,介绍了数据库管理员和开发人员常用的管理、维护和优化Oracle 11g数据库的技术和...

    MSDN oracle学习笔记

    在“MSDN Oracle学习笔记”中,我们可以期待找到关于Oracle数据库的详细讲解和实践指导。 首先,Oracle数据库的基础知识是必不可少的。这通常涵盖数据库系统的基本概念,如SQL(结构化查询语言)的使用,数据类型,...

    oracle 学习笔记

    oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记oracle 学习笔记

Global site tag (gtag.js) - Google Analytics