`

Oracle笔记本(1102)

阅读更多
select 2*3 from dual; 

--求年薪
select ename,sal, sal*12 from emp; 
--别名
select ename,sal, sal*12 as "年薪" from emp; 
select ename,sal, sal*12  "年薪" from emp; 

--员工一年总收入
select * from emp;


select ename,sal, sal*12+comm as "年总收入" from emp;
--注意:含有任何null值的数学表达式最后的结果都为null 

--字符串连接符 ||
select ename||'员工姓名' from emp;


--处理一个字符串中含有单引号的情况 :使用2个单引号表示一个单引号
select ename||'员工''姓名' from emp;


--含有任何null值的字符串表达式中,null被当作空字符串处理
select empno, ename||mgr from emp;

--求员工每个级别顶薪

select hisal*12 as "员工年顶薪" from salgrade;

/*  distinct  消除重复值   */
--求emp表中的部门列表
select distinct deptno  from emp;

select  deptno, job  from emp;
select distinct deptno, job  from emp;--去除deptno, job 组合起来的重复值

--null值
--求奖金为null的员工信息
select * from emp where comm is null;

--求奖金不为null的员工信息
select * from emp where comm is not null;


/*    in    */
--求员工编号在某一个集合内的值
select * from emp where empno in (7369,7499,7521)

select * from emp where empno  not in (7369,7499,7521)


/*  oracle 日期 */

select * from emp;  

--求入职日期在1982-1-23后入职的人

select * from emp where hiredate > '23-1月-82';


/*  like   */

--查询员工 名字第二个字面为A的人

select * from emp where ename like '_A%';

--查询名字中含有 % 等通配符的数据时,使用转义字符 \   (\%)
select * from emp where ename like '%\%%';


--查询1987年入职的人
select * from emp where hiredate>='1-1月-87' and hiredate<='31-12月-87';

select * from emp where hiredate like '%87%' 

/* order by*/

select * from emp order by deptno asc,sal desc;

/*常用函数*/
--lower()

select empno,  Lower(ename)  from emp;

--查询名字带有 “A“ 或 "a"的员工
select *  from emp where ename like '%A%' or ename like '%a%';

select *  from emp where Lower(ename) like '%a%';


--Upper();  小写转大写

select Upper('wepull') from dual;

--Substr
select Substr('wepull',2,3) from dual; --epu
select Substr('wepull',2) from dual; --epull

select Substr(ename,2) from emp;

--Chr()  某个ASCII码值对应的字符
select Chr(97) from dual; -- a

 -- Ascii()函数
--例子:求一个字符的ASCII码值
select Ascii('a') from dual;  --97



--常用数值函数

select round(23.652) from dual --24

select round(23.652,2) from dual  --23.65

select round(23.652,-1) from dual  --20
select round(493.652,-2) from dual  --500

--to_char()

select to_char(456123.45,'L999,999.99') from dual--  ¥456,123.00

--to_char()对日期的转换

select sysdate from dual;

select to_char(sysdate,'YYYY/MM/DD') from dual;


--to_date()函数

--例子:将1985年2月14日8:00以后入职的雇员信息取出

select * from emp where hiredate > to_date('1985-02-14 8:00','YYYY-MM-DD HH:MI')



--to_number()函数

--求薪水<于1200的人
select * from emp where sal<to_number('$1,200','$9,999')

--nvl 处理空值

select ename, sal*12+comm  as "一年总收入" from emp 

select ename, sal*12+nvl(comm,0)  as "一年总收入"  from emp 




---聚合函数/组函数
select * from emp;

--emp表中deptno数量
select count(deptno) from emp;

select count(distinct deptno) as "部门总数" from emp;


--group by

--求每个部门的最大工资
select  deptno ,max(sal) from emp group by deptno;

--求每个部门中职位的最大工资
select  deptno ,job,max(sal) from emp group by deptno , job;


---求每个部门工资最高人信息

select ename,deptno,sal from emp where (deptno,sal)in
(select  deptno ,max(sal) from emp group by deptno);

--方法二
select * from emp join
       (select  deptno ,max(sal) max_sal from emp group by deptno  ) t 
          on (emp.deptno=t.deptno and emp.sal=t.max_sal)



--having
select deptno, avg(sal)  from emp group by deptno having avg(sal)>2500


---子查询
--求工资最高的人的信息
select * from emp where sal=(
       select max(sal) from emp
);

--rownum(分页)

--查询emp表前5条记录

select ename,rownum from emp where rownum<=5;

--查询emp表第5条以后记录

select * from (select empno, ename,rownum as r from emp)
       where r>5;

--rownum 与排序

select empno,ename,sal ,rownum from emp order by sal;


select empno,ename,sal ,rownum from
       (select empno,ename,sal  from emp order by sal)
       
上司
--自连接
--求emp表中员工的姓名和对应的上司(mgr)
select * from emp;

select e1.ename, e2.ename 
from emp e1,emp e2
where e1.mgr=e2.empno;


--交叉连接
select ename from emp;
select dname from dept;

select ename,dname  from emp ,dept; --结果为笛卡尔乘积


--SQL1999 语法
select ename,dname  from emp cross join dept; 


--连接查询
create table a(
	id int primary key,
	name nvarchar2(20)
);
select  * from a;
insert into a values (1,'凤姐');
insert into a values (3,'犀利哥');
insert into a values (5,'春哥');
insert into a values (6,'曾哥');
insert into a values (7,'平平');

create table b(
	id int primary key,
	info nvarchar2(20)
)

insert into b values (1,'深圳');
insert into b values (2,'武汉');
insert into b values (6,'成都');

select  * from a;
select  * from b;

select  * from a  left outer join b on a.id=b.id;--左外连接
select * from a right outer join b on  (a.id=b.id);--右外连接
select * from a full  join b on  (a.id=b.id);--全连接 (左外连接+右外连接)
select * from a inner join b on  (a.id=b.id) --内连接

--非等值连接
--查询出雇员名字和薪水等级(2个表连接查询)
select * from emp;
select * from salgrade;

select e.ename ,e.sal ,s.grade from emp e
join salgrade s
on (e.sal between s.losal  and s.hisal)
 
--查询出雇员名字,及对应的部门名称,薪水等级(3个表连接查询) 
select e.ename, d.dname, s.grade from emp e
       join dept d on(e.deptno=d.deptno)
       join salgrade s on (e.sal between s.losal  and s.hisal)

--练习
--求部门中薪水最高的人名。

select * from emp e;
select e.deptno, max(e.sal) from emp e group by deptno ;


select e.ename ,t.deptno,e.sal from emp e  
join (select e.deptno, max(e.sal) max_sal from emp e group by deptno) t
on (e.deptno=t.deptno and e.sal =max_sal)


--求部门平均薪水等级?

select deptno, avg(sal) from emp e group by deptno;
select * from salgrade;
 
select t.deptno, t.avg_sal, s.grade from salgrade s    
join (select deptno, avg(sal) avg_sal from emp e group by deptno) t
on(t.avg_sal between s.losal and s.hisal );     
       
--求哪些人是经理    
select * from emp;

select * from emp where mgr in (select mgr from emp);
   
select * from emp where mgr in (select distinct mgr from emp);      
      
--平均薪水最高的部门编号与薪水  
  
--第一步:先求出部门平均薪水

select e.deptno ,avg(sal) from emp e group by e.deptno;

--第二步:求出平均薪水最高值
   
 select max(t.avg_sal) 
 from (select e.deptno ,avg(sal) avg_sal from emp e group by e.deptno) t      
  
 --综合     
 select deptno ,avg_sal from
 (select e.deptno ,avg(sal) avg_sal from emp e group by e.deptno) t
 where  t.avg_sal =
        ( select max(t.avg_sal) 
           from (select e.deptno ,avg(sal) avg_sal from emp e group by e.deptno) t      
         )          
--方法二:       
   select deptno ,avg_sal from
   (select e.deptno ,avg(sal) avg_sal from emp e group by e.deptno) t 
   where  avg_sal =(select max(avg(sal)) from emp group by deptno )   
   --注意 :组函数嵌套只能嵌套2层 
       
   select * from emp;
--比普通员工的最高薪水还要高的经理人名称
-- 1.先求普通员工的最高薪水?  
   select max(sal) from emp e 
   where e.empno  not in (select mgr from emp where mgr is not null )
--2.求比上面的值要大,并且还是经理人

select e.ename,e.sal from emp e 
   where e.empno  in (select distinct mgr from emp where mgr is not null )
   and e.sal>
   ( select max(sal) from emp e 
     where e.empno  not in (select distinct mgr from emp where mgr is not null )
   );

  
--复制表

create table emp as select * from scott.emp where 1<>1;--只复制结构
create table emp as select * from scott.emp ;--复制数据
create table dept as select * from scott.dept ;
create table salgrade as select * from scott.salgrade ;
create table bonus as select * from scott.bonus ;
 select * from emp


---Orcle 高级部分

--视图

select * from scott.emp;

create view  emp_view 
as
select empno, ename,sal from scott.emp;


select * from emp_view;

drop view emp_view;

--查询每个部门的名称、总人数、平均工资、最低工资的员工名字。
select dept.dname from demp;

select deptno, count(empno) ,avg(sal),min(sal) from emp group by deptno ;  
 

--综合: 3张表连接查询
select d.dname, t.deptno, t.c, t.avg_sal,t.min_sal ,e.ename
from dept d
  join 
       (select deptno, count(empno) c ,avg(sal) avg_sal,min(sal) min_sal from emp group by deptno ) t
  on (d.deptno=t.deptno)
  join emp e
  on (e.sal=t.min_sal and e.deptno=t.deptno)
  
--把上面结果封装成视图
create or replace view deptInfo_view
as
select d.dname, t.deptno, t.c, t.avg_sal,t.min_sal ,e.ename
from dept d
  join  (select deptno, count(empno) c ,avg(sal) avg_sal,min(sal) min_sal from emp group by deptno ) t
  on (d.deptno=t.deptno)
  join emp e
  on (e.sal=t.min_sal and e.deptno=t.deptno)

--
select * from deptinfo_view;

---------

--外键约束
drop table t_type;
create table t_type(
       id int primary key,
       typeName varchar2(20)
  
)
drop table t_book;
create table t_book(
       id int primary key,
       name varchar2(20) ,
       tid int ,
      constraint FK_tid  foreign key (tid) references t_type(id)--字段级的外键约束,不用加foreign key
  
)

--
select * from user_tables;
select table_name from user_tables;

insert into t_type values (1,'言情类');
insert into t_type values (2,'计算机类');
insert into t_type values (3,'言武侠类');

select * from t_book t
insert into t_book values (1,'小磊子的情书',1);
insert into t_book values (2,'凤姐的韵事',1);
insert into t_book values (3,'干露露的视频',2);
insert into t_book values (4,'java自学成才',2);
insert into t_book values (5,'刘德华的情歌',3);
--------

--视图中使用DML的规定(不重要)

create or replace view book_view
as
select id,name from t_book;

--
select * from t_book
select * from book_view;

delete from book_view where id=4;

--只读视图

create or replace view book_view
as
select id,name from t_book
with read only;

--序列
create or replace sequence my_sec;

select  my_sec.nextval  from dual;
select  my_sec.currval  from dual;

create  sequence book_sec;

create table book(
       id number,
       name varchar2(50)
)
alter table book add constraint PK_id primary key (id)

select * from book;

insert into book values (book_sec.nextval,'111');
insert into book values (book_sec.nextval,'222');
insert into book values (book_sec.nextval,'333');
insert into book values (book_sec.nextval,'444');


create sequence se_1
increment by 50 --次增长的幅度 50
start with 100  --从100开始
maxvalue 400  --最大400
minvalue 50
cycle  --到最大值后循环
cache 2;


select se_1.nextval from dual

--索引
create index idx_book on book(name);
drop index idx_book;

--同义词
t_book

create synonym t for t_book
select * from t;

drop synonym t;

--- PL/SQL
begin
     dbms_output.put_line('hello word');
end;


--变量赋值
declare
     v_name varchar2(20):='wepull';
begin
     dbms_output.put_line(v_name);
end;     


--复合类型变量

--记录类型
declare
     --定义一个记录类型
     type book_rec is record(
          id int,
          name varchar2(20)
     );

    b_rec book_rec;       --声明一个变量是记录类型
begin
    select id ,name into b_rec from wepull.t_book where id=1;
    dbms_output.put_line(b_rec.id||b_rec.name);
end;

--%type

declare 
    v_id wepull.t_book.id%type ;--定义的变量v_id类型与t_book中的id列的类型一致
    v_name wepull.t_book.name%type;
begin
   /*
     v_id:=1;
     v_name:='wepull';
    
    */
    
    select id ,name into v_id,v_name from wepull.t_book where id=1;
    dbms_output.put_line(v_id);
    dbms_output.put_line(v_name);
end;

--rowtype

declare 
       v_book wepull.t_book%rowtype ;--定义的变量v_book类型与t_book中列的类型一致
begin

    select * into v_book from wepull.t_book where id=1;
    dbms_output.put_line('id: '||v_book.id);
    dbms_output.put_line('name: '||v_book.name);
    dbms_output.put_line('tid: '||v_book.tid);
end;


--嵌套表
select * from t_book;

select * from wepull.t_book;


declare
       type book_table_type is table of wepull.t_book%rowtype;--定义类型
       v_book book_table_type:=book_table_type();
begin
       v_book.extend(5);
       select * into v_book(1)  from wepull.t_book where id=1;
       dbms_output.put_line(v_book(1).id||' '||v_book(1).name);
       
       select * into v_book(2)  from wepull.t_book where id=2;
       dbms_output.put_line(v_book(2).id||' '||v_book(2).name);
end;        
/
--流程控制语句

--if 

--单个if
--1.查询用户输入的id的图书,如果图书的tid=1 则输出图书类型为言情类
declare
   v_id wepull.t_book.id%type:=&v_id;
   v_tid wepull.t_book.tid%type;
begin
   select id,tid into v_id, v_tid from wepull.t_book where id=v_id;
   if (v_tid=1) then
      dbms_output.put_line('此id的图书为言情类');
   end if;
end;
/

--if else
--1.查询用户输入的id的图书,如果图书的tid=1 则输出图书类型为言情类,否则输出不是言情类
declare
   v_id wepull.t_book.id%type:=&v_id;
   v_tid wepull.t_book.tid%type;
begin
   select id,tid into v_id, v_tid from wepull.t_book where id=v_id;
   if (v_tid=1) then
      dbms_output.put_line(v_id|| ' :此id的图书为言情类');
   else
       dbms_output.put_line(v_id|| ' :此id的图书不是言情类');  
   end if;
end;
/

--
--if elsif

--1.查询用户输入的id的图书,
--如果图书的tid=1 则输出图书类型为言情类,
--如果图书的tid=2 则输出图书类型为计算机类
--如果图书的tid=3 则输出图书类型为言武侠类

select * from wepull.t_type;

declare
   v_id wepull.t_book.id%type:=&v_id;
   v_tid wepull.t_book.tid%type;
begin
   select id,tid into v_id, v_tid from wepull.t_book where id=v_id;
   
   if (v_tid=1) then
      dbms_output.put_line(v_id|| ' :此id的图书为言情类');
   elsif(v_tid=2)then
       dbms_output.put_line(v_id|| ' :此id的图书为计算机类');  
   elsif(v_tid=3)then
       dbms_output.put_line(v_id|| ' :此id的图书为武侠类');  
   end if;
end;
/

--case
declare
   v_id wepull.t_book.id%type:=&v_id;
   v_tid wepull.t_book.tid%type;
   v_typeName wepull.t_type.typeName%type;
begin
   select tid into v_tid from wepull.t_book where id = v_id;
   
   v_typeName :=
              case v_tid
                   when 1 then '言情类'
                   when 2 then '计算机类'
                   when 3 then '武侠类'
                   else '其他类'
              end;
   dbms_output.put_line('id: '||v_id);
   dbms_output.put_line('tid: '||v_tid);
   dbms_output.put_line('typeName: '||v_typeName);
end;
/

-- 
--case 搜索方式
declare
   v_id wepull.t_book.id%type:=&v_id;
   v_tid wepull.t_book.tid%type;
   v_typeName wepull.t_type.typeName%type;
begin
   select tid into v_tid from wepull.t_book where id = v_id;
   
   v_typeName :=
              case 
                   when v_tid=1 then '言情类'
                   when v_tid=2 then '计算机类'
                   when v_tid=3 then '武侠类'
                   else '其他类'
              end;
   dbms_output.put_line('id: '||v_id);
   dbms_output.put_line('tid: '||v_tid);
   dbms_output.put_line('typeName: '||v_typeName);
end;
/


--循环
--循环1---Loop
--求 1+2+....+100=?

declare
    v_i number:=0;
    v_sum number:=0;
begin
    loop
          v_i:=v_i+1;
          v_sum:=v_sum+v_i;
    exit when(v_i=100);
    end loop;   
    dbms_output.put_line('1+2+....+100='||v_sum);   
end;
/

--循环1---while
--求 1+2+....+100=?

declare
    v_i number:=0;
    v_sum number:=0;
begin
    while(v_i<100) loop
          v_i:=v_i+1;
          v_sum:=v_sum+v_i;
    end loop;   
    dbms_output.put_line('1+2+....+100='||v_sum);   
end;
/

--循环1---for
--求 1+2+....+100=?

declare
    v_i number:=0;
    v_sum number:=0;
begin
    for v_i in 1..100 
        loop
             v_sum:=v_sum+v_i;
    end loop;
  
    dbms_output.put_line('1+2+....+100='||v_sum);   
end;
/
--
declare
    v_i number:=0;
    v_sum number:=0;
begin
    for int in 1..100 
        loop
             v_i:=v_i+1;
             v_sum:=v_sum+v_i;
    end loop;
  
    dbms_output.put_line('1+2+....+100='||v_sum);   
end;
/

--goto

declare
    v_i number:=0;
    v_sum number:=0;
begin
    for v_i in 1..10 
        loop
           dbms_output.put_line('当前i为: '||v_i);  
           if(v_i=5) then
                     goto endloop;
            end if;         
    end loop;
    
    <<endloop>>
        dbms_output.put_line('此时v_i=5,退出了循环体');   
end;


--null语句
--goto

declare
    v_i number:=0;
    v_sum number:=0;
begin
    for v_i in 1..10 
        loop
           dbms_output.put_line('当前i为: '||v_i);  
           if(v_i=5) then
                     goto endloop;
            end if;         
    end loop;
    
    <<endloop>>
        null;   
end;


--游标
--使用游标取出emp表总前10人的信息。
select * from scott.emp;

declare
       --第一步:声明游标
       cursor emp_cursor is select * from scott.emp where rownum<=10; 
       emp_record scott.emp%rowtype;
begin
       --第二步:打开游标
       open emp_cursor;
       --第三步:从游标中取数据
       loop
            fetch emp_cursor into emp_record;--每取出一条数据,指针自动下移
            
       exit when(emp_cursor%notfound);--最后次取数据失败
            dbms_output.put_line(emp_record.empno|| '  ' ||emp_record.ename);
       end loop;
        --第四步:关闭游标
       close emp_cursor;
end;
/

--错误例子
declare
       --第一步:声明游标
       cursor emp_cursor is select * from scott.emp where rownum<=10; 
       emp_record scott.emp%rowtype;
begin
       --第二步:打开游标
       open emp_cursor;
       --第三步:从游标中取数据
       loop
            fetch emp_cursor into emp_record;--每取出一条数据,指针自动下移
            
             dbms_output.put_line(emp_record.empno|| '  ' ||emp_record.ename);
       
       exit when(emp_cursor%notfound);--最后次取数据失败
           
       end loop;
        --第四步:关闭游标
       close emp_cursor;
end;
/


--使用游标取出emp表总前10人的信息。  while


declare
       --第一步:声明游标
       cursor emp_cursor is select * from scott.emp where rownum<=10; 
       emp_record scott.emp%rowtype;
begin
       --第二步:打开游标
       open emp_cursor;
       --第三步:从游标中取数据
       
       fetch emp_cursor into emp_record;
       
       while(emp_cursor%found)loop
              dbms_output.put_line(emp_record.empno|| '  ' ||emp_record.ename);
              fetch emp_cursor into emp_record; 
       end loop;
        --第四步:关闭游标
       close emp_cursor;
end;
/


--使用游标取出emp表总前10人的信息。 for  必须掌握


declare
       --第一步:声明游标
       cursor emp_cursor is select * from scott.emp where rownum<=10; 
       emp_record scott.emp%rowtype;
begin
       for emp_rec in emp_cursor loop
         dbms_output.put_line(emp_rec.empno|| '  ' ||emp_rec.ename);  
       end loop;
end;
/

--使用游标取出emp表总指定job 和 deptno的员工信息。

select * from scott.emp 


declare
       --第一步:声明游标
       cursor emp_cursor(v_job scott.emp.job%type,v_deptno scott.emp.deptno%type) 
       is select * from scott.emp where job=v_job and deptno=v_deptno; 
       emp_record scott.emp%rowtype;
begin
       for emp_rec in emp_cursor('CLERK',30) loop
         dbms_output.put_line(emp_rec.empno|| '  ' ||emp_rec.ename);  
       end loop;
end;
/


--模糊查询
 select PATINDEX('%abb%','abcaabbeeabb') from dual;

select * from scott.emp where regexp_like(ename, '[AS]MITH');--SMITH






select * from scott.emp where ename like 'SMITH';


--游标的update操作
--更新指定图书的名字
declare
       cursor book_cursor is select * from  t_book for update; 
       --v_id t_book.id%type:=v_id;
       v_name t_book.name%type:=&v_name;
begin
       for book_rec in book_cursor loop
           if(book_rec.tid=1)  then 
                    update t_book set name=v_name where current of book_cursor;
           end if;
       end loop;
             
end;
/   

--隐式游标(了解)
--更新指定图书的名字,如果该图书没有找到,则打印”查无此图书”。
declare
       v_name t_book.name%type:=&v_name;
       v_id t_book.id%type:=&v_id;
       
begin
       update t_book set  name=v_name where id=v_id;
       if(sql%found) then
                     dbms_output.put_line('修改成功: '||v_id||' '||v_name);
       elsif(sql%notfound) then
                           dbms_output.put_line('没有指定id的图书 ');
       end if;                   
end;
/   




-------------存储过程
create or replace procedure p1 
as
       v_name t_book.name%type:='言情';
       v_id t_book.id%type:=1;
begin
       update t_book set name=v_name where id =v_id;
       if(sql%found) then
                 dbms_output.put_line('修改成功');
       end if;
end;
/

--调用存储过程
exec p1;

select * from t_book;

begin
     p1;
end;
/


--带参数的存储过程
--求1...N的和 (N为入参)
create or replace procedure p2(v_number in number)
as
       v_sum number:=0;
       v_i number:=0;
begin
       for v_i in 0..v_number loop
           
           v_sum:=v_sum+v_i;
       end loop; 
       dbms_output.put_line(v_sum);  
end;
       
--调用
begin
   p2(100);
end;
/

--带参数的存储过程
--求1...N的和 (v_number为入参,v_sum为出参)
create or replace procedure p3(v_number in number,v_sum out number)
as     
      
begin
       v_sum :=0;
       for v_i in 0..v_number loop
           
           v_sum:=v_sum+v_i;
       end loop; 
       dbms_output.put_line('存储过程中打印:'||v_sum);  
end;
       
--调用
declare
       v_sum number;
begin
   p3(100,v_sum);
   dbms_output.put_line('调用打印:'||v_sum);  
end;
/

--函数 无参
create or replace function my_fun
       return date
as
       v_date date;
begin
       select sysdate into v_date from dual;
       return v_date;
end;
/

--调用
select my_fun() from dual;
---
declare
        v_date date;
begin
        v_date:=my_fun();
        dbms_output.put_line(v_date);
end;
/


--函数 带参数
--根据id查询出图书名字
create or replace function getName(v_id t_book.id%type)
       return t_book.name%type
as
       v_name t_book.name%type;

begin
       select name into v_name from t_book where id = v_id;
       return v_name;
end;
/

--调用

declare 
       v_name t_book.name%type;
begin
       v_name:=getName(2);
       dbms_output.put_line(v_name);
end;
/

--触发器
create table book_log(
       username varchar2(10),
       action varchar2(10),
       adate  date
) 

select * from a;


create or replace trigger trigger_book
       after insert or update or delete on scott.a
begin
       if inserting then
          insert into book_log values (user,'insert',sysdate); 
       elsif updating then
          insert into book_log values (user,'update',sysdate); 
       elsif deleting then
          insert into book_log values (user,'delete',sysdate); 
       end if;
end;
/       
--测试
select * from a;
select * from book_log;

 insert into a values (8,'龙磊的铃声'); 
 update a set name='龙磊' where id = 8;
 
delete from a set name='龙磊' where id = 8;

--行触发器

create or replace trigger trigger_book
       after insert or update or delete on scott.a for each row
begin
       if inserting then
          insert into book_log values (user,'insert',sysdate); 
       elsif updating then
          insert into book_log values (user,'update',sysdate); 
       elsif deleting then
          insert into book_log values (user,'delete',sysdate); 
       end if;
end;
/ 
--
 update a set name=name||'2';
 delete from book_log;
 select * from book_log;
 select * from a;
     
  select * from emp;     
--异常处理(了解)

declare
        v_empno scott.emp.empno%type:=&v_empno;
        v_emp_rec emp%rowtype;
begin
        select * into v_emp_rec from scott.emp  where scott.emp.empno=v_empno;
        dbms_output.put_line(v_emp_rec.empno||' '||v_emp_rec.ename);
        
        exception
          when no_data_found then 
          dbms_output.put_line('没有此编号的员工 ');                                       
end;
/


declare
        v_deptno scott.emp.deptno%type:=&v_deptno;
        v_emp_rec emp%rowtype;
begin
        select * into v_emp_rec from scott.emp  where scott.emp.deptno=v_deptno;
        dbms_output.put_line(v_emp_rec.empno||' '||v_emp_rec.ename);
        
        exception
          when no_data_found then 
                dbms_output.put_line('没有此编号的员工 ');
          when too_many_rows then 
                dbms_output.put_line('select 语句返回了多行数据 ');                                       
end;








 

with e as 用法: 

 

其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它,这样对于大批量的sql语句起到一个优化的作用,而且清楚明了。


with e as (select * from smc_sql )
select * from e 
where e.id=2;



with as优点
增加了sql的易读性,如果构造了多个子查询,结构会更清晰;
更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标

 

分享到:
评论

相关推荐

    ORACLE EBS R12 安装步骤详解

    * 笔记本配置:内存 3G、硬盘 500G、操作系统 Window XP SP3 * 虚拟机环境:操作系统 Window Server 2003 Enterprise、内存分配 1.5G、虚拟内存 3-6G 二、ORACLE EBS 安装前的准备 * 下载 ORACLE EBS 文件:从 ...

    笔记本上vbox虚拟化环境安装 oracle rac详细原创完整版

    一.LINUX 服务器安装配置 .... 二. ORACLE数据库安装前准备工作 ...... 2.8.1创建固定大小的vdi磁盘文件 ...3.5 创建ORACLE的ASM和ORACLE实例 3.6 客户端的配置配置客户端 四.ORACLE 10G RAC 常用命令 ...

    一步一图在两个Oracle Linux虚拟机上安装Oracle11gR2RAC

    ### 一步一图在两个Oracle Linux虚拟机上安装Oracle11gR2RAC #### 一、项目背景与目标 本文档详细介绍了如何在两个Oracle Linux虚拟机上安装Oracle 11g Release 2 (11.2) Real Application Clusters (RAC)。通过...

    Oracle安装过程

    - **步骤3**: 对于大多数个人使用场景(如个人笔记本电脑),直接选择默认的“桌面类”即可。 #### 六、典型安装配置 - **步骤4**: 这一步非常重要。首先,建议更改Oracle基目录的位置,确保路径中不含中文或其他...

    oracle安装配置步骤.docx

    6. **系统类型选择**:根据你的硬件环境,如果安装在个人笔记本或个人电脑上,通常选择“桌面类”。 7. **安装信息配置**:在此步骤,你需要为默认数据库命名并设置管理密码。确保Oracle的安装路径不包含任何中文...

    oracle完美卸载

    oracle的卸载步骤,可以将自己的笔记本电脑中的oracle数据库完美卸载

    Vmware+Linux+Oracle+10G+RAC全程详细图解

    实验基于一台具备2GB内存和320GB硬盘的笔记本,采用的工具包括Vmware Server 1.0.6版、Linux Enterprise 5.1版和Oracle 10g for Linux (10.2.0.1)。 #### 实验挑战与解决方案 最初,实验计划使用Vmware ...

    Oracle安装步骤详解(附图)

    3. **系统类型**:如果你的设备是个人笔记本或个人电脑,选择默认的“桌面类”。 4. **典型安装**:这一步至关重要。你需要修改Oracle基目录,确保路径中不含中文或特殊字符。全局数据库名可以保持默认,同时设置...

    oracle parallel SQL

    尽管桌面和笔记本电脑可能只有一个磁盘设备,但数据库服务器系统通常会将数据库文件分布在多个独立的磁盘设备上。在串行处理中,SQL 语句被单一的会话进程顺序执行,这就意味着同时只能使用一个 CPU 或磁盘设备。 ...

    oracle10.2.0.1升级到10.2.0.4

    虽然在这个案例中,由于是在个人笔记本上的数据库,没有进行数据备份,但在生产环境中,一定要确保有最新的数据备份,以防万一升级过程中发生问题,可以迅速恢复到原始状态。备份应包括完整数据库的物理备份,以及...

    通过 Oracle Advanced Security 实现 Oracle Database 12c 中的加密和编辑

    现在用户不仅使用笔记本电脑,还会使用平板电脑和智能手机,而一旦这些客户端设备被盗,就很可能非常容易地泄露敏感信息。外包、海外建厂、企业并购以及近乎持续的组织变革都会产生额外的风险,恶意的内部人员能够更...

    ROSE HA双机 ORACLE实施文档

    ### ROSE HA 双机 ORACLE 实施文档关键知识点解析 #### 一、项目背景与目标 本实施文档旨在详细记录ROSE HA 双机环境下ORACLE数据库的部署过程及配置细节,确保高可用性和数据安全性。适用于需要构建稳定、高效...

    Oracle_11g_安装图解(详细版).doc

    保持默认的桌面类选择,适用于个人笔记本或个人使用场景。 ##### 6. 典型安装 在典型安装设置中,重点在于更新Oracle基目录,确保路径不含中文或其他特殊字符。全局数据库名可保持默认,但必须设定并记住密码。...

    虚拟机server2.0.2下linux5.6安装oracle11.2.0.1RAC

    1. **虚拟环境搭建**:使用VMware Server 2.0.2在Sony VPC-CW18FC笔记本上构建虚拟化环境,该笔记本配备4GB内存。 2. **操作系统与软件版本**:采用Red Hat Enterprise Linux 5.6 x64作为操作系统,Oracle Database...

    oracle 系统图标库.PPT

    计算机及配件(Computers and Accessories)部分则可能包括台式机、笔记本电脑以及其他硬件设备,例如模拟的 Windows 操作系统(Dummy NT)图标,这些可用于表示 IT 基础设施、网络设备或终端用户设备。 在使用这些...

    Oracle Sales for Handhelds Implementation Guide

    2. **Oracle Sales 同步**:此功能允许用户在笔记本电脑、台式机或Pocket PC设备与eBusiness Suite之间同步数据。支持的同步内容有: - 日程安排 - 任务 - 联系人 Oracle Sales Synchronization专门针对以下设备...

    Oracle数据库Lite 10g第三版

    DS Waters公司的案例证明了Oracle数据库Lite 10g的价值,他们已经在上千台笔记本电脑上部署了该产品,实现了极低的故障率和显著的投资回报。Oracle数据库Lite 10g第三版的推出,将帮助更多企业如DS Waters一样,通过...

    oracle11g_rac_install_on_RHEL6.4

    十分详细的Oracle11G的安装手册,作者的笔记本本身就是8个内存。注意咯!8G哟!没有的同学建议,去找两个笔记本,或者升级吧,要不然就只能看看咯!

Global site tag (gtag.js) - Google Analytics