• 尚学堂马士兵Oracle教程笔记


    1. 检查Oracle安装
    2. 首先,以超级管理员的身份登录oracle   
    3.     sqlplus sys/bjsxt as sysdba   
    4.   
    5. 然后,解除对scott用户的锁   
    6.     alter user scott account unlock;   
    7. 那么这个用户名就能使用了。   
    8. (默认全局数据库名orcl)   
    9.   
    10. 1、select ename, sal * 12 from emp; //计算年薪   
    11. 2、select 2*3 from dual;  //计算一个比较纯的数据用dual表   
    12. 3、select sysdate from dual;  //查看当前的系统时间   
    13. 4、select ename, sal*12 anuual_sal from emp; //给搜索字段更改名称(双引号 keepFormat 别名有特殊字符,要加双引号)。   
    14. 5、任何含有空值的数学表达式,最后的计算结果都是空值。   
    15. 6、select ename||sal from emp;  //(将sal的查询结果转化为字符串,与ename连接到一起,相当于Java中的字符串连接)   
    16. 7、select ename||'afasjkj' from emp;   //字符串的连接   
    17. 8、select distinct deptno from emp;   //消除deptno字段重复的值   
    18. 9、select distinct deptno , job from emp; //将与这两个字段都重复的值去掉   
    19. 10、select * from emp where deptno=10;   //(条件过滤查询)   
    20. 11、select * from emp where empno > 10;  //大于 过滤判断   
    21. 12、select * from emp where empno <> 10  //不等于  过滤判断   
    22. 13、select * from emp where ename > 'cba';  //字符串比较,实际上比较的是每个字符的AscII值,与在Java中字符串的比较是一样的   
    23. 14、select ename, sal from emp where sal between 800 and 1500;  //(between and过滤,包含800 1500)   
    24. 15、select ename, sal, comm from emp where comm is null;  //(选择comm字段为null的数据)   
    25. 16、select ename, sal, comm from emp where comm is not null;  //(选择comm字段不为null的数据)  
    26. 17、select ename, sal, comm from emp where sal in (8001500,2000);  //(in 表范围)   
    27. 18、select ename, sal, hiredate from emp where hiredate > '02-2月-1981'//(只能按照规定的格式写)   
    28. 19、select ename, sal from emp where deptno =10 or sal >1000;   
    29. 20、select ename, sal from emp where deptno =10 and sal >1000;   
    30. 21、select ename, sal, comm from emp where sal not in (8001500,2000);  //(可以对in指定的条件进行取反)   
    31. 22、select ename from emp where ename like '%ALL%';   //(模糊查询)   
    32. 23、select ename from emp where ename like '_A%';    //(取第二个字母是A的所有字段)   
    33. 24、select ename from emp where ename like '%/%%';   //(用转义字符/查询字段中本身就带%字段的)  
    34. 25、select ename from emp where ename like '%$%%' escape '$';   //(用转义字符/查询字段中本身就带%字段的)   
    35. 26、select * from dept order by deptno desc; (使用order by  desc字段 对数据进行降序排列 默认为升序asc);   
    36. 27、select * from dept where deptno <>10 order by deptno asc;   //(我们可以将过滤以后的数据再进行排序)     
    37. 28、select ename, sal, deptno from emp order by deptno asc, ename desc;   //(按照多个字段排序 首先按照deptno升序排列,当detpno相同时,内部再按照ename的降序排列)   
    38. 29、select lower(ename) from emp;  //(函数lower() 将ename搜索出来后全部转化为小写);   
    39. 30、select ename from emp where lower(ename) like '_a%';  //(首先将所搜索字段转化为小写,然后判断第二个字母是不是a)   
    40. 31、select substr(ename, 23) from emp;    //(使用函数substr() 将搜素出来的ename字段从第二个字母开始截,一共截3个字符)   
    41. 32、select chr(65) from dual;  //(函数chr() 将数字转化为AscII中相对应的字符)    
    42. 33、select ascii('A') from dual;  //(函数ascii()与32中的chr()函数是相反的 将相应的字符转化为相应的Ascii编码)                                                                                                                                                                                                                                                                                                                                             )   
    43. 34、select round(23.232) from dual;  //(函数round() 进行四舍五入操作)   
    44. 35、select round(23.2322) from dual;  //(四舍五入后保留的小数位数 0 个位 -1 十位)   
    45. 36、select to_char(sal, '$99,999.9999')from emp;  //(加$符号加入千位分隔符,保留四位小数,没有的补零)   
    46. 37、select to_char(sal, 'L99,999.9999')from emp;  //(L 将货币转化为本地币种此处将显示¥人民币)  
    47. 38、select to_char(sal, 'L00,000.0000')from emp;  //(补零位数不一样,可到数据库执行查看)   
    48. 39、select to_char(hiredate, 'yyyy-MM-DD HH:MI:SS') from emp;  //(改变日期默认的显示格式)   
    49. 40、select to_char(sysdate, 'yyyy-MM-DD HH:MI:SS') from dual;  //(用12小时制显示当前的系统时间)   
    50. 41、select to_char(sysdate, 'yyyy-MM-DD HH24:MI:SS') from dual;  //(用24小时制显示当前的系统时间)   
    51. 42、select ename, hiredate from emp where hiredate > to_date('1981-2-20 12:24:45','YYYY-MM-DD HH24:MI:SS');   //(函数to-date 查询公司在所给时间以后入职的人员)   
    52. 43、select sal from emp where sal > to_number('$1,250.00''$9,999.99');   //(函数to_number()求出这种薪水里带有特殊符号的)   
    53. 44、select ename, sal*12 +  nvl(comm,0) from emp;   //(函数nvl() 求出员工的"年薪 + 提成(或奖金)问题")   
    54. 45、select max(sal) from emp;  // (函数max() 求出emp表中sal字段的最大值)   
    55. 46、select min(sal) from emp;  // (函数max() 求出emp表中sal字段的最小值)   
    56. 47、select avg(sal) from emp;  //(avg()求平均薪水);   
    57. 48、select to_char(avg(sal), '999999.99') from emp;   //(将求出来的平均薪水只保留2位小数)   
    58. 49、select round(avg(sal), 2) from emp;  //(将平均薪水四舍五入到小数点后2位)   
    59. 50、select sum(sal) from emp;  //(求出每个月要支付的总薪水)   
    60.   
    61. /////////////////////////组函数(共5个):将多个条件组合到一起最后只产生一个数据//////min() max() avg() sum() count()/////////////////////////////   
    62. 51、select count(*) from emp;  //求出表中一共有多少条记录   
    63. 52、select count(*) from emp where deptno=10;  //再要求一共有多少条记录的时候,还可以在后面跟上限定条件   
    64. 53、select count(distinct deptno) from emp;   //统计部门编号前提是去掉重复的值   
    65. ////////////////////////聚组函数group by() //////////////////////////////////////   
    66. 54、select deptno, avg(sal) from emp group by deptno;  //按照deptno分组,查看每个部门的平均工资   
    67. 55、select max(sal) from emp group by deptno, job; //分组的时候,还可以按照多个字段进行分组,两个字段不相同的为一组   
    68. 56、select ename from emp where sal = (select max(sal) from emp); //求出   
    69. 57、select deptno, max(sal) from emp group by deptno; //搜素这个部门中薪水最高的的值   
    70. //////////////////////////////////////////////////having函数对于group by函数的过滤 不能用where//////////////////////////////////////   
    71. 58、select deptno, avg(sal) from emp group by deptno having avg(sal) >2000; (order by )//求出每个部门的平均值,并且要 > 2000   
    72. 59、select avg(sal) from emp where sal >1200 group by deptno having avg(sal) >1500 order by avg(sal) desc;//求出sal>1200的平均值按照deptno分组,平均值要>1500最后按照sal的倒序排列   
    73. 60、select ename,sal from emp where sal > (select avg(sal) from emp);  //求那些人的薪水是在平均薪水之上的。   
    74. 61、select ename, sal from emp join (select max(sal) max_sal ,deptno from emp group by deptno) t on (emp.sal = t.max_sal and emp.deptno=t.deptno);  //查询每个部门中工资最高的那个人  
    75. ///////////////////////////////等值连接//////////////////////////////////////   
    76. 62、select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno;  //自连接,把一张表当成两张表来用   
    77. 63、select ename, dname from emp, dept;  //92年语法 两张表的连接 笛卡尔积。   
    78. 64、select ename, dname from emp cross join dept; //99年语法 两张表的连接用cross join   
    79. 65、select ename, dname from emp, dept where emp.deptno = dept.deptno; // 92年语法 表连接 + 条件连接   
    80. 66、select ename, dname from emp join dept on(emp.deptno = dept.deptno); // 新语法   
    81. 67、select ename,dname from emp join dept using(deptno); //与66题的写法是一样的,但是不推荐使用using : 假设条件太多   
    82. ///////////////////////////////////////非等值连接///////////////////////////////////////////   
    83. 68、select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal); //两张表的连接 此种写法比用where更清晰   
    84. 69、select ename, dname, grade from emp e   
    85.     join dept d on(e.deptno = d.deptno)   
    86.     join salgrade s on (e.sal between s.losal and s.hisal)   
    87.     where ename not like '_A%';  //三张表的连接   
    88. 70、select e1.ename, e2.ename from emp e1 join emp e2 on(e1.mgr = e2.empno); //自连接第二种写法,同62   
    89. 71、select e1.ename, e2.ename from emp e1 left join emp e2 on(e1.mgr = e2.empno); //左外连接 把左边没有满足条件的数据也取出来   
    90. 72、select ename, dname from emp e right join dept d on(e.deptno = d.deptno); //右外连接   
    91. 73、select deptno, avg_sal, grade 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);//求每个部门平均薪水的等级   
    92. 74、select ename from emp where empno in (select mgr from emp); // 在表中搜索那些人是经理   
    93. 75、select sal from emp where sal not in(select distinct e1.sal from emp e1 join emp e2 on(e1.sal < e2.sal)); // 面试题 不用组函数max()求薪水的最大值   
    94. 76、select deptno, max_sal from   
    95.     (select avg(sal) max_sal,deptno from emp group by deptno)   
    96.         where max_sal =   
    97.         (select max(max_sal) from   
    98.          (select avg(sal) max_sal,deptno from emp group by deptno)   
    99.     );//求平均薪水最高的部门名称和编号。   
    100. 77、select t1.deptno, grade, avg_sal from   
    101.       (select deptno, grade, avg_sal from   
    102.     (select deptno, avg(sal) avg_sal from emp group by deptno) t   
    103.         join salgrade s on(t.avg_sal between s.losal and s.hisal)   
    104.       ) t1   
    105.     join dept on (t1.deptno = dept.deptno)   
    106.     where t1.grade =    
    107.       (   
    108.         select min(grade) from   
    109.           (select deptno, grade, avg_sal from   
    110.     (select deptno, avg(sal) avg_sal from emp group by deptno) t   
    111.     join salgrade s on(t.avg_sal between s.losal and s.hisal)   
    112.      )   
    113.    )//求平均薪水等级最低的部门的名称 哈哈 确实比较麻烦   
    114. 78、create view v$_dept_avg_sal_info as   
    115.     select deptno, grade, avg_sal from   
    116.        (select deptno, avg(sal) avg_sal from emp group by deptno) t   
    117.     join salgrade s on(t.avg_sal between s.losal and s.hisal);   
    118.     //视图的创建,一般以v$开头,但不是固定的   
    119.   
    120.   
    121.   
    122.   
    123.   
    124. 79、select t1.deptno, grade, avg_sal from v$_dept_avg_sal_info t1   
    125.     join dept on (t1.deptno = dept.deptno)   
    126.     where t1.grade =    
    127.       (   
    128.         select min(grade) from   
    129.          v$_dept_avg_sal_info t1   
    130.      )   
    131.    )//求平均薪水等级最低的部门的名称 用视图,能简单一些,相当于Java中方法的封装   
    132.   
    133. 80、---创建视图出现权限不足时候的解决办法:   
    134.     conn sys/admin as sysdba;   
    135.         显示:连接成功 Connected   
    136.     grant create table, create view to scott;   
    137.         显示: 授权成功 Grant succeeded   
    138. 81、-------求比普通员工最高薪水还要高的经理人的名称 -------   
    139.     select ename, sal from emp where empno in   
    140.        (select distinct mgr from emp where mgr is not null)   
    141.     and sal >   
    142.     (   
    143.        select max(sal) from emp where empno not in   
    144.          (select distinct mgr from emp where mgr is not null)   
    145.     )   
    146. 82、---面试题:比较效率   
    147.        select * from emp where deptno = 10 and ename like '%A%';//好,将过滤力度大的放在前面   
    148.        select * from emp where ename like '%A% and deptno = 10;   
    149. 83、-----表的备份   
    150.        create table dept2 as select * from dept;   
    151. 84、-----插入数据   
    152.         insert into dept2 values(50,'game','beijing');   
    153.       ----只对某个字段插入数据   
    154.         insert into dept2(deptno,dname) values(60,'game2');   
    155. 85、-----将一个表中的数据完全插入另一个表中(表结构必须一样)   
    156.     insert into dept2 select * from dept;   
    157. 86、-----求前五名员工的编号和名称(使用虚字段rownum 只能使用 < 或 = 要使用 > 必须使用子查询)   
    158.     select empno,ename from emp where rownum <= 5;   
    159. 86、----求10名雇员以后的雇员名称--------   
    160.     select ename from (select rownum r,ename from emp) where r > 10;   
    161. 87、----求薪水最高的前5个人的薪水和名字---------   
    162.     select ename, sal from (select ename, sal from emp order by sal desc) where rownum <=5;    
    163. 88、----求按薪水倒序排列后的第6名到第10名的员工的名字和薪水--------   
    164.     select ename, sal from   
    165.            (select ename, sal, rownum r from   
    166.               (select ename, sal from emp order by sal desc)   
    167.            )   
    168.         where r>=6 and r<=10  
    169. 89、----------------创建新用户---------------   
    170.     1、backup scott//备份   
    171.         exp//导出   
    172.     2、create user   
    173.         create user guohailong identified(认证) by guohailong  default tablespace users quota(配额) 10M on users   
    174.         grant create session(给它登录到服务器的权限),create table, create view to guohailong   
    175.     3import data   
    176.         imp   
    177. 90、-----------事务回退语句--------   
    178.     rollback;   
    179.        
    180. 91、-----------事务确认语句--------   
    181.     commit;//此时再执行rollback无效   
    182.   
    183. 92、当正常断开连接的时候例如exit,事务自动提交。  当非正常断开连接,例如直接关闭dos窗口或关机,事务自动提交   
    184. 93、有3个表S,C,SC    
    185.     S(SNO,SNAME)代表(学号,姓名)    
    186.     C(CNO,CNAME,CTEACHER)代表(课号,课名,教师)    
    187.     SC(SNO,CNO,SCGRADE)代表(学号,课号成绩)    
    188.     问题:    
    189.     1,找出没选过“黎明”老师的所有学生姓名。    
    190.     2,列出2门以上(含2门)不及格学生姓名及平均成绩。    
    191.     3,即学过1号课程有学过2号课所有学生的姓名。   
    192.     答案:   
    193.     1、   
    194.         select sname from s join sc on(s.sno = sc.sno) join c on (sc.cno = c.cno) where cteacher <> '黎明';   
    195.     2、   
    196.         select sname where sno in (select sno from sc where scgrade < 60 group by sno having count(*) >=2);   
    197.     3、   
    198.         select sname from s where sno in (select sno, from sc where cno=1 and cno in   
    199.                             (select distinct sno from sc where cno = 2);   
    200.                          )   
    201.   
    202. 94、--------------创建表--------------   
    203.        create table stu   
    204.     (   
    205.     id number(6),   
    206.     name varchar2(20) constraint stu_name_mm not null,   
    207.     sex number(1),   
    208.     age number(3),   
    209.     sdate date,   
    210.     grade number(2default 1,   
    211.     class number(4),   
    212.     email varchar2(50) unique   
    213.     );   
    214. 95、--------------给name字段加入 非空 约束,并给约束一个名字,若不取,系统默认取一个-------------   
    215.        create table stu   
    216.     (   
    217.     id number(6),   
    218.     name varchar2(20) constraint stu_name_mm not null,   
    219.     sex number(1),   
    220.     age number(3),   
    221.     sdate date,   
    222.     grade number(2default 1,   
    223.     class number(4),   
    224.     email varchar2(50)   
    225.     );   
    226. 96、--------------给nameemail字段加入 唯一 约束 两个 null值 不为重复-------------   
    227.        create table stu   
    228.     (   
    229.     id number(6),   
    230.     name varchar2(20) constraint stu_name_mm not null,   
    231.     sex number(1),   
    232.     age number(3),   
    233.     sdate date,   
    234.     grade number(2default 1,   
    235.     class number(4),   
    236.     email varchar2(50) unique   
    237.     );   
    238. 97、--------------两个字段的组合不能重复 约束:表级约束-------------   
    239.        create table stu   
    240.     (   
    241.     id number(6),   
    242.     name varchar2(20) constraint stu_name_mm not null,   
    243.     sex number(1),   
    244.     age number(3),   
    245.     sdate date,   
    246.     grade number(2default 1,   
    247.     class number(4),   
    248.     email varchar2(50),   
    249.     constraint stu_name_email_uni unique(email, name)   
    250.     );   
    251. 98、--------------主键约束-------------   
    252.        create table stu   
    253.     (   
    254.     id number(6),   
    255.     name varchar2(20) constraint stu_name_mm not null,   
    256.     sex number(1),   
    257.     age number(3),   
    258.     sdate date,   
    259.     grade number(2default 1,   
    260.     class number(4),   
    261.     email varchar2(50),   
    262.     constraint stu_id_pk primary key (id),   
    263.     constraint stu_name_email_uni unique(email, name)   
    264.     );   
    265.  ?99、--------------外键约束   被参考字段必须是主键 -------------   
    266.        create table stu   
    267.     (   
    268.     id number(6),   
    269.     name varchar2(20) constraint stu_name_mm not null,   
    270.     sex number(1),   
    271.     age number(3),   
    272.     sdate date,   
    273.     grade number(2default 1,   
    274.     class number(4) references class(id),   
    275.     email varchar2(50),   
    276.     constraint stu_class_fk foreign key (class) references class(id),   
    277.     constraint stu_id_pk primary key (id),   
    278.     constraint stu_name_email_uni unique(email, name)   
    279.     );   
    280.        
    281.     create table class    
    282.     (   
    283.     id number(4) primary key,   
    284.     name varchar2(20) not null  
    285.     );   
    286. 100、---------------修改表结构,添加字段------------------   
    287.     alter table stu add(addr varchar2(29));   
    288. 101、---------------删除字段--------------------------   
    289.     alter table stu drop (addr);   
    290. 102、---------------修改表字段的长度------------------   
    291.     alter table  stu modify (addr varchar2(50));//更改后的长度必须要能容纳原先的数据   
    292. 103、----------------删除约束条件----------------   
    293.     alter table stu drop constraint  约束名   
    294. 104、-----------修改表结构添加约束条件---------------   
    295.     alter table  stu add constraint stu_class_fk foreign key (class) references class (id);   
    296. 105、---------------数据字典表----------------   
    297.      desc dictionary;   
    298.      //数据字典表共有两个字段 table_name comments   
    299.      //table_name主要存放数据字典表的名字   
    300.      //comments主要是对这张数据字典表的描述   
    301.         
    302. 105、---------------查看当前用户下面所有的表、视图、约束-----数据字典表user_tables---   
    303.     select table_name from user_tables;   
    304.     select view_name from user_views;   
    305.     select constraint_name from user-constraints;   
    306. 106、-------------索引------------------   
    307.     create index idx_stu_email on stu (email);// 在stu这张表的email字段上建立一个索引:idx_stu_email   
    308. 107、---------- 删除索引 ------------------   
    309.     drop index index_stu_email;   
    310. 108、---------查看所有的索引----------------   
    311.     select index_name from user_indexes;   
    312. 109、---------创建视图-------------------   
    313.     create view v$stu as selesct id,name,age from stu;   
    314.      视图的作用: 简化查询 保护我们的一些私有数据,通过视图也可以用来更新数据,但是我们一般不这么用 缺点:要对视图进行维护   
    315.   
    316. 110、-----------创建序列------------   
    317.     create sequence seq;//创建序列   
    318.     select seq.nextval from dual;// 查看seq序列的下一个值   
    319.     drop sequence seq;//删除序列   
    320. 111、------------数据库的三范式--------------   
    321.     (1)、要有主键,列不可分   
    322.     (2)、不能存在部分依赖:当有多个字段联合起来作为主键的时候,不是主键的字段不能部分依赖于主键中的某个字段   
    323.     (3)、不能存在传递依赖    
    324. ==============================================PL/SQL==========================   
    325. 112、-------------------在客户端输出helloworld-------------------------------   
    326.     set serveroutput on;//默认是off,设成on是让Oracle可以在客户端输出数据   
    327. 113、begin   
    328.     dbms_output.put_line('helloworld');   
    329.     end;   
    330.     /   
    331. 114、----------------pl/sql变量的赋值与输出----   
    332.     declare   
    333.         v_name varchar2(20);//声明变量v_name变量的声明以v_开头   
    334.     begin   
    335.         v_name := 'myname';   
    336.         dbms_output.put_line(v_name);   
    337.     end;   
    338.     /   
    339. 115、-----------pl/sql对于异常的处理(除数为0)-------------   
    340.     declare   
    341.         v_num number := 0;   
    342.     begin   
    343.         v_num := 2/v_num;   
    344.         dbms_output.put_line(v_num);   
    345.     exception   
    346.         when others then   
    347.         dbms_output.put_line('error');   
    348.     end;   
    349.     /   
    350. 116、----------变量的声明----------   
    351.     binary_integer:整数,主要用来计数而不是用来表示字段类型   比number效率高   
    352.     number:数字类型   
    353.     char:定长字符串   
    354.     varchar2:变长字符串   
    355.     date:日期   
    356.     long:字符串,最长2GB   
    357.     boolean:布尔类型,可以取值truefalsenull//最好给一初值   
    358. 117、----------变量的声明,使用 '%type'属性   
    359.     declare   
    360.         v_empno number(4);   
    361.         v_empno2 emp.empno%type;   
    362.         v_empno3 v_empno2%type;   
    363.     begin   
    364.         dbms_output.put_line('Test');   
    365.     end;   
    366.     /   
    367.     //使用%type属性,可以使变量的声明根据表字段的类型自动变换,省去了维护的麻烦,而且%type属性,可以用于变量身上   
    368. 118、---------------Table变量类型(table表示的是一个数组)-------------------   
    369.     declare   
    370.         type type_table_emp_empno is table of emp.empno%type index by binary_integer;   
    371.             v_empnos type_table type_table_empno;   
    372.     begin   
    373.         v_empnos(0) := 7345;   
    374.         v_empnos(-1) :=9999;   
    375.         dbms_output.put_line(v_empnos(-1));   
    376.     end;   
    377. 119、-----------------Record变量类型   
    378.     declare   
    379.         type type_record_dept is record   
    380.         (   
    381.             deptno dept.deptno%type,   
    382.             dname dept.dname%type,   
    383.             loc dept.loc%type   
    384.         );   
    385.     begin   
    386.         v_temp.deptno:=50;   
    387.         v_temp.dname:='aaaa';   
    388.         v_temp.loc:='bj';   
    389.         dbms_output.put_line(v temp.deptno || ' ' || v temp.dname);   
    390.     end;   
    391. 120、-----------使用 %rowtype声明record变量   
    392.     declare   
    393.         v_temp dept%rowtype;   
    394.     begin   
    395.         v_temp.deptno:=50;   
    396.         v_temp.dname:='aaaa';   
    397.         v_temp.loc:='bj';   
    398.     dbms_output.put_line(v temp.deptno || '' || v temp.dname)              
    399.     end;   
    400.        
    401. 121、--------------sql%count 统计上一条sql语句更新的记录条数    
    402. 122、--------------sql语句的运用   
    403.     declare   
    404.         v_ename emp.ename%type;   
    405.         v_sal emp.sal%type;   
    406.     begin   
    407.         select ename,sal into v_ename,v_sal from emp where empno = 7369;   
    408.         dbms_output.put_line(v_ename || '' || v_sal);   
    409.     end;   
    410.   
    411. 123、  -------- pl/sql语句的应用   
    412.     declare   
    413.         v_emp emp%rowtype;   
    414.     begin   
    415.         select * into v_emp from emp where empno=7369;   
    416.         dbms_output_line(v_emp.ename);   
    417.     end;   
    418. 124、-------------pl/sql语句的应用    
    419.     declare   
    420.         v_deptno dept.deptno%type := 50;   
    421.         v_dname dept.dname%type :='aaa';   
    422.         v_loc dept.loc%type := 'bj';   
    423.     begin   
    424.         insert into dept2 values(v_deptno,v_dname,v_loc);   
    425.     commit;   
    426.     end;   
    427. 125、-----------------ddl语言,数据定义语言   
    428.     begin   
    429.         execute immediate 'create table T (nnn varchar(30) default ''a'')';   
    430.     end;   
    431. 126、------------------if else的运用   
    432.      declare   
    433.         v_sal emp.sal%type;   
    434.      begin   
    435.         select sal into v_sal from emp where empno = 7369;   
    436.     if(v_sal < 2000) then   
    437.         dbms_output.put_line('low');   
    438.     elsif(v_sal > 2000) then   
    439.         dbms_output.put_line('middle');   
    440.     else    
    441.         dbms_output.put_line('height');   
    442.         end if;   
    443.       end;   
    444. 127、-------------------循环 =====do while  
    445.     declare   
    446.         i binary_integer := 1;   
    447.     begin   
    448.         loop   
    449.                 dbms_output.put_line(i);   
    450.                 i := i + 1;   
    451.             exit when (i>=11);   
    452.         end loop;   
    453.     end;   
    454. 128、---------------------while    
    455.     declare   
    456.         j binary_integer := 1;   
    457.     begin   
    458.         while j < 11 loop   
    459.             dbms_output.put_line(j);   
    460.         j:=j+1;   
    461.         end loop;   
    462.     end;   
    463. 129、---------------------for  
    464.     begin   
    465.         for k in 1..10 loop   
    466.             dbms_output.put_line(k);   
    467.         end loop;   
    468.         for k in reverse 1..10 loop   
    469.             dbms_output.put_line(k);   
    470.         end loop;   
    471.     end;   
    472. 130、-----------------------异常(1)   
    473.     declare   
    474.         v_temp number(4);   
    475.     begin   
    476.         select empno into v_temp from emp where empno = 10;   
    477.     exception   
    478.         when too_many_rows then   
    479.             dbms_output.put_line('太多记录了');   
    480.         when others then   
    481.             dbms_output.put_line('error');     
    482.     end;   
    483. 131、-----------------------异常(2)   
    484.     declare   
    485.         v_temp number(4);   
    486.     begin   
    487.         select empno into v_temp from emp where empno = 2222;   
    488.     exception   
    489.         when no_data_found then   
    490.             dbms_output.put_line('太多记录了');   
    491.     end;   
    492. 132、----------------------创建序列   
    493.     create sequence seq_errorlog_id start with 1 increment by 1;   
    494. 133、-----------------------错误处理(用表记录:将系统日志存到数据库便于以后查看)   
    495.   
    496.   
    497.     创建日志表:   
    498.     create table errorlog   
    499.     (   
    500.     id number primary key,   
    501.     errcode number,   
    502.     errmsg varchar2(1024),   
    503.     errdate date   
    504.     );   
    505.   
    506.   
    507.        
    508.     declare   
    509.         v_deptno dept.deptno%type := 10;   
    510.         v_errcode  number;   
    511.         v_errmsg varchar2(1024);   
    512.     begin   
    513.         delete from dept where deptno = v_deptno;   
    514.        commit;   
    515.     exception   
    516.         when others then   
    517.             rollback;   
    518.                 v_errcode := SQLCODE;   
    519.                 v_errmsg := SQLERRM;   
    520.         insert into errorlog values (seq_errorlog_id.nextval, v_errcode,v_errmsg, sysdate);   
    521.                 commit;   
    522.     end;   
    523. 133---------------------PL/SQL中的重点cursor(游标)和指针的概念差不多   
    524.     declare   
    525.         cursor c is   
    526.             select * from emp; //此处的语句不会立刻执行,而是当下面的open c的时候,才会真正执行   
    527.         v_emp c%rowtype;   
    528.     begin   
    529.         open c;   
    530.             fetch c into v_emp;   
    531.         dbms_output.put_line(v_emp.ename); //这样会只输出一条数据 134将使用循环的方法输出每一条记录   
    532.       close c;   
    533.     end;   
    534. 134----------------------使用do while  循环遍历游标中的每一个数据   
    535.     declare   
    536.         cursor c is   
    537.             select * from emp;   
    538.         v_emp c%rowtype;   
    539.     begin   
    540.         open c;    
    541.         loop   
    542.             fetch c into v_emp;   
    543.             (1) exit when (c%notfound);  //notfound是oracle中的关键字,作用是判断是否还有下一条数据   
    544.             (2) dbms_output.put_line(v_emp.ename);  //(1)(2)的顺序不能颠倒,最后一条数据,不会出错,会把最后一条数据,再次的打印一遍   
    545.        end loop;   
    546.        close c;   
    547.     end;   
    548. 135------------------------while循环,遍历游标   
    549.     declare   
    550.         cursor c is   
    551.             select * from emp;   
    552.         v_emp emp%rowtype;   
    553.     begin   
    554.         open c;   
    555.         fetch c into v_emp;   
    556.         while(c%found) loop   
    557.            dbms_output.put_line(v_emp.ename);   
    558.            fetch c into v_emp;   
    559.        end loop;   
    560.        close c;   
    561.     end;   
    562. 136--------------------------for 循环,遍历游标   
    563.     declare   
    564.         cursor c is   
    565.            select * from emp;   
    566.     begin   
    567.         for v_emp in c loop   
    568.             dbms_output.put_line(v_emp.ename);   
    569.         end loop;   
    570.     end;   
    571.   
    572. 137---------------------------带参数的游标   
    573.     declare   
    574.         cursor c(v_deptno emp.deptno%type, v_job emp.job%type)   
    575.         is   
    576.            select ename, sal from emp where deptno=v_deptno and job=v_job;   
    577.         --v_temp c%rowtype;此处不用声明变量类型   
    578.     begin   
    579.         for v_temp in c(30'click') loop   
    580.             dbms_output.put_line(v_temp.ename);   
    581.         end loop;   
    582.     end;   
    583. 138-----------------------------可更新的游标   
    584.     declare   
    585.         cursor c  //有点小错误   
    586.         is   
    587.            select * from emp2 for update;   
    588.         -v_temp c%rowtype;   
    589.     begin   
    590.        for v_temp in c loop   
    591.         if(v_temp.sal < 2000) then   
    592.             update emp2 set sal = sal * 2 where current of c;   
    593.           else if (v_temp.sal =5000) then   
    594.         delete from emp2 where current of c;   
    595.            end if;   
    596.          end loop;   
    597.          commit;   
    598.     end;   
    599. 139-----------------------------------procedure存储过程(带有名字的程序块)   
    600.     create or replace procedure p   
    601.         is--这两句除了替代declare,下面的语句全部都一样     
    602.         cursor c is   
    603.             select * from emp2 for update;   
    604.     begin   
    605.          for v_emp in c loop   
    606.         if(v_emp.deptno = 10) then   
    607.             update emp2 set sal = sal +10 where current of c;   
    608.         else if(v_emp.deptno =20) then   
    609.             update emp2 set sal =  sal + 20 where current of c;   
    610.         else  
    611.             update emp2 set sal = sal + 50 where current of c;   
    612.         end if;   
    613.         end loop;   
    614.       commit;   
    615.      end;   
    616.        
    617.     执行存储过程的两种方法:   
    618.     (1)exec p;(p是存储过程的名称)   
    619.     (2)   
    620.         begin   
    621.             p;   
    622.         end;   
    623.         /   
    624. 140-------------------------------带参数的存储过程   
    625.     create or replace procedure p   
    626.         (v_a in number, v_b number, v_ret out number, v_temp in out number)   
    627.     is   
    628.        
    629.     begin   
    630.         if(v_a > v_b) then   
    631.             v_ret := v_a;   
    632.         else  
    633.             v_ret := v_b;   
    634.         end if;   
    635.         v_temp := v_temp + 1;   
    636.     end;   
    637. 141----------------------调用140  
    638.     declare   
    639.         v_a  number := 3;   
    640.         v_b  number := 4;   
    641.         v_ret number;   
    642.         v_temp number := 5;   
    643.   
    644.     begin   
    645.         p(v_a, v_b, v_ret, v_temp);   
    646.         dbms_output.put_line(v_ret);   
    647.         dbms_output.put_line(v_temp);   
    648.     end;   
    649.   
    650. 142------------------删除存储过程   
    651.     drop procedure p;   
    652. 143------------------------创建函数计算个人所得税     
    653.     create or replace function sal_tax   
    654.         (v_sal  number)    
    655.         return number   
    656.     is   
    657.     begin   
    658.         if(v_sal < 2000) then   
    659.             return 0.10;   
    660.         elsif(v_sal <2750) then   
    661.             return 0.15;   
    662.         else  
    663.             return 0.20;   
    664.         end if;   
    665.     end;   
    666. 144-----------------------------创建触发器(trigger)  触发器不能单独的存在,必须依附在某一张表上   
    667.   
    668.     //创建触发器的依附表   
    669.        
    670.     create table emp2_log   
    671.     (   
    672.     ename varchar2(30) ,   
    673.     eaction varchar2(20),   
    674.     etime date   
    675.     );     
    676.   
    677.     create or replace trigger trig   
    678.         after insert or delete or update on emp2 ---for each row 加上此句,每更新一行,触发一次,不加入则值触发一次   
    679.     begin   
    680.         if inserting then   
    681.             insert into emp2_log values(USER, 'insert', sysdate);   
    682.         elsif updating then   
    683.             insert into emp2_log values(USER, 'update', sysdate);   
    684.         elsif deleting then   
    685.             insert into emp2_log values(USER, 'delete', sysdate);   
    686.         end if;   
    687.     end;   
    688. 145-------------------------------通过触发器更新数据   
    689.     create or replace trigger trig   
    690.         after update on dept   
    691.         for each row   
    692.     begin   
    693.         update emp set deptno =:NEW.deptno where deptno =: OLD.deptno;   
    694.     end;   
    695.        
    696.   
    697.     //////只编译不显示的解决办法 set serveroutput on;   
    698. 145-------------------------------通过创建存储过程完成递归   
    699.     create or replace procedure p(v_pid article.pid%type,v_level binary_integer) is   
    700.         cursor c is select * from article where pid = v_pid;   
    701.         v_preStr varchar2(1024) := '';   
    702.     begin   
    703.       for i in 0..v_leave loop   
    704.         v_preStr := v_preStr || '****';   
    705.       end loop;   
    706.   
    707.       for v_article in c loop   
    708.         dbms_output.put_line(v_article.cont);   
    709.         if(v_article.isleaf = 0) then   
    710.             p(v_article.id);   
    711.         end if;   
    712.         end loop;   
    713.        
    714.     end;   
    715. 146-------------------------------查看当前用户下有哪些表---   
    716.     首先,用这个用户登录然后使用语句:   
    717.     select * from tab;   
    718.        
    719. 147-----------------------------用Oracle进行分页!--------------   
    720.     因为Oracle中的隐含字段rownum不支持'>'所以:   
    721.     select * from (   
    722.         select rownum rn, t.* from (   
    723.             select * from t_user where user_id <> 'root'  
    724.         ) t where rownum <6  
    725.     ) where rn >3  
    726. 148------------------------Oracle下面的清屏命令----------------   
    727.     clear screen; 或者 cle scr;   
    728.   
    729. 149-----------将创建好的guohailong的这个用户的密码改为abc--------------   
    730.     alter user guohailong identified by abc   
    731.     当密码使用的是数字的时候可能会不行  
  • 相关阅读:
    4.12 活跃性
    4.13 ReentrantLock
    异步模式之生产者消费者
    同步模式之保护性暂停Guarded Suspension
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习
    android 学习(开课博客)
  • 原文地址:https://www.cnblogs.com/tancp/p/3900961.html
Copyright © 2020-2023  润新知