Oracle学习笔记

一下是我学习Oracle时的基础练习,涵盖了编程中的重点知识!特别适合用来复习!

转载记得标注!!!

--查询scott用户的emp表
select * from scott.emp;
/**
--创建表空间
create tablespace 表空间名称
datafile '文件存储位置'
size xxM;
*/
create tablespace testorcl1
datafile 'D:oracle_db	estorcl1.ora'
size 100M;
--创建用户
/**
语法
create user 用户名
identified by 密码
default tablespace 表空间名;
*/
create user testdb
identified by java
default tablespace testorcl1;

/**
给用户授权
语法
grant 角色 to 用户;
*/
--授予testdb数据库管理员权限
grant dba to testdb;
--授予testdb存储过程和函数的执行权限
grant resource to testdb;

--使用testdb身份登陆

--创建班级表
create table cloazz(
       cid number(9) primary key,
       cname varchar2(50) not null
);
--创建学生表,并建立与班级的主外键关联
--删除表
--drop table student;
create table student(
       sid number(9) primary key,
       sname varchar2(50) not null,
       sex varchar2(4),
       address varchar2(50),
       birthday date,
       classid number(9) not null references cloazz(cid)
);

--序列
/**
序列可以生产连续的整数,主要用于为表的主键值自增设置数据

--创建序列的语法
create sequences 序列名;

--创建班级表的序列
create sequence seqclazz;
--创建学生表的序列
create sequence seqstu;

--获取序列的下一个值
序列名.nextval
--获取序列的当前值
序列名.currval
*/
select * from cloazz;
select * from student;



--使用序列为班级表的逐渐字段设置属性
insert into cloazz values(seqclazz.nextval,'java'||seqclazz.currval||'班');
commit;--提交数据到数据库表

--给学生表插入数据
insert into student values(seqstu.nextval,'张飞','男','户县','09-2月-1992',1);
insert into student values(seqstu.nextval,'马超','男','西凉',sysdate,1);
commit;


--获取oe用户的订单表
select * from oe.orders order by order_id;

--获取oe用户订单表orders的前5条记录
select od.*,rownum r from oe.orders od 
where rownum > 0 and rownum <= 5
order by order_id;

--分页的语法
/**
select * from
(select a.*,rownum r from 表1 a where rownum <=当前页数*每页记录数)
where r > (当前记录数 - 1)* 每页记录数;
*/
--备份表的数据
/**
create table 备份表
as
select * from 表名 [where 条件]
*/
--备份oe用户的orders表的数据,只进行数据备份,不备份约束
create table bakorders
as
select * from oe.orders;

select * from bakorders;

--只备份字段
create table bakorders1
as
select * from oe.orders where 1=2;

--获取客户的姓名,连接首姓名和尾姓名 || 代表连接
select cs.cust_first_name || '.' || cs.cust_last_name 姓名 from oe.customers cs;

--获取系统时间
select sysdate from dual;
--oracle函数
--添加月份
select add_months(sysdate,4) from dual;

--获取指定日期所在月份最后一天的日期
select last_day('12-2月-2017')from dual;

--计算两个日期之间相差的月份
select months_between(sysdate,'12-2月-2012') from dual;

--按照指定的日期格式进行四舍五入
select round(sysdate,'month') from dual;
select round(sysdate - 220,'year') from dual;
select round(sysdate,'day') from dual;

--获取星期数所在日期的下一个星期所在日期
select next_day(sysdate,'星期二') from dual;

--按照指定的日期格式截断当前指定日期
select trunc(sysdate, 'year') from dual;
select trunc(sysdate - 20, 'month') from dual;
select trunc(sysdate, 'day') from dual;

--字符函数
--截断当前字符
select substr('helloworld',0,5) from dual;
select substr('helloworld',5) from dual;
--获取指定字符在当前字符中的位置
select instr('hellworld','o') from dual;
--左右填充
select lpad('hello',10,'*') from dual;
select rpad('hello',10,'*') from dual;
--去空格或者替换当前字符串左右指定的字符
select trim('  hel  lo  ' ) from dual;
select trim('' from '   hello   ') from dual;--无法显示

--数学函数
--四舍五入
select round(3.1415926, 3) from dual;
select round(3.1415926) from dual;

--转换函数
--1数字转换字符串
select trim(to_char(123.45,'$9999999999.99999')) from dual;

--2将日期转换为字符串
select to_char(sysdate,'yyyy-MM-dd') from dual;
--12小时制
select to_char(sysdate,'yyyy-MM-dd hh:MI:ss') from dual;
--24小时制
select to_char(sysdate,'yyyy-MM-dd hh24:MI:ss') from dual;

select '1' + '4' from dual;

--字符串转日期
select to_date('2014-12-21','yyyy-MM-dd') from dual;
--12小时制
select to_date('2014-12-21 1:03:11','yyyy-MM-dd hh:mi:ss') from dual;
--24小时制
select to_date('2014-12-21 21:03:11','yyyy-MM-dd hh24:mi:ss') from dual;

--获取用户id
select uid from dual;

--获取用户名称
select user from dual;

--其他函数
select nvl('test','hello') from dual;
select nvl('','hello') from dual;

--分组函数
/**
根据客户名称获取客户的订单数量
及其订单的总金额
*/
select * from oe.customers;
select * from oe.orders;

select 
      c.cust_first_name || '.' c.cust_last_name,
      count(o.order_id) 订单数量,
      sum(o.order_total) 订单总金额 
from oe.orders o, oe.customers c
where o.customer_id=c.customer_id;


--testdb用户更新student表的第二条记录
select * from student;

update student s set s.sname='貂蝉' where s.sid=3;
commit;

--使用select获取行级锁

select * from student where sid=3 for update;

--给student表设置表级锁
lock table student in share mode;


--给student表设置排它锁
lock table student in exclusive mode;



update testdb.student s set s.sname='许褚' where s.sid=3;
select * from testdb.student;


select * from testdb.student where sid=3 for update  wait 5;
commit;

lock table testdb.student in share mode;

lock table testdb.student in exclusive mode nowait;



--创建表空间
create tablespace test1
datafile 'D:Oracle_sql	est1.ora'

--使用范围分区
create table testa1(
   tid number(9) not null,
   tname varchar2(50) not null
)partition by range(tid)
(
   partition p1 values less than(1000) tablespace test1,
   partition p2 values less than(2000) tablespace test2,
)
--按照分区表查询数据
select * from testa1 partition(p1);
select * from testa1 partition(p2);

--散列分区
create table testa2(
   tid number(9) not null,
   tname varchar2(50) not null
) partition by hash(tid)
(
   partition ph1 tablespace test1,
   partition ph2 tablespace tett2
)

--创建同义词
create synonym myorders for oe.orders;
--使用同义词访问替他用户的表
select * from myorders;
--删除同义词
drop synonym myorders;

--创建共有的同义词
create public synonym myorders for oe.orders;

--创建序列
create sequence seq_stu;
select * from student;
--给student表插入数据,主键值由序列提供
insert into student values(seq_stu.nextval,'aa'||seq_stu.currval,'男','山西',to_date('1994-8-28','yyyy-MM-dd'),1);

--创建视图
--replace 为修改视图的关键字
create or replace view  vworders
as
select 
   od.*,c.cust_first_name||'.'||c.cust_last_name cname
from oe.orders od,oe.customers c
where od.customer_id=c.customer_id

--访问视图
select * from vworders;
--rowid
select o.*,rowid from oe.orders o;

--创建抽象类型
create or replace type myaddress as object(
   addressid number(9),
   city varchar2(50),
   state varchar2(50),
   street varchar2(50),
   zip varchar2(50)

)

--创建表,指定字段的类型为自定义类型
create table student1(
   stuid number(9) primary key,
   sname varchar2(50),
   address myaddress
)

--插入数据
insert into student1 values(
   1,
   '张飞',
   myaddress(1001,'西安','陕西','科技四路','710060')
);

insert into student1 values(
   2,
   '关羽',
   myaddress(1001,'太原','山西','科技四路','710060')
);
insert into student1 values(
   3,
   '赵云',
   myaddress(1001,'安康','陕西','科技四路','710060')
);

insert into student1 values(
   4,
   '马超',
   myaddress(1001,'西安','陕西','科技四路','710060')
);

--修改自定义类型字段的值
update student1 stu set stu.address.city='米脂',stu.sname='貂蝉' 
where stuid=1;
commit;
--删除自定义类型
drop type 类型名称;

select * from student1;

--创建可变数组
/**
语法
create or replace type 类型名称 as array(长度) of 数组元素的类型

*/

--创建 商品名称数组类型
create or replace type items as array(5) of varchar2(50);

--创建购物车表
create table cart(
   cid number(9) primary key,
   product items
);
--插入数据
insert into cart values(
   1,
   items('面包','饼干','榨菜','锅巴','干果')
   
);
insert into cart values(
   2,
   items('苹果','饼干','梨子','锅巴','干果')
   
);
insert into cart values(
   3,
   items('栗子','饼干','香蕉','锅巴','方便面')
   
);
insert into cart values(
   4,
   items('枣子','饼干','火腿肠','锅巴','萝卜干')
   
);
commit;
select * from cart;

--查看可变数组的数据
select * from the(select product from cart c where c.cid=1);
select c.cid, p.* from cart c,table(select product from cart c where c.cid=1)p
where c.cid=1
;

--修改可变数组的数据
update cart c 
set c.product=items('面包','饼干','榨菜','锅巴','芝麻酱')
where c.cid=1;
commit;

--嵌套表
--1.创建抽象数据类型
create or replace type emp_ty as object(
   eid number(9),
   ename varchar2(50),
   sex varchar2(4),
   address varchar2(50)
);
--2.创建表类型
create or replace type emp_table_type as table of emp_ty;

--3.基于表类型创建表
create table dep(
   depid number(9) primary key,
   depname varchar2(50),
   emp emp_table_type
)nested table emp store as emp_table;
--向嵌套表中插入数据
insert into dep values(
       1,
       '技术部',
       emp_table_type(emp_ty(1,'张飞','男','山西'),
                      emp_ty(2,'马超','男','山西'),
                      emp_ty(3,'赵云','男','山西'),
                      emp_ty(4,'黄忠','男','弧线')                                   
       )

);
insert into dep values(
       2,
       '财务部',
       emp_table_type(emp_ty(1,'高峰','男','山西'),
                      emp_ty(2,'曹操','男','山西'),
                      emp_ty(3,'刘备','男','山西'),
                      emp_ty(4,'许褚','男','弧线')                                    
       )

);
insert into dep values(
       3,
       '项目部',
       emp_table_type(emp_ty(1,'貂蝉','女','山西'),
                      emp_ty(2,'小巧','女','米脂'),
                      emp_ty(3,'小乔','女','锦州'),
                      emp_ty(4,'孙尚香','女','弧线')                                    
       )

);

commit;
select * from dep;
select * from the(select emp from dep where depid=1);

--向嵌套表中插入数据
insert into the(select emp from dep where depid=1)
values(5,'威严','女','上海');
commit;

--删除嵌套表的数据
delete from table(select emp from dep where depid=1)where eid=2;
/**
语法
declare
       变量  类型[(长度)][:=值];
       ......
begin
     sql语句块;
     .......
[
exception 
          when
               异常对象(变量) then 异常处理语句;
               .......
]
end;
*/
--实例
declare--声明变量
  a number(9);
  b number(9);
begin
  a:=10;
  b:=20;
  
  dbms_output.put_line('a='||a);
  dbms_output.put_line('b='||b);
  dbms_output.put_line('a+b='||(a+b));--注意(a+b)要括号
end;

--使用into关键字获取表的字段值为变量赋值
/**
编写sqlpl/sql语句
给定指定的订单编号,获取订单的日期,金额和客户的名称
*/
/****************************************/

declare
  odate date;
  money number;
  cname varchar2(50);
  cid number;
begin
     --获取指定编号的订单信息
     select od.order_date,order_total,customer_id 
     into ---注意
     odate,money,cid
     from oe.orders od where od.order_id=2458;
     
     --在customers表中查出name值赋给cname变量
     select cs.cust_first_name||'.'||cs.cust_last_name
     into 
     cname
     from oe.customers cs where cs.customer_id=cid;
     --输出获取的消息
     dbms_output.put_line('客户名称:'||cname);
     dbms_output.put_line('订单日期:'||to_char(odate,'yyyy-MM-dd'));
     dbms_output.put_line('金额:'||money);
end;
/****************************************/

--使用表的列类型作为变量的数据类型
/**
表名.列名%type表示引用表的列类型

表名%rowtype--表示应用表的行类型
*/

--实例
/****************************************/

declare
  odate oe.orders.order_date%type;
  money oe.orders.order_total%type;
  cname varchar2(50);
  cid oe.customers.customer_id%type;
begin
     --获取指定编号的订单信息
     select od.order_date,order_total,customer_id 
     into ---注意
     odate,money,cid
     from oe.orders od where od.order_id=2459;--有异常
     
     --在customers表中查出name值赋给cname变量
     select cs.cust_first_name||'.'||cs.cust_last_name
     into 
     cname
     from oe.customers cs where cs.customer_id=cid;
     --输出获取的消息
     dbms_output.put_line('客户名称:'||cname);
     dbms_output.put_line('订单日期:'||to_char(odate,'yyyy-MM-dd'));
     dbms_output.put_line('金额:'||money);
--ocrale异常
exception
      when no_data_found  then dbms_output.put_line('没有数据!');
end;
/****************************************/

----------------------------------------------
--行类型的使用
/**
获取指定编号的订单的所有数据和客户名称
*/
declare
    --定义行变量
    odrows oe.orders%rowtype;--行类型
    cid oe.customers.customer_id%type;--列类型
    cname varchar2(50);
begin
     select
       od.* 
       into 
       odrows
       from oe.orders od where od.order_id=2458;
        --在customers表中查出name值赋给cname变量
     select cs.cust_first_name||'.'||cs.cust_last_name
     into 
     cname
     from oe.customers cs where cs.customer_id=odrows.customer_id;
       --输出获取的消息
     dbms_output.put_line('客户名称:'||cname);
     dbms_output.put_line('订单日期:'||to_char(odrows.order_date,'yyyy-MM-dd'));
     dbms_output.put_line('金额:'||odrows.order_total);
end;
----------------------------------------------

--if语句
/**
语法
if 条件表达式 then
   sql语句
else
   处理语句
   ......
end if;  
*/
/**
编写pl/sql
根据指定的订单编号获取信息,当订单编号不存在时,提示查无数据
否则显示信息

*/
----------------------------------------------
declare
    --定义行变量
    odrows oe.orders%rowtype;--行类型
    cid oe.customers.customer_id%type;--列类型
    cname varchar2(50);
    num number;
begin
    --获取指定编号的订单的数量
  select
        count(od.order_id) into num
  from oe.orders od where od.order_id=2459;
  if num > 0 then
     select
       od.* 
       into 
       odrows
       from oe.orders od where od.order_id=2458;
     
       
    --在customers表中查出name值赋给cname变量
       select cs.cust_first_name||'.'||cs.cust_last_name
       into 
       cname
       from oe.customers cs where cs.customer_id=odrows.customer_id;
         --输出获取的消息
       dbms_output.put_line('客户名称:'||cname);
       dbms_output.put_line('订单日期:'||to_char(odrows.order_date,'yyyy-MM-dd'));
       dbms_output.put_line('金额:'||odrows.order_total);
   else
       dbms_output.put_line('订单信息不存在');
   end if;
end;
----------------------------------------------

--循环语句
/**
1---loop循环语法
loop
    语句块
    ....
exit when 退出条件;
     ......
end loop;
*/

--使用loop循环完成1-100累加
declare
       i number:=0;
       j number:=0;
begin
     loop
         i:=i + 1;
         j:=j + i;
          dbms_output.put_line('i:'||i);
          dbms_output.put_line('j:'||j);
     exit when i >= 100;
     end loop;
end;
--2--while循环
/**
语法

while 条件   loop
      循环语句
      .....
end loop;
*/
declare
       i number:=0;
       j number:=0;
begin
   while i <100 loop
         i:=i + 1;
         j:=j + i;
         dbms_output.put_line('i:'||i);
         dbms_output.put_line('j:'||j);
   end loop;
end;

---------------------------------------
--for循环
/**
语法
for 变量 in 范围 loop
    循环语句;
    ......
end loop;
*/
declare
      
       j number:=0;
begin
   for i in 1.. 100 loop
         j:=j + i;
         dbms_output.put_line('i:'||i);
         dbms_output.put_line('j:'||j);
   end loop;
end;
---------------------------------------

--游标
/**
1.隐式游标,变量名称为sql,由系统确定
游标属性
%notfound --true/false   没有数据被找到
%found --true/false   有数据返回真
%rowCount --true/false   返回记录数
%isopen --true/false   游标是否打开,隐式一直是false
*/
----------------------------------------------

declare
    --定义行变量
    odrows oe.orders%rowtype;--行类型
    cid oe.customers.customer_id%type;--列类型
    cname varchar2(50);
    num number;
begin
    --获取指定编号的订单的数量
  select
        count(od.order_id) into num
  from oe.orders od where od.order_id=2459;
  
  dbms_output.put_line('返回的记录数:'||sql%rowCount);
  if num > 0 then
     select
       od.* 
       into 
       odrows
       from oe.orders od where od.order_id=2458;
     
       
    --在customers表中查出name值赋给cname变量
       select cs.cust_first_name||'.'||cs.cust_last_name
       into 
       cname
       from oe.customers cs where cs.customer_id=odrows.customer_id;
         --输出获取的消息
       dbms_output.put_line('客户名称:'||cname);
       dbms_output.put_line('订单日期:'||to_char(odrows.order_date,'yyyy-MM-dd'));
       dbms_output.put_line('金额:'||odrows.order_total);
   else
       dbms_output.put_line('订单信息不存在');
   end if;
end;

----------------------------------------------

--显示游标
/**
语法
declare
       cursor 游标名称 is select 语句; --声名游标
       ......
begin
     open 游标名; -- 打开游标
     ....
     fetch 游标 into ....--操作游标
     ....
     close 游标; -- 关闭游标
end;
*/
/**
编写pl/sql语句
使用游标完成
给定客户编号,获取客户的订单信息
*/
-----------------------------------
declare
  cursor csod is select * from oe.orders 
         where oe.orders.customer_id=101;
  odrows oe.orders%rowtype;--行变量
begin
  open csod; --打开游标
  loop
      fetch csod into odrows;
  exit when csod%notfound;
       dbms_output.put_line('订单日期:'||to_char(odrows.order_date,'yyyy-MM-dd'));
       dbms_output.put_line('金额:'||odrows.order_total);
       dbms_output.put_line('--------');
  end loop;
  close csod;
end;

-----------------------------------
--使用for循环操作游标
declare
  cursor csod is select * from oe.orders 
         where oe.orders.customer_id=101;
begin
  for odrows in csod loop
      --输出获取信息
       dbms_output.put_line('订单日期:'||to_char(odrows.order_date,'yyyy-MM-dd'));
       dbms_output.put_line('金额:'||odrows.order_total);
       dbms_output.put_line('--------');
  end loop;
end;

--创建存储过程
/**
语法
create or replace procedure 过程名(参数 [in],参数 out 类型...)
is
  局部变量  类型;
  .....
begin
     sql语句块;
     .....
end;
*/

--调用存储过程
/**
declare
...
begin
     过程名(参数...);
end;
*/

---------------------------------
--创建存储过程
/**
建立存储过程
传递订单编号,返回订单的日期,金额和客户名称
*/

------------------------------------------------
create or replace procedure proc_orders(oid in number,
                                          odate out date,
                                          money out number,
                                          cname out varchar2
                                        )
is
  cid number;
begin
  --获取指定编号的订单信息
  select 
         od.order_date,order_total,customer_id
         into--使用into将表的字段值传递给指定变量
         odate,money,cid
   from oe.orders od where od.order_id=oid;
   
   --获取客户名称
   select
         cs.cust_first_name||'.'||cs.cust_last_name 
         into
         cname 
   from oe.customers cs where cs.customer_id=cid;  
  
exception 
       when no_data_found then dbms_output.put_line('未找到数据!'); 
end;
----------------------------------
create or replace procedure pro_orders(oid in number,odate out date, money out number,cname varchar2)
is 
   cid number;
begin
select oe.orders.order_date,oe.orders.order_total,oe.orders.customer_id
  into
  odate,
  money,
  cid
 from oe.orders where oe.orders.order_id=oid;
 --获取客户名称
 select oe.customers.cust_first_name||'.'||oe.customers.cust_last_name
  into
  cname
  from oe.customers where oe.customers.customer_id=cid; 
exceptions
      when no_data_found then dbms_output.put_line('无数据!');

end;


--select * from oe.orders where oe.orders.order_id=2458;
--执行过程
declare
    adate date;
    amoney number;
    aname varchar2(50);
begin
     --执行过程
     proc_orders(2458,adate,amoney,aname);
     dbms_output.put_line('姓名:'||aname);
     dbms_output.put_line('金额:'||amoney);
     dbms_output.put_line('日期:'||adate);

end;

--函数
/**
语法
create or replace function 函数名(参数,类型.....) return 类型
is
  变量  类型;
begin
   sql语句快;
   .....
   return 返回值;
end;
--执行函数
select 函数(参数) from dual;

--使用pl/sql执行
declare
   变量 类型;
begin
   变量:=函数(参数....);
   .....
end;   
*/
---编写函数
create or replace function addtest(a number, b number) return number
is
   c number;
begin
   c:=a+b;
   return c;
end;
--执行函数
select addtest(12,33) from dual;

--根据客户的编号返回客户的名称
create or replace function addtest1(cid number) return varchar2
is
  cname varchar2(50);
begin
  select cs.cust_first_name||'.'||cs.cust_last_name 
  into 
  cname
  from oe.customers cs
  where cs.customer_id=cid;
  return cname;
end;
--执行函数
select addtest1(193) from dual;

--根据客户的编号返回客户的名称
create or replace function getCname(cid number) return varchar2
is
  cname varchar2(50);
begin
  select 
    cs.cust_first_name||'.'||cs.cust_last_name into cname
  from oe.customers cs where cs.customer_id=cid;
  return cname;
end;

--执行
select getCname(101) from dual;
原文地址:https://www.cnblogs.com/julinhuitianxia/p/6854239.html