orcale笔记--北京尚学堂 20140824

数据库配置文件已经安装到 D:\oracle\product\10.2.0,同时其他选定的安装组件也已经安装到 D:\oracle\product\10.2.0\db_1。iSQL*Plus URL 为:http://mys:5560/isqlplusiSQL*Plus DBA URL 为:http://mys:5560/isqlplus/dba
plsqldev-trial.exe
toad for oracle
-----------------------------------------------------------------------------------------------------------------------
创建用户

SQL> create user drp1 identified by drp1;

创建表空间

SQL> desc dba_users;

SQL> select username, DEFAULT_TABLESPACE  from dba_users;

将drp1的表空间修改为ts_drp1

SQL> alter user drp1 default tablespace ts_drp1;

给用户drp1授权

SQL> grant create session, create table, create view, unlimited tablespace to drp1;



SQL> show user;
User is "SYS"

切换用户到drp1

SQL> conn drp1/drp1;
Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
Connected as drp1



导入sql脚本

SQL> show user;
User is "drp1"

SQL> @D:\share\05_DRP\sql_script\drp_create.sql;

 


**--**--**--^ java 编程 jdbc ^--**--**--**
--------------------------------------------------------------------------------------------------------
  Class.forName("oracle.jdbc.driver.OracleDriver");
 // new oracle.jdbc.driver.OracleDriver();
  Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:ORCL","scott","tiger");
  Statement stmt = conn.createStatement();
  ResultSet rs = stmt.executeQuery("select * from dept");
  while(rs.next()){
 System.out.println(rs.getString("deptno"));
 System.out.println(rs.getInt("deptno"));
  }
--------------------------------------------------------------------------------------------------------
//增加序列值,获取序列值
 conn sys/tiger as sysdba;
grant create SEQUENCE TO itcast;

conn itcast/itcast;
create sequence studentPKSequence start with 1 increment by 1;
select studentpksequence.nextval from dual;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
sqlplus sys/密码(我的是tiger) as sysdba
SQL> alter user scott account unlock;
ed 进入记事本方式的编辑模式 最后不加分号,退出保存后 / 回车运行
set serveroutput on;
第3节 desc emp
        desc dept
        desc salgrade
        select * from salgrade;
        select * from dept;
 select * frome emp;
 select ename, sal*12 from emp;
 desc dual
 select sysdate from dual;
第4节 select
 select ename, sal*12 anuual_sal from emp;
 select ename, sal*12 "anuunal sal" from emp;
 select ename,comm from emp; //空值与0不同
 select ename, sal*12+comm from emp;//含有任何空值的数学表达式都是空值
 select ename||sal from emp;
 select ename || 'kjhkjsdkgsdgfsk' from emp;//连接数据和字符串
 select ename || 'dklhhg''dkjhksehf' from emp;//连接数据和两个不同的字符串,用两个单引号分开
第5节 distinct
 select distinct deptno from emp;//重复的数据不显示
 select distinct deptno , job from emp;//两个重复的组合不显
第6节 where
 select * from dept;
 select * from emp;
 select * from emp where deptno = 10;//将部门编码是10的成员显示出来
 select * from emp where ename = 'CLARK';
 select * from emp where sal > 1500;
 select ename, sal from emp where deptno <>10;
 select ename, sal, deptno from emp where deptno <> 10;
 select ename, sal from emp where ename > 'CBA';
 select sal from emp where sal between 800 and 1500;
 select sal from emp where sal >= 800 and sal <= 1500;
 select ename, sal, comm from emp where comm is null;//显示空值
 select ename, sal, comm from emp where comm is not null;
 select ename, sal, comm from emp where sal in (800, 1500, 2000);//取等于3者的值
 select ename, sal, comm from emp where ename in ('SMITH', 'KING', 'ABC');
 select ename, sal, hiredate from emp where hiredate > '20-2月-81'
 select ename, sal from emp where deptno = 10 and sal >1000;
 select ename, sal from emp where deptno = 10 or sal >1000;
 select ename, sal from emp where dsal not in <800, 1500, 2000>;
 select enmae from emp where ename like '%ALL%';
 select ename from emp where ename like '_A%';
 select enmae from emp where ename like '%\%%';
 
 select enmae from emp where ename like '%$*%' escape '$';
第7节 order by
 select * from dept;
 select empno, ename from dept order by deptno desc;//按降序排列
 select empno, ename from emp order by empno asc;//按升序排列 asc 可以不写
 select empno, ename from emp where deptno <> 10 order by empno asc;//deptno 不等于10
 select ename, sal, deptno from emp order by deptno asc, ename desc;
第8节
 select ename, sal*12 annual_sal from emp
      2 where ename not like '_A%' and sal > 800 
      3 order by sal desc;
 
 select lower(ename) from emp;//ename转换为小写
 select ename from emp where lower(ename) like '_a%';
 select ename from emp where ename like '_a%' or ename like '_A%';
  select substr(ename,2,3) from emp;//从第二个字符开始,一共截3个字符;
 select chr(65) from dual;//把ansiic编码转换为字母
 select ascii('A') from dual;
 select round(23.652) from dual;
 select round(23.653,2) from dual;//四舍五入到2位小数;
 select round(23.653,-1) from dual;//四舍五入到个位数;
**** select to_char(sal,'$99,999.9999') from emp;//转换输出类型
**** select to_char(sal,'L99,999.9999') from emp;//转换输出类型,本地货币
 select to_char(sal,'L00,000.0000') from emp;//转换输出类型,本地货币
 select hiredate from emp;
 select to_char(hiredate, 'YYYY-MM-DD HH:MI:SS') from emp;//12进制显示时间
 select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from emp;//24进制显示时间
第9节
 select ename, hiredate from emp where hiredate > '1921-2-20 12:34:56';
**** select ename, hiredate from emp where hiredate >
      2 to_date<'1921-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');
 
 select sal from emp where sal > 888.88;
**** select sal from emp where sal > to_number('$1,250.00','$9,999.99');
**** select ename, sal*12 + nvl(comm,0) from emp;//将空值转换为0;
第10节 组函数
 select max(sal) from emp;
 select min(sal) from emp;
 select avg(sal)from emp;
 select to_char(avg(sal), '9,999.99') from emp;
 select round(avg(sal),2) from emp;
 select sum(sal) from emp;
***** select count(*) from emp;
 select count(*) from emp where deptno = 10;
 select count(ename) from emp;
 select count(comm) from emp;
 select count(distinct deptno) from emp;
第11节 group
 select sal, deptno from emp;
 select avg(sal) from emp group by deptno;//分组函数
 select deptno, avg(sal) from emp group by deptno;
 select max(sal) from emp group by deptno, job;
 select deptno, job, max(sal) from emp group by deptno, job;
 select max(sal) from emp;
 select ename from emp where sal = (select max(sal) from emp);
 select deptno, max(sal) from emp group by deptno;
 //出现在select列表中的字段没有出现在组函数里,就必须出现在group by 中
第12节 having
 select avg(sal),deptno from emp group by deptno;
 select avg(sal), deptno from emp group by deptno having avg(sal) > 2000;//对分组进行限制
 select from where group by having order by
 select avg(sal) from emp where sal > 1200 group by deptno
      2 having avg(sag) >1500 order by avg(sag) desc;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第13节 子查询
 select ename from emp where sal = (select max(sal) from emp);
 select sal from emp where sal >(select avg(sag)from emp);
--求部门中哪些人的薪水最高
 select ename, sal,deptno from emp
      2 join (select max(sal) max_sal, deptno from emp group by deptno) t on
      3 (emp.sal = t.max_sal and emp.deptno = t.deptno);
 
 
第14节
 select empno, enam, mgr from emp;
 select e1.ename, e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
第15节
 select ename, dname, grade d from emp e, dept d, salgrade s
      2 where e.deptno = d.deptno and e.sal between s.losal and s.hisal and
      3 job <> 'CLERK';
   等值连接
 select ename ,dname from emp dept;
 select ename, dname from emp cross join dept;//笛卡尔乘积 cross join
 select ename, dname from emp, dept where emp.deptno = dept.deptno;
 select ename, dname from emp join dept on(emp.deptno = dept.deptno);
 select ename, dname from emp join dept using (deptno);
   非等值连接
 select ename, grade from emp e join salgrade s on ( e.sal between s.losal and s.hisal);
 select ename, dname, grade from emp e join dept d on (e.deptno = d.deptno) join salgrade s
      2 on (e.sal between s.losal and s.hisal) where ename not like '_A%';
 
 select e1.ename, e2.ename from emp e1 join emp e2 on (e1.mgr = e2.empno);
 select e1.ename, e2.ename from emp e1 left outer join emp e2 on//左外连接
      2 (e1.mgr = e2.empno);
 select * from dept;
 select ename, dname from emp e right join dept d on(e.deptno = d.deptno);//右外连接
 select ename, dname from emp e full join dept d on (e.deptno = d.deptno);//全外连接
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第16节
--求部门平均薪水的等级
 select deptno, avg_sal, grade from (select deptno, avg(sal) avg_sal from emp group by deptno) t
      2 join salgrade s on (t.avg_sal between s.losal and s.hisal)
第17节
--求部门平均薪水的等级
 select avg(grade) from (select deptno, ename, grade from emp join salgrade s on (emp.sal between s.losal and s.hisal))t group by deptno
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第18节
--雇员中哪些人事经理人
 select ename from emp where empno in(select mgr from emp);
 select ename from emp where empno in(select distinct mgr from emp);
第19节
--不准用组函数,求薪水的最高值
 select distinct sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal< e2.sal) );
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第20节
--求平均薪水最高的部门的部门编号
 select deptno, avg_sal from
          (select deptno, avg(sal) avg_sal from emp group by deptno)
        where avg_sal =
              (select max(avg_sal) from
                (select deptno, avg(sal) avg_sal from emp group by deptno)
          )
        select deptno, avg_sal from
          (select deptno, avg(sal) avg_sal from emp group by deptno)
        where avg_sal =
              (select max(avg(sal)) from emp group by deptno)
 
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
--求平均薪水最高的部门的部门名称
  select dname from dept where deptno =
   (select deptno from
     (select deptno, avg(sal) avg_sal from emp group by deptno)
        where avg_sal =
         (select max(avg_sal) from
           (select deptno, avg(sal) avg_sal from emp group by deptno)
                )
          )
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第22节
---求平均薪水的等级最低的部门的部门名称
select dname, t1.deptno, grade, avg_sal from
(
  select deptno,grade, avg_sal from
    (select deptno, avg(sal) avg_sal from emp group by deptno) t
 join salgrade s on (t.avg_sal between s.losal and s.hisal)
) t1
join dept on (t1.deptno = dept.deptno)
where t1.grade =
(
  select min(grade) from
    (
       select deptno,grade, avg_sal from
       (select deptno, avg(sal) avg_sal from emp group by deptno) t
       join salgrade s on (t.avg_sal between s.losal and s.hisal)
     )
)
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第23节
 conn sys/tiger as sysdba;
 grant create table, create view to scott;
 conn scott/tiger
 
 create view v&_dept_avg_sal_info as
  select deptno,grade, avg_sal from
    (select deptno, avg(sal) avg_sal from emp group by deptno) t
  join salgrade s on (t.avg_sal between s.losal and s.hisal)
 select dname, t1.deptno, grade, avg_sal from
 v&_dept_avg_sal_info t1
  join dept on (t1.deptno = dept.deptno)
 where t1.grade =
 select min(grade) from v&_dept_avg_sal
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第24节
--求部门经理人中平均薪水最低的部门名称
--求比普通员工最高薪水还要高的
 select ename from emp
 where empno in ( select distinct mgr from emp where mgr is not null)
 and sal >
 (
    select max(sal) from emp where empno not in (select distinct mgr from emp where mgr is not null)
 )
第25节 create_new_user_and_insert
 conn sys/tiger sysdba;
 drop user liuchao;
cmd D:\>cd javab
cmd D:\javab>exp
cmd 用户名: scott/tiger
sqlplus create user liuchao identified by liuchao default tablespace users quota 10M on users;
 grant create session, create table, create view to liuchao;
 
cmd D:\>cd javab
 D:\javab>imp
 用户名: liuchao/liuchao
sqlplus desc dept;
 insert into dept values (50, 'game', 'bj');
 select * from dept;
 rollback;
 create table dept2 as select * from dept;
 create table salgrade2 as select * from salgrade;
 create table emp3 as select * from emp;
 insert into dept2 values (50,'game','bj');
 insert into dept2 (deptno,dname) values (60, 'game2);
 insert into dept2 select * from dept;
第26节
 SQL面试题
 有3个表S,C,SC
 S(SNO,SNAME)代表(学号,姓名)
 C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)
 SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)
 问题:
 1,找出没选过“黎明”老师的所有学生姓名。
 select sname from s join sc on (s.sno = sc.sno)join c (c.cno = sc.cno) where c.cteacher <> 'liming';
 2,列出2门以上(含2门)不及格学生的姓名和平均成绩
 select * where sno in (select sno from sc where scgrade < 60
 group by sno having count (*) >=2);
 3,即学过1号课程又学过2号课所有学生的姓名
 select sname from s where sno in (select sno from sc where cno = 1 and cno
 in ( select distinct sno from sc where cno =2));
 
 update emp2 set sal = sal*2, ename = ename||'-' where deptno < 25;
 select ename, sal from emp2 where deptno = 10;
 delete from dept2 where deptno = 10;
 rollback;
 create table t (a varchar2(10));
 desc t;
 drop table t;
 update emp2 set sal = sal*2;
 delete from dept2;
 insert into salgrade values (6,1000,2000);
 rollback;//回退3行
 update emp2 set sal = sal*2;
 committ;//提交
 rollback;//已经提交,不能回退
 update dept2 set deptno = deptno * 2;
 create table t (a varchar2(20));
 rollback;//已执行ddl语句,不能回退 dcl语句(grant授权语句),也不能回退,自动提交
 select * from dept2//正常断开链接,自动提交,非正常断开,非自动提交。
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第27节 create_table
   create table stu
 (
 id number(6) ,
 name varchar2(20),
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50)
)
 
第28节
 insert into stu(name, email) values ('a','a');
 insert into stu(name, email) values ('b','b');
第29节
 create table stu
 (
 id number(6),
 name varchar2(20) constraint stu_name_nn not null,//键值约束
 sex number(1),
 age number(3),
 sdate date,
 grade number(2) default 1,
 class number(4),
 email varchar2(50) unique,
constraint stu_class_fk foreign key (class) references class(id),//外键约束
constraint stu_id_pk primary key(id),//主键约束(非空 唯一)
 constraint stu_name_email_uni unique(email,name)//表级约束
)
 
create table class
(
id number(4) primary key,//被参考的外键必须是主键
name varchar2(20) not null
)
第30节
第31节
 alter table stu add(addr varchar2(100));
 desc stu;
 alter table stu drop (addr);
 alter table stu add(addr varchar2(100);
 alter table stu modify(addr varchar2(150));
 alter table stu modify (addr varchar2(50));
 delet from class ;//违反约束条件
 alter table stu drop constraint stu_class_fk;//修改约束条件
 delete from class;
 rollback;
 alter table stu add constraint stu_class_fk foreign key(class) references class (id);
 drop table stu;
第32节
  desc user_tables;//数据字典表
 select table_name from user_tables;//表名字
 select view_name from user_views;//视图名字
 select constraint_name from user_constraint//约束名字;
 select constraint_name, table_name from user_constraints;
 desc dictionary;//数据字典表的表
 select table_name from dictionary where table_name like 'USER%';
第33节 索引 视图
 create index idx_stu_email on stu (email);
 drop index idx_stu_email;
 select index_name from user_indexes;//查看索引名字
 select view_name from user_views;
 desc v$_dept_avg_sal_info;
 create view v$_stu as select id,name, age from stu;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第34节 序列
 create table article
       (
        id number,
        title varchar2(1024),
        cont long
        )
        create sequence seq;
        select seq.nextval from dual;
        insert into article values (seq.nextval,'a','b');
第35节 三范式(在同一个表中)
 第一范式 要有主键 列不可分
 第二范式 组合主键,不存在非主键依赖部分主键
 第三范式 不能存在传递依赖
第36节 BBS
第37节
第38节 PL_SQL
 set serveroutput on;
 begin
           dbms_output.put_line('HelloWorld');
        end;
        /
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第39节
 declare
    v_name varchar2(20);
 begin
      v_name := 'myname';
      dbms_output.put_line(v_name);
 end;
 /
 
 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;
 /
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第40节
----变量声明的规则
1,变量名不能使用保留字,如from、select等
2,第一个字符必须是字母
3,变量名最多包含30个字符
4,不要与数据库的表或者列同名
5,每一行只能声明一个变量
----常用变量类型
1,binary_integer :整数,主要用来计数而不是用来表示字段类型
2,number:数字类型
3,char:定长字符串
4,varchar2:变长字符串
5,date:日期
6,long 长字符串,最长2GB
7,boolean:布尔类型,可以取值为true,false和null值
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
       
----变量声明
 declare
   v_temp number(1);
   v_count binary_integer :=0;
   v_sal number(7,2) := 4000.00;
   v_date date := sysdate;
   v_pi constant number(3,2) := 3.14;
   v_valid boolean := false;
   v_name varchar2(20) not null := 'MyName';
 begin
   dbms_output.put_line('v_temp value:'||v_count);
 end;
 show user;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
--变量声明,使用%type属性
declare
 v_empno number(4);
   v_empno2 emp.empno%type;
   v_empno3 v_empno2%type;
begin
 dbms_output.put_line('Test');
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第41节
---Table变量类型
declare
 type type_table_emp_empno is table of emp.empno%type index by binary_integer;
    v_empnos type_table_emp_empno;
begin
 v_empnos(0) := 7369;
 v_empnos(2) := 7839;
 v_empnos(-1) := 9999;
 dbms_output.put_line(v_empnos(-1));
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第42节
--Record变量类型
declare
 type type_record_dept is record
   (
  deptno dept.deptno%type,
  dname dept.dname%type,
  loc dept.loc%type
   );
   v_temp type_record_dept;
begin
 v_temp.deptno :=50;
   v_temp.dname := 'aaaa';
   v_temp.loc := 'bj';
   dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname);
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
--使用%rowtype声明record变量类型
declare
 
  v_temp dept%rowtype;
begin
 v_temp.deptno :=50;
   v_temp.dname := 'aaaa';
   v_temp.loc := 'bj';
   dbms_output.put_line(v_temp.deptno ||' '||v_temp.dname);
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第43节
PLSQL语句输出只能且必须输出一条语句
--SQL语句的运用
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;
--SQL语句的运用
declare
  v_emp emp%rowtype;
begin
 select * into v_emp from emp where empno = 7369;
   dbms_output.put_line(v_emp.ename);
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
---insert语句
declare
   v_deptno dept.deptno%type := 50;
   v_dname dept.dname%type := 'aaa';
   v_loc dept.loc%type := 'bj';
begin
   insert into dept2 values (v_deptno, v_dname, v_loc);
   commit;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
----%rowcount语句
declare
   v_deptno emp2.deptno%type := 10;
   v_count number;
begin
   update emp2 set sal = sal/2 where deptno = v_deptno;
   --select deptno into v_deptno from emp2 where empno = 7369;//1条语句被影响
   --select count(*) into v_count from emp2; //1条语句被影响
   dbms_output.put_line(sql%rowcount ||'条语句被影响');//3条语句被影响
   commit;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第44节
DML语句 insert delete update
DDL语句 数据定义语言 create create table
DCL语句 授权语句grant to
 begin
    execute immediate 'create table T (nnn varchar2(20) default ''aaa'')';
 end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
--if语句
--取出7369的薪水,如果<1200,则输出'low',如果<2000则输出'middle',否则'high'
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;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
declare
   v_sal emp.sal%type;
begin
   select sal into v_sal from emp2
            where empno = 7839;
   if(v_sal <2500) then
     update emp2 set sal = sal*2;
   elsif(v_sal > 2500 ) then
     update emp2 set sal = sal/2;
   else
            dbms_output.put_line(v_sal);
   end if;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第45节
--循环
declare
   i binary_integer := 1;
begin
   loop
 dbms_output.put_line(i);
 i := i + 1;
 exit when ( i >=11);
   end loop;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
declare
   j binary_integer := 1;
begin
   while j < 11 loop
 dbms_output.put_line(j);
 j := j + 1;
   end loop;
end;
begin
   for k in 1..10 loop
 dbms_output.put_line(k);
   end loop;
   for k in reverse 1..10 loop
 dbms_output.put_line(k);
   end loop;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第46节 异常
declare
   v_temp number(4);
begin
   select empno into v_temp from emp where deptno = 10;
exception
   when too_many_rows then
 dbms_output.put_line('太多记录了');
   when others then
 dbms_output.put_line('error');
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
declare
   v_temp number(4);
begin
   select empno into v_temp from emp where empno = 2222;
exception
   when no_data_found then
 dbms_output.put_line('没数据');
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
create table errorlog
(
  id number primary key,
  errcode number,
  errmsg varchar2(1024),
  errdate date
)
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
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;
 select * from errorlog;
 select to_char(errdate, 'YYYY-MM-DD HH24:MI:SS') from errorlog;//查看出错时间
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第47节 游标cursor
declare
   cursor c is
    select * from emp;
   v_emp c%rowtype;
begin
   open c;
 fetch c into v_emp;
 dbms_output.put_line(v_emp.ename);
   close c;
end;
cursor属性 isopen //打开了,则返回true
     notfound //没有打开,则返回true
     found //找到了,则返回true
     rollcount //fetch到多少条记录,则返回多少条记录
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
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);//若这条语句在exit之前,则最后一条记录为没有时,打印上一条记录。
   end loop;
   close c;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第48节
declare
   cursor c is
    select * from emp;
   v_emp emp%rowtype;
begin
  open c;
   fetch c into v_emp;
   while (c%found) loop
 fetch c into v_emp;
 dbms_output.put_line(v_emp.ename);//若这条语句在exit之前,则最后一条记录为没有时,打印上一条记录。
   end loop;
   close c;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
declare
   cursor c is
    select * from emp;
begin
  for v_emp in c loop
 dbms_output.put_line(v_emp.ename);
   end loop;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
----带参数的游标
declare
   cursor c(v_deptno emp.deptno%type, v_job emp.job%type)
   is
      select ename, sal from emp where deptno = v_deptno and job = v_job;
   --v_temp c%rowtype;
begin
   for v_temp in c(30,'CLERK') loop
      dbms_output.put_line(v_temp.ename);
   end loop;
end;
/
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
declare
   cursor c
   is
      select * from emp2 for update;
   --v_temp c%rowtype;
begin
   for v_temp in c loop
      if(v_temp.sal < 2000) then
  update emp2 set sal = sal * 2 where current of c;
      elsif (v_temp.sal = 5000) then
   delete from emp2 where current of c;
      end if;
   end loop;
   commit;
end;
/
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第49节 创建存储过程
create or replace procedure p
is
   cursor c is
    select * from emp2 for update;
begin
   for v_emp in c loop
            if(v_emp.deptno = 10) then
   update emp2 set sal = sal + 10 where current of c;
     elsif (v_emp.deptno = 20) then
   update emp2 set sal = sal + 20 where current of c;
     else
   update emp2 set sal = sal + 50 where current of c;
      end if;
    end loop;
    commit;
end;
exec p;//执行语句
begin
    p;
end;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
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;
show error//编译错误时,显示错误
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;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第50节
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 lower(ename), sal_tax(sal) from emp;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
触发器
create or replace trigger trig
     after insert or delete or update on emp2
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;
/
update emp2 set sal = sal*2 where deptno = 30;
select * from emp2_log;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
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;
update emp2 set sal = sal*2 where deptno = 30;
select * from emp2_log;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第51节
drop trigger trig;
update dept set deptno = 99 where deptno = 10;//违反约束条件,不能修改
create or replace trigger trig //创建触发器
 after update on dept
 for each row
begin
 update emp set deptno = :NEW.deptno where deptno = :OLD.deptno;
end;
update dept set deptno = 99 where deptno = 10; //违反约束条件,但可以更改
select deptno from dept;
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
第52节
--树状结构的存储与展示
drop table article;
create table article
(
id number primary key,
cont varchar2(4000),
pid number,
isleaf number(1),--0 代表非叶子节点,1代表叶子节点
alevel number(2)
)
insert into article values(1,'蚂蚁大战大象',0,0,0);
insert into article values(2,'大象被打趴下',1,0,1);
insert into article values(3,'蚂蚁也不好过',2,1,2);
insert into article values(4,'瞎说',2,0,2);
insert into article values(5,'没有瞎说',4,1,3);
insert into article values(6,'怎么可能',1,0,1);
insert into article values(7,'怎么没有可能',6,1,2);
insert into article values(8,'可能行很大的',6,1,2);
insert into article values(9,'大象进医院了',2,0,2);
insert into article values(10,'蚂蚁是护士',9,1,3);
create or replace procedure p (v_pid article.pid%type) is
  cursor c is select * from article where pid = v_pid;
begin
   for v_article in c loop
       dbms_output.put_line(v_article.cont);
       if (v_article.isleaf = 0) then
          p (v_article.id);
       end if;
   end loop;
end;
/
exec p(0);
**********************************************************
显示结果为:
蚂蚁大战大象
大象被打趴下
蚂蚁也不好过
瞎说
没有瞎说
大象进医院了
蚂蚁是护士
怎么可能
怎么没有可能
可能行很大的
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------
create or replace procedure p (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 (v_article.id,v_level + 1);
       end if;
   end loop;
end;
 exec p(0,0);
显示结果为:
蚂蚁大战大象
****大象被打趴下
********蚂蚁也不好过
********瞎说
************没有瞎说
********大象进医院了
************蚂蚁是护士
****怎么可能
********怎么没有可能
********可能行很大的
-------------------------------------------------------------------------------------
*************************************************************************************
-------------------------------------------------------------------------------------




create table student(
   sid number constraint sid not null,
   sname varchar2(20),
   magor varchar2(20),
    birth date,
    score float(126)
   );









 

posted @ 2020-02-29 12:17  my_flash  阅读(34)  评论(0)    收藏  举报