Note_52 Oracle 基础入门

一、Oracle简介
1.概述
    * ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。
    
2.Oracle体系结构
    ① 数据库
        指数据库的物理存储,oracle看作一个超大数据库。
    ② 实例
        一个实例有一系列的进程,数据库中可以有多个实例,但一般只运行一个。
    ③ 用户
        mysql中说xx数据库中有n张表,oracle中说xx用户下有n张表
    ④ 表空间
        是一个逻辑映射,一个数据文件只能属于一个表空间
    ⑤ 数据文件
        存储在表空间的物理存储单位,是 ora 或 dbf 文件

Note_52 Oracle 基础入门_第1张图片
        
二、数据库操作
1.创建表空间
    CREATE TABLESPACE "FIRSTDEMO"
    DATAFILE  'C:/oracle/firstdemo' 
    SIZE 100M 
    AUTOEXTEND ON 
    NEXT 10M
    
2.创建用户
    CREATE USER "scott" 
    IDENTIFIED BY "tiger" 
    DEFAULT TABLESPACE "EXAMPLE"
    
    # 授权
        GRANT dba TO "scott"    --- 开发人员一般为 resource
        
3.建表
    CREATE TABLE FIRST (
      ID NUMBER(6,2) ,
      NAME VARCHAR2(10)
    )
    
    # oralce 的数据类型
        - number
            number(n):一个长度为n的整数
            number(n,m):整数部分为  n - m, 小数部分为 m
        - varchar、varchar2
            字符串,varchar2长度可变
        - date
            日期类型
        - clob
            大文本数据类型,4G
        - blob
            二进制数据,4G
            
4.CRUD
    insert
    delete
    update
    select

5.序列
    - oracle 无法想 MySQL 一样字节实现自增,需要使用序列
    
    - create sequence s_xxxx;   -- 一般前缀为 s_ 或者 seq_
        * currval  : 获取当前值
        * nextval : 获取下一个值
    
    - 自增
        * insert into emp values(s_emp.nextval,'name','money');
        
    - 虚拟表
        * oracle 中一些方法不写 from dual 将会报错,故引入虚拟表 dual
            如: select s_xxx.currval from dual;
            
# 补充 
    - 获取系统时间
        * select sysdate from dual;
    
三、单行函数
1.字符函数
    ① 转小写
        lower('XXX')
    ② 转大写
        upper('xxx')
        
2.数值函数
    - round
        round(xxx.xxx) : 四舍五入,取整
        round(xxx.xxx,n) : 四舍五入,取指定位数
        
3.转换函数
    - to_char() : 转为字符  to_char(date,'yyyy-MM-dd HH:mm:ss') 指定格式将日期转换为字符串
    - to_da'te(): 转为日期
    
4.通用函数
    - nvl(m,n) 当 m 为 null 时,m 取 n
    
    - 判断    
        select ename,
        case
            when i = 'Y' then '及格'
            case
                '不及格'
        end
        from emp;
        
    //Oracle特有
        select ename,
        decode( i,
            'Y'  '及格',
            '不及格'
        ) from emp
        
    
    - 多行函数 --- 聚合函数
    
5.分页函数
    select b.* from (
        select rownum rn,a.* from (
            select * from emp order by sal desc
        ) a
        where rownum < 10
    ) b where rn > 5
    
    # select 查询后产生 roenum;且不能跳,所以 rownum 只支持小于不支持大于(使用别名)

四、视图
1.概述
    * 视图封装了一组复杂的查询语句。
    
2.创建
    create [or replace] view viewdemo
    as
    select * from emp where sal > 1000
    with read only
    
    # 视图可以进行修改,其实质时修改原始数据,一般设置为只读(with read only)
    

五、索引
## 就是在表的列上构建一个二叉树,提高查找效率但是会降低增删改效率。
1.单列索引    
    - create index index_ename on emp(ename)
    - 单列索引触发条件为,必须是索引列中的原始值  
        * 如: select * from emp where ename = 'SCOTT';

2.复合索引
    - create index index_ename_deptno on emp(ename,deptno)
    - 符合索引第一列为优先检索条件,要想触发复合索引必须包含符合索引原始值
        * 如:select * from emp where ename = 'SCOTT';  -- 触发单列索引
              select * from emp where ename = 'SCOTT' and job = ''abc;  -- 触发复合索引
              select * from emp where ename = 'SCOTT' or job = 'abc';  -- 不触发索引

    
六、PL/SQL
1.语法
    declare
        //声明
    begin
        //执行
    end;
    
    # 例如
        declare
            i number(3) := 10;
        begin
            dbms_output.put_line(i);
        end;
        
2.常量与变量
    ① 常量定义
        name varchar2(3) := '张无忌';
        id number(3) := 11;
    ② 变量定义
        name varchar2(3);
        id number(3);
    ③ 引用变量
        name emp.ename%type;  // name 的类型与 emp 表的 ename 字段类型一致
    ④ 记录型变量
        erow emp%rowtype;    //emp 表的一行数据
        
3.if
    # 示例【从控制台输入分数,打印等级】
        declare
            i number(3) := &i;
        begin
            if i > 85 then '及格';
            elsif i > 60 then '优秀';
            else
                '不及格';
            end if;
        end;
        
4.循环
    # 示例【第一种】
        declare
            i number(3) := 1;
        begin
            while i <= 10 loop
                dbms_output.put_line(i);
                i := i + 1;
            end loop;
        end;
    
    # 示例【第二种】
        declare
            i number(3) := 1;
        begin
            loop
                exit when i > 10;
                    dbms_output.put_line(i);
                    i := i + 1;
            end loop;
        end;
    
    # 示例【第三种】
        declare
            i number(3) := 1;
        begin
            for i in 1 .. 10 loop
                dbms_output.put_line(i);
            end loop;
        end;
        
5.游标
    * 游标类似于集合,用于存储返回的多条数据
    * 示例
        declare
            cursor c1 is
                select * from emp;
            c_emp emp%rowtype;
        begin
            open c1;        //打开游标
                loop
                    fetch c1 into c_emp;     //取出一行数据
                    exit when c1%notfound;    //游标结束条件
                    dbms_output.put_line(c_emp.ename || ' 工资 ' || c_emp.sal);
                end loop;
            close c1;        //关闭游标
        end;
        
七、存储过程与存储函数
1.存储过程
    ## 将一组完成特定功能的SQL语句集。经过编译后存储到数据库中。
    //创建一个打印 Hello World 的存储过程
    create or replace procedure p1 is
        string varchar2(20) := 'Hello World';
    begin
        dbms_output.put_line(string);
    end;    
    
    //有参数的存储过程
    create or replace procedure p1(str1 varchar2) is
        str2 varchar2(20) := '传入的数据为';
    begin
        dbms_output.put_line(str2 || str1);
    end;
    
    //有返回的存储过程
    create or replace procedure p1(str1 varchar2,s out varchar2) is
        str2 varchar2(20) := '传入的数据为';
    begin
        s := str1 || str2;
    end;

2.存储函数    
    //创建一个存储函数
    create or replace function fun1(str varchar2) 
    return varchar2 
    as  // is 也可以
            s varchar2(20) := 'Hello';
    begin
        dbms_output.put_line(s);
        return str;
    end;
    
3.存储过程与存储函数的区别
    - 存储函数有一个返回值而存储过程没有返回值
    - 二者都可以通过 out 指定多个输出参数
    
八、触发器
1.语法
    //语句级触发器 不论这条语句影响多少行,在触发后执行一次
    //执行 emp 表 插入操作时触发
    create tirgger first 
    before     // 执行时机 before 之前   after 之后
    insert on     //触发的操作
    emp            //哪张表
    declare

    begin
      dbms_output.put_line('将要执行插入操作');
    end;
    
    //行级触发器  语句作用的每一条记录都会被触发,使用 old 和 new 伪记录变量
    //更新 emp 表 sal 字段时触发
    create or replace trigger tt 
    before update of sal on emp
    for each row
    begin
        if :old.sal > :new.sal then        -- 涨薪前 大于 涨薪后
            raise_application_error(-20002,'涨薪幅度不能为负');
        end if;
    end;
    
2.伪记录变量
    :old   --->  代表旧数据
    :new   --->  代表新数据

Note_52 Oracle 基础入门_第2张图片
    
九、java 使用 oracle
1.普通操作
    //注册驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //获取 connection
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl", "scott", "tiger");
    //定义 sql
    String sql = "select * from emp where empno = ?";
    //预编译sql
    PreparedStatement preparedStatement = connection.prepareStatement(sql);
    //赋值
    preparedStatement.setObject(1,7788);
    //执行sql
    ResultSet resultSet = preparedStatement.executeQuery();

2.使用存储过程
    //注册驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //获取 connection
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl", "scott", "tiger");
    //定义 sql
    String sql = "{call p1(?,?)}";
    //编译
    CallableStatement callableStatement = connection.prepareCall(sql);
    //赋值,
    callableStatement.setObject(1,7788);
    //输出参数 out
    callableStatement.registerOutParameter(2, OracleTypes.NUMBER);
    //执行
    callableStatement.execute();
    //获取输出参数的值
    callableStatement.getInt(2);
    
3.使用存储方法
    //注册驱动
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //获取 connection
    Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/orcl", "scott", "tiger");
    //定义 sql
    String sql = ""{? = call f1(?)}"";
    //编译
    CallableStatement callableStatement = connection.prepareCall(sql);
    //输出参数 out
    callableStatement.registerOutParameter(1, OracleTypes.NUMBER);
    //赋值,
    callableStatement.setObject(2,7788);
    //执行
    callableStatement.execute();
    //获取输出参数的值
    callableStatement.getInt(1);
    
4.jar包坐标
    
        
            com.oracle
            ojdbc14
            10.2.0.4.0
        

   

    

你可能感兴趣的:(Java,EE)