您好,欢迎访问一九零五行业门户网

oracle笔记

1、oracle默认账户、密码 sys change_on_install system manger scott tiger 2、oracle服务说明 oracleserviceorcl:数据库的服务,如果创建两个数据库就会有两个服务,orcl是数据库名。 oracleoradb10g_home1tnslistener:监听服务,jdbc和plsql远程连接服
1、oracle默认账户、密码
        sys            change_on_install
        system     manger
        scott      tiger
2、oracle服务说明
        oracleserviceorcl:数据库的服务,如果创建两个数据库就会有两个服务,orcl是数据库名。
        oracleoradb10g_home1tnslistener:监听服务,jdbc和plsql远程连接服务,端口号为:1521
        oracleoradb10g_home1isql*plus:web管理服务,例如:http://127.0.0.1:5560/isqlplus,端口号为:5560
        注意事项:如果oracleoradb10g_home1tnslistener启动出错,找到net configuration assistant重新配置监听即可。
        默认启动:oracleserviceorcl 和 oracleoradb10g_home1tnslistener 就足够了。
3、加锁、解锁用户(管理员 sys system 命令)
        加锁:alter user 用户 account lock;
        解锁:alter user 用户 account unlock;
4、登录命令、切换用户命令
        1. connect 用户/密码
        2. conn 用户/密码
    ========不想被别人看到明文密码情况下========
        3. sql> conn
                请输入用户名:  scott
                输入口令: *****
        4. sql> conn
                请输入用户名:  scott
                输入口令: *****
5、查询当前登录用户
        show user;
6、查询、设置“行宽”和“显示条数”
        查询行宽:show linesize; //默认80
        设置行宽:set linesize 120;
查询显示条数:show pagesize; //默认14
        设置显示条数:set pagesize 100;
1.字符串指定列宽:column 列名 format a号;
                例如:column ename format a10;
2.数字指定列宽:column 列名 format 9999;
                说明:一个9代表一个数字。
1 2的缩写格式:
                col 列名 for 指令;
    =====================================================================        
                        例如我添加的内容如下:
                                         -- 指定行宽
                                        set linesize 150
                                         -- 指定每页显示条数
                                        set pagesize 100
                                         -- 指定oracle默认显示时间
                                        alter session set nls_date_format='yyyy-mm-dd';
    =====================================================================
永久保存设置配置:找到oracle的安装目录,例如:d:\software\oracle\product\10.2.0\db_1\sqlplus\admin\glogin.sql 设置写到最下面即可。
//测试是否是jdbc语句
        1、jdbc语句必须需要分号,否则会换行让你继续输入。
        2、使用/来测试,如果是jdbc输入完毕,再输入/如果成功执行上句的话,证明是jdbc语句。
//查询当前用户所有表
        select * from tab;
//查看表结构
        desc 表名;
//打开查询耗时
        set timing on;
//关闭查询耗时    
        set timing off;
//sqlplus(黑窗口)清屏,sqlplusw中无效
        windows:host cls
        linux中:host clear
        plsql中:clear
//多行输错,修改命令
        edit 或者 ed ,修改完输入 / ,文件中不要有问号
//处理null值函数(vnl函数)
        nvl(字段,值)
            例如:select nvl(comm,0) from emp;
        nvl2(字段,不为空返回值,为空返回值)
            例如:select nvl2(null,2,3) //返回 3
//别名大小写
        使用别名,如果不加 默认大写。
        加了 就会按 里显示。
        as xx;  --转为:xx
        as xx; --等于:xx
        注意:当别名含有 空格、 字符串 时一定要加 号;
//取消重复行关键字:(distinct)
        select distinct 重复字段 from 表名;
        注意:如果查询多列,distinct作用于多列,多列有重复才算重复。
//拼接字符串   --查询格式:ename的工资是:sal
        select ename || '的工资是:' || sal from emp;
//拼接字符串((oncat)函数
        select concat('我叫 ','小童鞋_成er') from dual;
        拼接多个:select concat(concat('我叫 ','小童鞋_成er'),' 啊!') from dual;
//oracle的虚表,oracle查询必须指定form关键字
        select 'hello ' || 'world' from dual;
        dual是一个虚拟表:
            比如 得到当前时间:select sysdate from dual;
                 计算数值:    select 3 + 2 from dual;
//关于(like)查询特殊字符用法:
                                                        id name
                                                        -- ----------
                                                         1 dd%
                                                         2 %xx
        1、我们进行查询,select * from 表名 where 字段 like '%%'; 那么就是查询所有了。
        //定义转移字符:select * from 表名 where 字段 like '\%%' escape '\';    --把\%转义,escpae指定哪个是转义符。
        比如:select * from 表名 where 字段 like 'x%%' escape 'x'; //把x转义
2、查询第三个字母为i的:
            select * from 表名 where 字段 like '__i';
//查询~到~范围(between)
        比如查询工资1500~6000之间的。
        select * from 表名 where (工资字段 between 1500 and 6000);
//查询id为1 2 3 4的用户 (in查询)
        第一种写法:select * from 表名 where id字段 = 1 or id字段 = 2 or id字段 = 3 or id字段 = 4;
        批处理写法:select * from 表名 where id字段 in(1,2,3,4);
        注意:
                select * from 表名 where 字段 in(xx,xx,null); //没有影响
                select * from 表名 where 字段 not in(xx,xx,null); //如果not in 含有null,则不返回任何结果。
//字符串转为日期(to_date)
        to_date('2014-10-02','yyyy-mm-dd'); //年-月-日
        to_date('2014-10-02 12:00:02','yyyy-mm-dd hh24:mi:ss'); //年-月-日-时-分-秒
//日期转为指定格式(to_char)
        to_char(日期字段,'yyyy-mm-dd'); //年-月-日
        to_char(日期字段,'yyyy-mm-dd hh24:mi:ss'); //年-月-日-时-分-秒
//查询oracle指定的格式(v$nls_parameters)
        select * from v$nls_parameters; //只能查看,不能修改
//修改当前会话的格式    默认时间格式:dd-mon-yy
        alter session set nls_date_format='yyyy-mm-dd'; //只对当前会话有效
//排序 (order by)
        升序:
                select * from 表名 order by 要排序字段 asc; //asc默认也可不写,从高到底
        降序:
                select * from 表名 order by 要排序字段 desc; //降序,从低到高
null值排序始终在下面:
                select * from 表名 order by 含有null字段 desc nulls last;
        null值排序始终在上面:
                select * from 表名 order by 含有null字段  desc nulls first;
                select * from 表名 order by nvl(含有null字段,-1) asc;
        根据字段位置排序:
                select id,name from xx order by 2 desc; //2是name的位置
//分组
        分组函数:
                    max(字段); //最大值
                    min(字段); //最小值
                    avg(字段); //平均值
                    count(字段); //总条数
                    sum(字段); //总和
        分组方法(group by):
                select max(sal),deptno from emp group by deptno; //查询每个部门工资最高的人,如果group by中没有这个字段,就不能显示这个字段
        对两个字段进行排序:
                select max(sal),deptno,job from emp group by deptno,job; //根据“部门(deptno)”和“工作(job)”进行排序。
        对分组条件进行筛选(group by 字段 having 条件),同时进行排序(order by):
                select deptno,count(*) from emp group by deptno having count(*)>4 order by deptno desc;
注意:
                    group by 和 having 都不可以使用“别名”;
                    order by 可以使用“别名”;
某些情况下,优先使用where,而不使用having。
                      例子,查询“部门”,“部门人数”,取消10号部门信息:
                              效率高:select deptno,count(*) from emp where deptno 10 group by deptno;
                              效率低:select deptno,count(*) from emp group by deptno having deptno 10;
//字符函数
        lower(string) //将字段转换为“小写”;
                select lower('abc') from dual; -- 结果:abc
upper(string) //将字段转换为“大写”;
                select lower('abc') from dual; -- 结果:abc
initcap(string) //每个单词首字母转为“大写”;\
                select initcap('hello word.day') from dual; -- 结果:hello word.day
-- 首写字母为大写
          select initcap(ename) from emp;
//拼接字符串
        concat('a','b'); //跟||一样
//截取函数:
    substr(string,index,index) //要截取的字符串,从第几个开始,此位置往后截取几个  (从1下标开始)
        select substr('abc',1,2) from dual; -- 结果:ab
usbstr(string,index) //如果不指定,就从1位置,截取到字符串结束
        select substr('abc',2) from dual; -- 结果:bc
//字段长度
        length(string) //返回字段长度
            select length('abc') from dual; -- 结果:3
//查找字符串位置
        instr(string,string) //返回字符串位置下标
            select instr('abcdefg','c') from dual; -- 结果:3
//补齐函数lpad(string,indexof,char)和rpad(string,indexof,char)
        lpad:
                select lpad('abc',5,'*') from dual; -- 结果:**abc
        rpad:
                select rpad('abc',5,'*') from dual; -- 结果:abc**
//可以匿名,比如:
                select ename as 姓名,substr(ename,1,1)|| replace(rpad(' ',length(ename)-1,'*'),' ','') ||substr(ename,length(ename)) as 匿名 from emp where ename = 'scott';
                姓名      匿名
                ---------------
                scott     s***t
//去掉前后空格trim(' ' from string)
        trim(string) //去掉前后空格
        trim('a' from 'abc') //去掉a,注意:只能为前、后替换
//替换函数replace(string,string,string)
        select * from replace('abc','a','1') from dual; -- 结果:1bc
//数学函数:
        mod(number,nunber)  //求余数
        round(number) //四舍五入
        round(number,number); //截取小数点第几位,比如:12.91 结果:12 没有小数; 如果是-1,比如:12.22,-1 结果:10
trunc(number)
                                        跟round() 函数一样,只是不四舍五入
        trunc(number,number)
//操作时间
        sysdate-1 :减一天
        sysdate-1/24 :减一天1小时
        sysdate-1/24/24 :减一天1小时1分钟
last_day(date) : 获取当月最后一天
            比如:select to_char(last_day(to_date('11','mm')),'yyyy-mm-dd') from dual; //返回:2014-11-30
add_months(date,number) :当前日期减一天 或 加一天
            比如:select to_char(add_months(last_day(sysdate),-1)+1,'yyyy-mm-dd') from dual; //返回当月的1号
months_between :计算两个时间相差“月份”
            比如;select months_between(sysdate,to_date('2014-12-19','yyyy-mm-dd')) from dual; //返回-1
round(date,'xx'):///对日期四舍五入,比如:round(to_date('2014-10-10 22:00:00','yyyy-mm-dd hh24:mi:ss'),'dd') 返回:2014-10-11 00:00:00
        trunct(date,'xx'):///对日期进行截断,比如:trunc(to_date('2014-10-10 22:00:00','yyyy-mm-dd hh24:mi:ss'),'month')) 返回:2014-10-01 00:00:00
            上面两个函数指定xx:yyyy  month  dd  hh24  mi  ss
//根据“星期几”获取下个“星期几”的日期
        next_day(sysdate,'星期三');
//to_char(number,'xx') 转换数字
        to_char(sal,'l9999') : 转换为本地数字格式,9999表示显示位数
                                 $999,9999.00 :
                                 0000 :0补齐
//字符串转数字
        to_number('3');
//判断,类似switch case case
        case 字段
            when xx -- 如果是 xx值
            then xx -- 替换成 xx值
        else    --否则
            xx    --返回 xx值
        end
------------------------------------------------
case 字段
            when xx -- 如果是 xx值
            then xx -- 替换成 xx值
when xx -- 如果是 xx值
            then xx -- 替换成 xx值
else    --否则
            xx    --返回 xx值
        end
//判读,类似if else
        case
            when xx=xx
            then yes -- 是
            else no  -- 不是
        end
------------------------------------------------
//判断(oracle独有)  decode函数
        select
            decode(ename,'是scott','yes','不是scott','no','都不是')
        from emp
            where ename = upper('scott');
//集合操作
        union :取并集,比如:a集合有1 3,b集合有1 4;并集结果:1 3 4
                select * from emp where ename in('scott','clark') union select * from emp where ename in('smith','allen','scott');
union all :取合集,比如:a集合有1 3,b集合有 1 4;合集结果:1 1 3 4
                select * from emp where ename in('scott','clark') union all select * from emp where ename in('smith','allen','scott');
intersect :取交集,比如:a集合有1 3,b集合有1 4;交集结果:1
                select * from emp where ename in('scott','clark') intersect select * from emp where ename in('smith','allen','scott');
minus :取差集,比如:a集合有1 3 ,b集合有1 4;差集结果:3
                例如:select ename from emp where ename in('scott','allen') minus select ename from emp where ename in('scott','allen','smith');
                    结果:“无结果”
                例如:select ename from emp where ename in('scott','allen','smith') minus select ename from emp where ename in('scott','allen');
                    结果:smith
              总结:以“第一个”集合为中心,取两结果的相差
/*
       注意事项:
               1、如果是两个查询设计分组;
               2、order by必须在最后一个集合,group by无限制
               3、集合数量必须一样,类型必须一样,其它字段名字不同可以。
     */
//左连接、右连接
    -- 左连接:
        /*oracle专用:*/ select d.deptno as 部门编号,d.dname as 部门名称,count(e.deptno) as 总人数 from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno,d.dname order by count(e.deptno);
    /*通用:*/   select d.deptno as 部门编号,d.dname as 部门名称,count(e.deptno) as 部门总人数 from emp e left join dept d on e.deptno=d.deptno group by d.deptno,d.dname order by 部门总人数
-- 右连接:
      /*oracle专用:*/ select d.deptno as 部门编号,d.dname as 部门名称,count(e.deptno) as 总人数 from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno,d.dname order by count(e.deptno);
      /*通用:*/   select d.deptno as 部门编号,d.dname as 部门名称,count(e.deptno) as 部门总人数 from emp e right join dept d on e.deptno=d.deptno group by d.deptno,d.dname order by 部门总人数
//单表“自连接”
    /*方法1:*/  select a.ename,b.ename from emp a, emp b where a.mgr=b.empno;
    /*内链接通用:*/ select a.ename,b.ename from emp a inner join emp b on a.mgr=b.empno; //inner 可以省略不写
//满外连接
        /*mysql不能用:*/  select e.ename,e.deptno,d.dname,d.deptno from emp e full join dept d on e.deptno = d.deptno;
//返回笛卡尔集
    select e.ename,e.deptno,d.dname,d.deptno from emp e cross join dept d;
==============================================oracle分页==============================================================
//第一页
    select * from (select rownum rn,a.* from (select * from emp) a where rownum =1;
//第二页
    select * from (select rownum rn,a.* from (select * from emp) a where rownum =11;
==============================================dml操作==============================================================
//临时表创建
        全部字段:create table 新表名 as select * from 表名;
        部分字段:create table 新表名 as select 字段1,字段2,字段3 from 表名;
//制定列插入数据
        insert into 表名(字段1,字段2) select 字段1,字段2 from 表名;
//删除表结构,不经过回收站
        drop table 表名 purge;
//关闭oracle反馈提示
        set feedback off;
//delete和truncate删除的区别:
    delete table 表名:可恢复,删除速度做了优化,快。
    truncate table 表名:不可恢复,删除速度慢。
================================保存屏幕到文本=================================
spool d:\1.txt; //保存路径
select * from emp;
spool off; //关闭保存
================================保存点=========================================
savepoint 保存点名称; //建立保存点
rollback to 保存点名称; //回滚指定名称的保存点
rollback; //回滚全部
================================数据闪回=======================================
//启用表闪回
    alter table 表名 enable row movement;
//闪回到指定时间
    flashback table 表名 to timestamp to_timestamp('2014-12-03 15:04:40','yyyy-mm-dd hh24:mi:ss');
/*注意:delete可以恢复,truncate不可恢复。*/
====================|============数据类型===================|==================
                    |      数据类型     |           描述         |
                    |----------------|----------------------|
                    | varchar2(size) |    可变长字符数据。  |
                    |----------------|----------------------|
                    |      char(size)  |    定长字符数据。    |
                    |----------------|----------------------|
                    |number(si~[.xx])|   可变长数值数据。   |
                    |----------------|----------------------|
                    |        date     |            日期型数据。|
                    |----------------|----------------------|
                    |    long         |可变长字符数据,最大2g |
                    |----------------|----------------------|
                    |    clob         |   字符数据,最大4g。 |
                    |----------------|----------------------|
                    |        blob     |  二进制数据,最大4g。|
                    |----------------|----------------------|
                    |    bfile       |存储外置文件二进制,4g |
                    -----------------------------------------
================================数据库创建、约束=================================
 create table stu(
     id number
     constraint pk_stu_id //pk_stu_id 是约束的名字
     primary key, //设置主键
     name varchar2(20) check( length(name) > 2), //长度要大于2个字符
     gender char(2) check( gender in('男','女') ), //值只能为“男”或“女”
     address varchar2(30) not null, //不能为null
     birthady date default sysdate //默认当前时间
 );
-- 约束:
    1、主键约束:constraint pk_stu_id primary key //唯一,不能为null,不可重复
    2、不能为null约束:constraint notnull_stu_name not null //不能为null
    3、只能是唯一约束:constraint unique_stu_xx unique //唯一约束,例如身份证一对一
    4、数字约束:constraint check_stu_age check( age > 0 and age     5、规定约束:constraint check_stu_sex check( sex in('男','女') ) //必须是“男”或“女”
    6、外键约束:constraint fk_stu_deptno references 外键表(外键表字段) //外键约束
//查看约束字典
    select * from user_constraints;
//查询指定表约束
    select * from user_constraints where table_name='表名';
===========================表字段操作=============================
//增加列
    alter table 表名 add(列名 xx);
//修改列
    alter table 表名 modify(age number check(age>2));
//修改列名
    alter table 表名 rename column 旧列名 to 新列名;
//删除列
    alter table 表名 drop column 列名;
//给表修改名字
    rename 旧表名 to 新表名;
//给列字段添加备注
    comment on column 表名.列名 is '这是备注信息';
    /*mysql*/
        alter table emp modify 表名 列类型 comment '这是备注信息';
//给表增加注释
    comment on table 表名 is '这是给表增加注释';
===========================视图=============================
//赋予创建视图的权限
    grant create view to 用户名;
//查询view
    select * from tab where tabtype='view';
/**
    * 视图的作用
**/
    1、屏蔽掉dml(增、删、改)操作,利用别名。
    2、视图不可以提高查询性能。
    3、简化复杂的查询。
    4、限制数据的访问。
//创建视图语法,默认如果不指定 就可以对视图进行dml操作的
    create view 视图名称
        as
            查询sql
    ;
//创建只读视图
    create view 视图名称
        as
            查询sql
        with read only
    ;
=========================================================================================
注意:mysql、sql server都不支持with read only,使用下列可以达到效果
create view my_view
        as
            select empno,ename,deptno from emp where deptno = 10
      union
            select 0,'0',0 from emp where 1=0
    ;
=========================================================================================
//替换现有视图
    create or replace view 旧视图名称
        as
            ....
    ;
//只允许选择条件插入视图
    create view 视图名称
        as
            select empno,ename,sal,deptno from emp where deptno = 10
        with check option -- 只能插入 deptno=10 的
    ;
    /*
        where deptno in(10,20)
        with check option  -- 只能插入 10 和 20 的数据
    */
===========================序列=============================
//创建一个序列
    create sequence 序列名;
//修改一个完整序列
    alter sequence myxl
      increment by 1 //每次递增数(可不写)
      minvalue 1 //最小值为1(可不写)
      start with 2 //值从哪个数开始(可不写)
      maxvalue 10 //最大值(可不写)
      //nomaxvalue 没有最大值
      nocache //不使用缓存,(可不写,默认大小20)
      nocycle; //不循环(可不写),循环是cycle
//查询当前序列值
    select 序列名.currval from dual;
//增加一个序列值
        select 序列名.nextval from dual;
注意:如果首次创建序列没有调用,查询当前序列值 会报:ora-08002: 序列 myxl.currval 尚未在此会话中定义
//删除序列
    drop sequence 序列名;
//查询当前用户有哪些序列
    select * from user_sequences;
===========================索引=============================    
//创建索引
    create index 序列名 on 表名(字段名);
//查看当前用户有哪些序列    
    select * from user_indexes;
//删除序列
    drop index 序列名;
/*
    like 查询不会用到索引
*/
===========================同义词=============================
/*
    从字面上理解就是别名的意思,和视图的功能类似。就是一种映射关系。
*/
//创建同义词
    create synonym 同义词名 for 表名;
//删除同义词
    drop synonym 同义词名;
//查看当前用户有哪些同义词
    select * from user_synonyms;
/* 知识扩展:数据库对象
     表、视图、序列、过程、函数、程序包,甚至其它同义词都可以创建同义词。
*/
============================存储程序(控制台)=====================================
//显示存储过程脚本输出     
    set serveroutput on;
------------------------------------------------------------------------------
//存储过程实例                                                                                                                            
    declare
        -- 变量
         //定义一个变量
                 变量名 number(3);
         //定义一个变量,并赋默认值
                 变量名 varchar2(20):= null;
         //定义一个,使用“表.列”类型
                 变量名 表名.列名%type;
         //定义一个容器,相当于list,使用表全部字段
                 变量名 表名%rowtype;
    begin
        -- sql语句
            //赋值一个变量
                select ename into 变量名 from emp where empno=7839;
            //赋值两个或多个变量
                select ename,sal into 变量名,变量名 from emp where empno=7839;
            //赋值容器,表全部字段
                select * into 变量名 from emp where empno=7839;
//输出语句
                dbms_output.put_line(变量名 || '值为:' || 变量名);
    end;
------------------------------------------------------------------------------
//友好提示输入窗口(命令)
    accept &提示输入的名字 prompt '请输入员工编码:'; //就是 &empno
    select ename into 变量名 from emp where empno=&empno;
//判断============================================================
    -- 方式一-- --
        /*
            if 条件
                then 语句;
            end if;
        */
-- -- 方式二 -- --
        /*
            if 条件
                then 语句;
            else
                语句;
            end if;
        */
-- -- 方式三 -- --
        /*
            if 条件
                then 语句;
            elsif
                then 语句;
            else
                语句;
            end if;
        */
//判断示例
    set serveroutput on; //显示存储过程脚本输出
    accept vsex prompt '请输入您的性别:'; //友好提示输入窗口(命令)
    declare
        vsex char(2); //定义变量,存储性别
        vstr varchar2(20);    //定义变量,打印字符串
      begin
        vsex := '&vsex'; //使用输入窗口命令赋值
        if vsex = '男'
          then vstr:='先生,欢迎您!'; //如果是男就把vstr字符串赋值为:先生,欢迎您!
        elsif vsex = '女'
          then vstr:='女士,欢迎您!'; //...或者
        else
          vstr:='对不起,请登录你的性别!'; //...否则
        end if; //关闭判断
        dbms_output.put_line(vstr); //打印内容
    end;
//循环============================================================
/*
        for 循环
    */
    set serveroutput on;
    declare
    begin
      for i in 1..5
        loop
          dbms_output.put_line(i);
        end loop;
    end;
/*
        loop 循环
    */
    set serveroutput on;
    declare
        vnum number(2):=1;
      begin
        loop //定义loop
          exit when vnum > 10; //当满足这个添加退出循环
            dbms_output.put_line(vnum);
            vnum := vnum + 1;
          end loop; //结束loop
    end;
/*
        while 循环
    */
    set serveroutput on;
    declare
      vnum number(2):=1;
      begin
        while vnum         loop
          dbms_output.put_line(vnum);
          vnum:=vnum+1;
        end loop;
    end;
============================光标(游标)=====================================
//小例子
set serveroutput on;
declare
  -- 1、定义光标(所有员工的集合)
  cursor c_emp is select ename,job from emp;
  -- 7、定义变量,存放ename 和 job
  vename emp.ename%type;
  vjob emp.job%type;
begin
  -- 2、打开光标
  open c_emp;
  -- 4、循环集合(光标)
  loop
    -- 6、获取数据
    fetch c_emp into vename,vjob;
    -- 8、判断集合循环(光标)完退出循环
    exit when c_emp%notfound;
    //最后输出
    //dbms_output.put_line(vename||'的工作是:'||vjob);
    /*  -- 修改语法
        if vename = 'scott'
      then
        update emp set ename='修改后的名字' where ename=vename;
        commit;
        end if;  
    */
  -- 5、关闭循环
  end loop;
  -- 3、关闭光标
  close c_emp;
end;
异常类型:
    zero_divide:        除数为0异常。
    no_data_found:    未找到数据异常。
//预定义除数为0异常
    set serveroutput on;
    declare
      vnum number(1):=2;
    begin
      vnum := vnum/0;
      raise zero_divide; -- oracle 预定义异常:除数为0异常
      dbms_output.put_line('发生异常不走这里!');
      exception
        -- 发生异常处理
        when zero_divide then dbms_output.put_line('自定义除0异常!');
    end;
/*自定义异常*/
    set serveroutput on;
    declare
      vnum number(1):=1;
      my_exception exception;
    begin
      if vnum is null
        then dbms_output.put_line('空啦!');
      elsif vnum is not null
        -- then dbms_output.put_line('不为空啦!');
        then
          raise my_exception; -- 抛出异常
      end if;
      exception
        when my_exception then dbms_output.put_line('发生异常啦,兄弟!');
    end;
//返回其他异常
        exception
            when others
          then  xxxx;
============================存储过程=====================================
//创建存储过程过程
    create procedure 存储过程名字
    as
        //变量
      vnum number:=3;
  begin
      dbms_output.put_line(vnum);
  end;
//修改为 create or replace procedure 存储过程名字
//带参数的存储过程    注意:如果传入的是varchar2类型,这样:vename varchar2 不能 varchar2(10)
    create or replace
        -- 员工序号,涨多少工资
        procedure addsal(vempno in number,vmoney in number)
    as
      vename emp.ename%type;
      vsal emp.sal%type;
    begin
      update stu set sal=sal+vmoney where empno = vempno;
      commit;
      select ename,sal into vename,vsal from stu where empno=vempno;
      dbms_output.put_line('姓名:' || vename || ' 涨了 ' || vmoney || ' 工资!');
      dbms_output.put_line('月工资为:' || vsal);
    end;
/*
      执行方式一、
          set serveroutput on;
          execute 存储过程名字();
  */
/*
      执行方式二、
          set serveroutput on;
          begin
              存储过程名字();
        end;
        /
  */
//查看用户存储过程
    select * from user_procedures;
//删除存储过程
    drop procedure 存储过程名字;
============================存储函数(带有返回值)=====================================
//创建存储函数
    create or replace function my_function(vempno number)
        return varchar2 //存储函数返回值类型
    as
      vename stu.ename%type;
    begin
    select ename into vename from stu where empno=vempno;
    return vename; //返回
    end;
/*执行存储函数*/
            select my_function(参数) from dual; //也可用于插入字段
//查看用户存储函数
    select * from user_procedures;
//删除存储函数
drop function 存储函数名称;
//结论:
         什么时候用存储过程、什么时候用存储函数?
             答:一般返回值有一个,用“存储函数”;多个就用“存储过程”!
//存储过程跟存储函数,都可以使用out输出变量
    create or replace
    -- out 输出变量:会生成注释输入,取消掉注释,测试输出
    function my_function(vempno number,vsal out number, vcomm out varchar2)
    return varchar2
    as
        -- 输出不了,没有指定out
         vename stu.ename%type;
    begin
        select ename,sal,comm into vename,vsal,vcomm from stu where empno=vempno;
        -- 只能手动打印
        dbms_output.put_line(vename);
        return null;
    end;
//存储过程使用out参数
    create or replace
    procedure my_procedure(name in varchar2,vename out varchar2)
    as
     vsal stu.sal%type;
    begin
      select ename,sal into vename,vsal from stu where ename=name;
    end;
============================oracle回收站(oracle 10g之后特性) 普通用户,管理员没有回收站(慎重删除)=====================================
//查看回收站
    select * from user_recyclebin;
//从回收站中撤回删除的表
    flashback table 表名 to before drop; //表名是original_name字段
//从回收站撤回删除表时重命名
    flashback table 表名 to before drop rename to 新表名;
//根据回收站名字闪回表
    flashback table bin$xx文字 to before drop;
//清空回收站指定表
    purge table 回收站表名; //也就是original_name
//清空回收站
    purge recyclebin;
==========================(for update 和 for update wait)区别============================
/**
*  for update 操作没有提交时,如有另一线程操作,会进行等待...
*  for update nowait 操作没有提交时,另一线程操作时,会弹出:ora-00054: 资源正忙, 但指定以 nowait 方式获取资源
**/
==========================jdbc调用“存储过程”和“存储函数”============================
//jdbc调用存储函数
    create or replace
        procedure my_procedure(p_empno in number,r_ename out varchar2,r_sal out number)
    as
    begin
      select ename,sal into r_ename,r_sal from emp where empno=p_empno;
    end;
------------------------------------------------------------------------------------------------
其它类似信息

推荐信息