Oracle快速入门

Oracle安装介质:
    OracleInstanceClient
    VirtualBox虚拟机/再安装扩展插件(才能使虚拟机和主机共享文件)
        xxx.vdi文件.导入到VirtualBox虚拟机.
            取消虚拟机使用硬件加速(这个功能必须在主机的BIOS)里面进行设置).
            设置网络连接类型.
            关闭虚拟机防火墙(主机和虚拟机之间通信).
            创建共享文件夹.
            网络映射驱动器设置共享文件夹.
            安装Oracle数据库软件.
        设置虚拟机的内存一般是主机内存的1/4.
    Oracle11g数据库软件

客户端连接Oracle数据库:
例如:sqlplus scott/tiger@127.0.0.1:1521/orcl

Oracle Database 客户机
    SQLDevloper Java开发可以在任何平台上使用.
    PLSQLDevloper只能在window系统使用.

一个Oracle服务器:
    是一个数据库管理系统(RDBMS).它提供开放的,全面的,近乎完整的信息管理.
    是由一个Oracle数据库和多个实例组成.

Oracle存放数据库目录:
oradata
    orcl
        *.ctl控制文件,记录数据库的结构
        *.dbf数据文件,存放数据.
        *.log日志文件.

多个实例访问一个数据库,这就是Oracle数据库集群.
    内存A(实例) |----------
                |
    内存B(实例) |----------            [Oracle数据库:Orcl,物理概念]
                |
    内存C(实例) |----------

项目集群:
    TomcatA |            
            |            
    TomcatB    |(prj.war)    (MYSQL数据库)
            |
    TomcatC |
只要有tomcat可以访问MYSQL数据库.项目就可以正常运行.

集群(cluster)的优点:
    1.Load Balance 负载均衡:减轻服务器压力.
    2.Fail Over 失败迁移:提高系统的可靠性.

Oracle集群的专有名词,RAC : Real Application Cluster

Oracle内存中的实例如何操作硬盘上的数据库文件?
通过操作系统进程:
    读
    写
                        内存/实例
                        (PGA : Program Global Area)        ---|                                                             -|
Oracle客户端 ------|     (PGA)                            ---| --- (SGA : System Global Area) - (通过操作系统进程:读、写) -| (Oracle数据库:orcl)
                        (PGA)                            ---|                                                             -|

Oracle命令:

-- 清理屏幕数据
HOST CLS;

-- 查看当前用户
SHOW USER;

-- 查看当前用户下的表
SELECT * FROM TAB;

-- 查看表结构
DESC/DESCRIBE 表名;

查看行宽:SHOW LINESIZE;
设置行宽:SET LINESIZE 值;

-- 设置列宽:
COL/COLUMN 列名称 FOR/FORMAT a1(代表一个字符宽度)/9(代表一个数字宽度);

*** Oracle执行时间开关(默认关闭):SET TIMING ON|OFF(开启|关闭);

*** 别名 AS,给表起别名不能使用AS.
    WHERE、HAVING后面的条件不能使用别名.

*** 查询一个值是否是空值:
SELECT * FROM ... WHERE comm IS [NOT] NULL;

*** Oracle中的滤空函数:
    1.NVL(a,b):
        当a的值为空的时候,返回b值,否则返回a值
    2.NVL2(a,b,c):
        表示当a为NULL的时候,返回c,否则返回b.

*** Oracle录屏命令:
    开始:SPOOL txt文件路径;
    结束:SPOOL OFF;
        
*** / 表示执行上一条SQL语句.

*** 修改错误SQL语句:
    1.使用CHANGE/C命令
    2.使用ED/EDIT命令

*** 在上一条SQL语句追加SQL语句:
    使用A/APPEND命令:(至少要有两个空格)
    
*** SQL优化原则:
    1.尽量使用列名代表*
    2.Oracle判断WHERE条件的顺序:从右往左。
    3.尽量使用WHERE代替HAVING.
    4.理论上多表查询的效率优于子查询.
    5.尽量不要使用集合运算.

*** SQL中的空值:
    1.包含空值NULL的表达式结果都为NULL
    2.NULL 永远不等于 NULL
    3.查询的字段有空值,不可以使用NOT IN来查询.
    4.NULL空值的排序,空值最大.在此排序后加上 NULLS LAST 以控制排序效果
    5.分组函数在计算时会自动过滤掉空值.
        解决:可以通过滤空函数来处理.
    
*** 伪表:DUAL
    是Oracle管理员提供的伪表,存在仅仅是为了满足语法的要求.

*** 伪列:
        LEVEL : 在层次查询中代表查询的深度.
        ROWNUM : 行号,永远按照默认的顺序生成.
                行号只能使用 < <= 符号不能只用 > >= 符号.
                对于 = 等号只能使用 ROWNUM=1.
                因为Oracle是行式数据库,只能每行读取.
        ROWID:行地址,相当于一个指针,它表示指向到数据文件的位置.(*.dbf数据文件)
        
*** 临时表:
        手动创建:CREATE GLOBAL TEMPORARY TABLE 表名(...);
        ORDER BY 在排序的时候回自动创建.
        临时表特点:
            临时表当事务或会话结束的时候,表中的数据会自动删除.
    
*** SQL字符串连接:
    1.连接函数:CONCAT('hello','world')
        MYSQL:SELECT CONCAT('hello','world');
        ORACLE:SELECT CONCAT('hello','world') FROM DUAL;
    2.连接符: || 

*** 行转列函数:WM_CONCAT(...) 属于分组函数.

*** WHERE 子句中不能使用别名.

*** Oracle中去掉碎片:
    1.ALTER TABLE 表名 MOVE;
    2.先导出、再导入碎片就会被移除.

*** Oracle执行SQL脚本:
    @SQL脚本路径

*** Oracle开启关闭操作数据的回显信息:
    SET FEEDBACK ON(开,默认)|OFF(关);
    
Oracle查询语句:
SELECT [ALL/DISTINCT] * FROM ...
    [ALL/DISTINCT]作用于所有列

*** 查询字符串类型大小写敏感.
*** 查询日期类型格式敏感.
    Oracle数据库默认的日期格式:DD-MON-RR(日-月-年)
    可以进行修改
*** Oracle查询日期格式:
    SELECT * FROM V$NLS_PARAMETERS;
*** Oracle修改日期格式:
    ALTER SESSION/SYSTEM SET NLS_DATE_FORMAT = 'yyyy-mm-dd';

*** 日期类型和日期类型之间只能进行减法运算.

*** Oracle连接数据库的三种认证方式:
密码认证.
    sqlplus 用户名/密码@ip:端口号/数据库名
    sqlplus 用户名/密码 as sysdba
主机认证.
    sqlplus / as sysdba|system
全局认证.
    
比较运算符:
>大于 、 >=大于等于 、 <小于 、 <=小于等于 、!=(<>)不等于
BETWEEN ... AND ...
[NOT] IN
LIKE 'pattern(%_)' *** 模糊查询包含下划线的字符就需要转义:'\_'
IS [NOT] NULL

逻辑运算符:
AND 并且
OR 或
NOT 非

Oracle排序:ORDER BY子句:
ORDER BY 排序字段(列名、表达式、别名、序号(列的索引,从1开始)) ASC(升序,默认)|DESC(降序)

Oracle函数:
    函数必须有返回值,但是可以没有参数.
单行函数:
    1.字符函数:
        LOWER 转小写
        UPPER 转大写
        INITCAP 首字母大写 
        
        CONCAT 连接函数 CONCAT(a,b)
        SUBSTR 截取函数    SUBSTR(a,b,c);
            表示从a中的b位置开始截取,取c位.
        LENGTH(单位:字符)/LENGTHHN(单位:字节) 获取字符串大小
        INSTR 查询函数,INSTR(a,b) 表示在a中查找b.
        LPAD(左填充)/RPAD(右填充)
            LPAD('abcd',10,'*') 、RPAD('abcd',10,'*')
        TRIM 去除两端字符 TRIM(a FROM b)表示从b的两端去除包含a的字符串.
        REPLACE 替换函数 REPLACE(a,b,c) 表示在a中出现的b字符使用c替换.
    2.数字函数:
        ROUND 四舍五入 ROUND(a,b)表示对数值a保留多少位小数.
        TRUNC 截断
        MOD 求余 MOD(a,b) 表示a对b求余.
    3.日期函数:
        TO_CHAR : TO_CHAR(a,b) 表示将a值按照b格式化为一个字符串.
            例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
        MONTHS_BETWEEN 两个日期类型相差的月数.
        ADD_MONTHS 向指定的日期中加上若干个月数.
        NEXT_DAY 指定日期的下一个日期.
            例如:SELECT NEXT_DAY(SYSDATE,'星期五') FROM DUAL;
            NEXT_DAY的应用:每个星期一自动备份数据.
        LAST_DAY 本月的最后一天.
        ROUND    日期四舍五入.
            ROUND(SYSDATE,'YEAR') , ROUND(SYSDATE,'MONTH')
        TRUNC    日期截断.
            TRUNC(SYSDATE,'YEAR') , TRUNC(SYSDATE,'MONTH')
    4.转换函数:
        隐式转换:Oracle系统自动完成.
            源数据类型        -->        目标数据类型
            VARCHAR2或CHAR            NUMBER或DATE
            NUMBER或DATE            VARCHAR2
        显示转换:
                        TO_CHAR->                    <-TO_CHAR
            NUMBER        ---            CHARACTER        ---            DATE
                        <-TO_NUMBER                    TO_DATE->
        
        TO_CHAR : TO_CHAR(a,b) 表示将a值按照b格式化为一个字符串.
            例如:SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss') FROM DUAL;
            
        日期格式的元素:字符串和日期之间的转换。
            YYYY
            YEAR
            MM
            MONTH
            DY
            DAY
            DD
            hh24
            mi
            ss
        数字格式的元素:字符串和数值之间的转换。
            9 数字
            0 零
            $ 美元福
            L 本地货币符号
            . 小数点
            , 千位符
    5.通用函数:适用于任何数据类型,也适用于空值.
        NVL(a,b) 表示当a为NULL的时候,返回b,否则返回a.
        NVL2(a,b,c) 表示当a为NULL的时候,返回c,否则返回b.
        NULLIF(a,b) 表示当a等于b的时候返回NULL,否则返回a.
        COALESCE(a,b,...,n) 表示从左往右返回第一个不为空的值.
    6.条件表达式:很实用.
        CASE 表达式:属于SQL99语法.
            CASE express 
                WHEN 值1 THEN 处理1
                WHEN 值2 THEN 处理2
                ...
                ELSE 默认处理
            END
        DECODE 函数:Oracle自己的语法.
            DECODE(express,值1,处理1,...,值n,处理n,默认处理);
多行函数:分组函数
    AVG 求平均值
    COUNT 计数
    MAX 取最大值
    MIN 取最小值
    SUM 求和函数

GROUP BY 子句:

求部门的平均工资大于2000的部门?
SELECT DEPTNO,AVG(NVL(SAL,0)) AS "平均工资" 
FROM EMP
GROUP BY DEPTNO
HAVING AVG(NVL(SAL,0)) > 2000
ORDER BY "平均工资" DESC;

WHERE和HAVING的区别?
    1.WHERE后面不能有分组函数.HAVING可以.
    2.WHERE在查询数据进入内存之前过滤数据.
    3.HAVING在查询数据进入内存之后过滤数据.
 
向上汇报:ROLL UP . GROUP BY语句的增强.
...GROUP BY ROLLUP(express1,express2,...)

*** BREAK ON DEPTNO SKIP 2 格式修饰.
    BREAK ON NULL 取消格式修饰.

问题:
--------------------------------
    DEPTNO JOB         工资总和
---------- --------- ----------
        10 CLERK           1300
           MANAGER         2450
           PRESIDENT       5000
                           8750


        20 CLERK           1900
           ANALYST         6000
           MANAGER         2975
                          10875

                          
        30 CLERK            950
           MANAGER         2850
           SALESMAN        5600
                           9400


                          29025
-------------------------------------------------
实现上面效果:
BREAK ON DEPTNO SKIP 2;
SELECT DEPTNO,JOB,SUM(SAL) AS "工资总和" 
FROM EMP
GROUP BY ROLLUP(DEPTNO,JOB);
BREAK ON NULL;

多表查询:
    笛卡尔集:是多表查询的基础.
    多表查询的连接条件可以避免全部的笛卡尔集.

连接的类型:
Oracle连接类型                SQL99连接类型
等值连接                    CROSS JOINS
不等值连接                    NATURAL JOINS
外连接                        USING CLAUSE
自连接                        FULL OR TWO SIDED OUTER JOINS

(不)等值连接:
查询员工号、姓名、月薪、部门名称?
SELECT e.EMPNO,e.ENAME,e.SAL,d.DNAME
FROM EMP e,DEPT d
WHERE e.DEPTNO = d.DEPTNO;

外连接:
按照部门统计员工人数,显示部门号、部门名称、部门人数?
Oracle语法:
    SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
    FROM DEPT d,EMP e
    WHERE e.DEPTNO = d.DEPTNO(+)
    GROUP BY d.DEPTNO,d.DNAME;
SQL99语法:
    SELECT d.DEPTNO,d.DNAME,COUNT(e.EMPNO)
    FROM DEPT d
    LEFT JOIN EMP e
    ON e.DEPTNO = d.DEPTNO
    GROUP BY d.DEPTNO,d.DNAME;

自连接:通过表的别名,将同一张表视为多张表使用.
        自连接不适合操作大数据的表.
        当数据过大时,使用层次查询代替.
查询员工信息:员工的姓名 、 老板的姓名.
SELECT E1.ENAME 员工姓名, E2.ENAME 老板姓名
FROM EMP E1,EMP E2
WHERE E1.MGR = E2.EMPNO;
-----------------------------
员工姓名   老板姓名
---------- ----------
FORD       JONES
SCOTT      JONES
TURNER     BLAKE
ALLEN      BLAKE
WARD       BLAKE
JAMES      BLAKE
MARTIN     BLAKE
MILLER     CLARK
ADAMS      SCOTT
BLAKE      KING
JONES      KING
CLARK      KING
SMITH      FORD
-----------------------

层次查询:
    在层次查询当中,只能有一张表.
SELECT LEVEL,ENAME, MGR
FROM EMP
CONNECT BY PRIOR EMPNO = MGR
-- 如果是从根节点开始遍历:还可以换一个方式写.
-- START WITH MGR IS NULL
START WITH EMPNO = 7839 -- 从这个节点往下遍历.
ORDER BY 1;

子查询:

查询月薪比SCOTT员工高的员工信息?
SELECT * 
FROM EMP 
WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME='SCOTT');

*** 写子查询注意的问题:
1.括号的使用.
2.合理的书写风格.
3.可以在主查询的 WHERE、 SELECT、 HAVING、 FROM 后面放置子查询.
    (1)SELECT后面的子查询语句只能是单行子查询.
    
4.不可以在GROUP BY后放置子查询.
5.FROM 后面的子查询.
    (1)子查询的结果作为主查询的数据源.
        在已知的条件上增加新条件.
6.主查询和子查询可以是不同表,只要子查询返回的结果主查询可以使用即可.
    
7.一般不对子查询进行排序.但在TOP-N问题分析中,必须对子查询进行排序.
    
8.一般先执行子查询再执行主查询,但是相关子查询例外.
    (1)相关子查询:
        将主查询中的某些值作为参数传递给子查询,
        
9.单行子查询只能使用单行操作符,多行子查询只能使用多行操作符.
    单行操作符:= 、 > 、 >= 、 < 、 <= 、 !=(<>)
    多行操作符:IN 、 ANY:任何 、 ALL:全部
10.子查询中的NULL空值问题.

练习题:
1.找到员工工资最高的前三名,显示:序号、员工编号、姓名、月薪?
SELECT ROWNUM,E.*
FROM 
    (SELECT E.*
    FROM EMP E
    ORDER BY E.SAL DESC) E
WHERE ROWNUM <= 3;

*** 扩展:Oracle使用ROWNUM实现分页查询?
SELECT E.*
FROM
    (SELECT ROWNUM R,E.*
    FROM
        (SELECT E.* 
        FROM EMP E 
        ORDER BY E.SAL DESC) E
    WHERE ROWNUM <= high) E
WHERE E.R >= low;

pageNo : 当前页.
pageSize : 页大小.
lastNum : (pageNo - 1) * pageSize
low :  lastNum + 1
high : lastNum + pageSize
    
2.找到员工表月薪大于本部门平均薪水的员工
    显示:员工编号、姓名、月薪、部门平均月薪?
语法一:
SELECT E.DEPTNO,E.SAL,AVGE.AVGSAL
FROM EMP E,
    (
    SELECT E.DEPTNO,AVG(NVL(E.SAL,0)) AVGSAL
    FROM EMP E
    GROUP BY E.DEPTNO
    ) AVGE
WHERE E.DEPTNO = AVGE.DEPTNO
    AND E.SAL > AVGE.AVGSAL;

语法二:
SELECT E.DEPTNO,E.SAL,(SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO) AS "DEPTAVGSAL"
FROM EMP E
WHERE E.SAL > (SELECT AVG(E1.SAL) AVGSAL FROM EMP E1 GROUP BY E1.DEPTNO HAVING E1.DEPTNO = E.DEPTNO);

3.统计每年入职的员工个数
    显示:总数、年份1,年份2,...?
-- 计数思想.

集合运算:
1.并集:UNION [DISTINCT(默认)|ALL].
2.交集:INTERSECT.
3.减集:MINUS.

使用集合运算注意的问题:
1.参与集合运算的各个集合必须列数相同、列类型一致。
2.采用第一个集合的表头作为集合的表头。
3.ORDER BY 对集合排序写在最后。
4.使用括号。

Oracle中的表类型:
1.标准表
2.临时表
3.索引表

SQL的新增、修改、删除:

SQL类型:
1.DML(Data Manipulation Language 数据操作语言): 
    INSERT(增)、 UPDATE(改)、 DELETE(删)、 SELECT(查)
2.DDL(Data Definition Language 数据定义语言):
    CREATE DROP TRUNCATE TABLE(二维表)
    CREATE DROP VIEW(视图)
                SEQUENCE(序列)
                INDEX(索引)
                SYNONYM(同义词)
3.DCL(Data Control Language 数据控制语言):
    GRANT(授权)
    REVOKE(撤销权限)

INSERT插入、新增操作:
语法:
INSERT INTO 表名[(列1,列2,...)] VALUES(值1,值2,...)[,(值1,值2,...)];

*** Oracle中的地址符 & 用法相当灵活.·
    相当于PrepareStatement
用于新增:
    INSERT INTO 表名[(字段列表)] VALUES(&column1,&column2,...);
用于查询:
    SELECT * FROM &TABLENAME;

批处理:
    创建一张表结构与EMP表结构相同.
    CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE 1=2;
    
    将EMP表中的数据批量插入到EMP10表中?
    INSERT INTO EMP10 SELECT * FROM EMP WHERE DEPTNO = 10;

    思考:如何海量插入数据?
        1.数据泵.
        2.SQL*LOADER工具
        3.使用外部表.

UPDATE更新:
语法:
UPDATE 表名 SET 字段=值(数值,子查询返回结果) WHERE ...

DELETE、TRUNCATE 删除:
    DELETE和TRUNCATE的区别?
        1.DELETE逐条记录删除,TRUNCATE先删除表,再重建表.
        2.DELETE属于DML(可以回滚),TRUNCATE属于DDL(不可以回滚).
        3.DELETE不会释放空间,TRUNCATE会释放空间.
        4.DELETE会产生碎片,TRUNCATE不会产生碎片.
            碎片的产生会影响查询效率.
        5.DELETE可以闪回(FLASHBACK),TRUNCATE不可以闪回

Oracle碎片图解:
Oracle一张二维表中数据是从后往前存储.
--------------------------------------------

Oracle指针:
HWM(High Water Mark 高水位线)
---------------------------->

--------------------------------------------

*** DELETE操作的效率比TRUNCATE效率高.
    原因:DELETE操作并不是真正的被删除,知识把数据换个地方存储.
        UNDO表空间.

Oracle数据库事务:
    Oracle属于自动开启事务.
1.起始标识:事务中的第一条DML语句.
2.结束标识:
    (1)提交:
        显示提交:COMMIT
        隐式提交:EXIT(退出)、DDL、DCL
    (2)回滚:
        显示回滚:ROLLBACK [TO SAVEPOINT 保存点名称]
        隐式回滚:非正常退出、掉电...

定义事务保存点:SAVEPOINT 保存点名称;

数据库的隔离级别:

SQL99提供的4种事务隔离级别:
    1.READ UNCOMMITTED (读未提交数据):
        允许事务读取未被其它事务提交的变更,脏读,不可重复读,幻读的问题都会出现.
    2.READ COMMITTED (读已提交数据):
        只允许事务读取其它事务提交的变更,可以避免脏读,但是不可重复读和幻读的问题会出现.
    3.REPEATABLE READ (可重复读):
        确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其它事务对这个字段进行更新,
        可以避免不可重复读,但是幻读的问题任然存在.
    4.SERIALIZABLE (串行化):
        确保事务可以从一个表中读取相同行,在这个事务持续期间,禁止其它事务对该表进行
        插入、新增和删除.所有的并发问题都可以避免.但是性能十分低下.

Oracle中有3种事务隔离级别:
    1.READ COMMITTED(读已提交数据,默认)
    2.SERIALIZABLE(串行化)
    3.READ ONLY(只读)

创建和管理二维表:

创建表条件:
    1.具有CREATE TABLE权限
    2.有存储空间
创建表必须指定:
    表名、列名、数据类型、数据类型大小

创建表:
1.CREATE OR REPLACE TABLE 表名 (
    列名 数据类型 [数据约束],
    ...
);
2.CREATE OR REPLACE TABLE 表名[字段列表] AS (SubQuery);

操作表字段:
    1.新增一个字段:
        ALTER TABLE 表名 ADD 字段名 数据类型 [数据约束];
    2.修改列属性:
        ALTER TABLE 表名 MODIFY 字段名 新数据类型 [数据约束];
    3.修改列名称:
        ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名;
    4.删除一个字段:
        ALTER TABLE 表名 DROP COLUMN 字段名;
修改表名:
    RENAME 原表名 TO 新表名;

删除|清空表数据:
    DELETE|TRUNCATE TABLE 表名;
删除表:
    DROP TABLE 表名;
        删除的表被放置到Oracle回收站中.

*** Oracle数据类型:
VARCHAR2(SIZE):可变长字符串.
CHAR(SIZE):定长字符串.
NUMBER(P,S):可变长数值.
DATE:日期型数据.
LONG:可变长字符数据,最大可达到2G.
CLOB:字符数据,最大可达到4G.
RAW AND LONG RAW:原始的二进制数据.
BLOB:二进制数据,最大可达到4G.
BFILE:存储外部的二进制数据,最大可达到4G.
ROWID:行地址.

*** 数据的完整性约束:
    约束是表一级的限制.
    如果存在依赖关系,约束可以防止删除错误数据.
    约束的类型:
        NOT NULL:非空约束
        UNIQUE:唯一约束
        PRIMARY KEY:主键约束
        FOREIGN KEY:外键约束,
            主表的外键必须是副表的主键.
        CHECK:
            GENDER VARCHAR2(1) CHECK(GENDER IN('0','1')),
            SAL NUMBER(10,2) CHECK(SAL > 0)

*** 查看Oracle回收站:
        SHOW RECYCLEBIN;
    清空Oracle回收站:
        PURGE RECYCLEBIN;
    查看回收站表数据:
        SELECT * FROM "回收站表名";
    
*** CONSTRAINT:使用 CONSTRAINT 对约束命名.

*** 字段 CONSTRAINT 外键名称 [FOREIGN KEY] REFERENCES 表名(字段列表) 
    ON DELETE SET NULL
    ON UPDATE CASCADE

视图VIEW:
    视图是一张虚表。
    视图建立在已有的表基础之上。
视图的优点:
    简化查询。
    限制数据操作权限。
视图创建:
CREATE OR REPLACE VIEW 视图名
AS (SubQuery) 
[WITH CHECK OPTION] [WITH READ ONLY];

*** 不建议通过视图对表进行修改.

删除视图:DROP VIEW 视图名;

SEQUENCE序列:
    与AUTO_INCREMENT一样.
    就是一个数组,事先放置到内存当中.
    可以提高效率.

创建序列SEQUENCE:
CREATE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 数组是否循环
[CACHE n | NOCACHE]; --数组默认长度

操作指针从序列中取出数据:
    CURRVAL : 存放序列的当前值.
    NEXTVAL : 存放指针的下一个值.
取值:序列名.CURRVAL|NEXTVAL

序列在下列情况下会出现裂缝:
    1.回滚
    2.系统异常
    3.多个表共用一个序列

如果不讲序列的值装入内存,可以使用
USER_SEQUENCES表查看序列的当前有效值.

修改序列:
ALTERE SEQUENCE 序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE] -- 数组是否循环
[CACHE n | NOCACHE]; --数组默认长度

删除序列:
DROP SEQUENCE 序列名;

索引INDEX:
创建索引:
    CREATE INDEX 索引名称 ON 表名(字段列表);
索引表由Oracle数据库自动维护.

删除索引:
    DROP INDEX 索引名称;
    删除索引必须拥有DROP ANY INDEX权限.

同义词SNYONYM:就是别名
    可以代表任意的数据库对象.
    
创建同义词:
    CREATE [PUBLIC] SNYONYM 同义词名称 FOR [用户名.]表|视图...
    同义词的创建必须具有CREATE SNYONYM权限.
删除同义词:
    DROP SNYONYM 同义词名称;

PLSQL程序设计:Oracle自创语法.
    操作数据库的复杂逻辑.
    类似使用Java Jdbc操作Oracle.
    Oracle对SQL语言的扩展.执行效率高.

*** 开启|关闭Oracle的输出开关:SET SERVEROUTPUT ON|OFF(默认);

*** 查看Oracle PLSQL程序包 DESC|DESCRIBE 程序包名称;

*** 接收键盘输入:ACCEPT 地址名 PROMPT '提示语';
    使用键盘输入值:&地址名
    地址名存储的是输入值得地址名,这个地址保存了输入的值.

PLSQL语法格式:
DECLARE 
    -- 声明变量、光标、例外
BEGIN
    -- 语句序列.
    DBMS_OUTPUT.PUT_LINE('hello world!');
EXCEPTION
    -- 例外处理语句.
END;
/

什么是PLSQL?
1.PLSQL(Procedure Language Structured Query Language).
2.PLSQL是Oracle对SQL语言的过程化扩展.
3.指在SQL命令语言中增加了过程处理语句(例如:分支、循环等),
使SQL语言具有过程处理能力.

PLSQL变量和常量:

变量语法格式:
    变量名 数据类型 [:=初始值];
常量语法格式:
    变量名 CONSTANT 数据类型 [:=初始值];

变量数据类型:
    CHAR
    VARCHAR
    DATE
    NUMBER
    BOOLEAN
    LONG
    EMP.ENAME%TYPE 引用型变量
    EMP%ROWTYPE 记录型变量

PLSQL条件语句:
语法格式:
IF 表达式1 THEN 处理语句1
    ELSIF 表达式2 THEN 处理语句2
    ...
    ELSIF 表达式n THEN 处理语句n
    ELSE 另外处理语句
ENDIF;

循环语句:
1.
WHILE 表达式
LOOP
    -- 循环体.
END LOOP;

*** 类似Java中的WHILE循环.
2.
LOOP
    EXIT 表达式
    -- 循环体
END LOOP;

*** 类似Java中的DO...WHILE循环.
3.
FOR 变量名 IN 表达式
LOOP
    -- 循环体
END LOOP;

*** 类似Java中的FOR循环.

CURSOR光标|游标:
    类似Java中的ResultSet.
声明光标CURSOR格式:
CURSOR 光标名称 [(参数名 数据类型[,参数名 数据类型]...)]
IS SELECT 语句(可以使用光标参数);

光标用于存储一个查询返回的多行数据.

操作光标:
打开光标:OPEN 光标名称[(参数值[,参数值]...)];
取一行光标值:FETCH 光标名称 INTO 变量;
关闭光标:CLOSE 光标名称;

光标的属性:返回TRUE|FALSE
    %ISOPEN 是否开启
    %ROWCOUNT 影响的行数.
    %FOUND 找到
    %NOTFOUND 未找到
使用方式:
    光标名称+光标属性(返回TRUE|FALSE)
    
练习:
1.使用光标查询员工的姓名和月薪,并打印?
2.查询某个部门的员工信息?

例外EXCEPTION:
    例外是程序设计语言提供的一种功能,
    用来增强程序的健壮性和容错性.

*** Java程序中的例外EXCEPTION:
Java例外处理机制:向上抛出.
try{
    ...
}catch(Exception e1){
    ...
}catch(Exception e2){
    ...
}finally{
    ...
}

Oracle的系统定义异常:
    NO_DATA_FOUND:未找到数据异常。
    TOO_MANY_ROWS:SELECT ... INTO ... 语句匹配多行记录异常。
    ZERO_DIVIDE:被零除异常。
    VALUE_ERR:算术异常或转换异常。
    TIME_OUT_RESOURCE:等待资源时发生超时异常。

Oracle用户自定义异常:
    异常名称 EXCEPTION;

向EXCEPTION抛出异常:
    RAISE 异常名称;

被零除异常问题?
SET SERVEROUTPUT ON;
DECLARE
    PNUM NUMBER := 1;
    
    VALUE_ONE EXCEPTION;
    -- 1.自定义异常.
BEGIN
    PNUM := 1/0;
    
    IF PNUM = 1 THEN RAISE VALUE_ONE;
    -- 2.抛出异常.
EXCEPTION
    WHEN ZERO_DIVIDE 
    THEN DBMS_OUTPUT.PUT_LINE('系统出现异常!');
         DBMS_OUTPUT.PUT_LINE('0不能作为被除数!')
    WHEN VALUE_ERR 
    THEN DBMS_OUTPUT.PUT_LINE('算术或者转换异常!');
    WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('未知异常!');
    
    WHEN VALUE_ONE THEN DBMS_OUTPUT.PUT_LINE('值为1');
    -- 3.处理异常.
END;
/

使用PLSQL处理Oracle数据库问题步骤:
1.需求分析
    2.概要设计HIGH LEVEL DESIGN
      详细设计LOW LEVEL DESIGN
        3.编码CODING
            4.测试TEST
                5.上线APPLICATION

使用PLSQL处理Oracle问题考虑的问题:
    1.SQL语句.
    2.变量:初始值,如何得到

*** Java的垃圾回收机制不受Java代码的控制。
Java中System类下的gc()函数只是请求调用Java回收机制.
Java回收机制受虚拟机内存:-Xms100M -Xmx200M影响.
当Java的内存已满,Java会优先回收最近最少使用的垃圾.

OUT参数中使用游标:
    *** 必须将存储过程放到程序包中.
创建包头:
    CREATE [OR REPLACE] PACKAGE 包名 AS
        TYPE empcursor IS REF CURSOR;
        PROCEDURE queryEmpList(dno IN NUMBER,empList OUT empcursor);
    END 包名;

创建包体:
    CREATE [OR REPLACE] PACKAGE BODY 包名 AS
        PROCEDURE 存储过程名称(dno IN NUMBER,empList OUT empcursor)
        BEGIN
            OPEN empList FOR SELECT * FROM EMP WHERE DEPTNO = dno;
        END 存储过程名称;
    END 包名;

触发器TRIGGER:

触发器是一个与表相关联的、存储的PLSQL程序.每当一个特定的
SQL操作语句(INSERT,UPDATE,DELETE)在指定的表上发出的时候,
数据库会自动的执行触发器中定义的语句序列.

触发器的类型:
1.语句级触发器:
    在指定的操作语句之前或之后执行一次,
    不管这条语句影响了多少行.
2.行级触发器(FOR EACH ROW):
    触发语句作用的每一条记录都会被触发,在行级触发器中
    使用 :old 和 :new 伪记录变量,识别值得状态.

创建触发器语法格式:
CREATE [OR REPLACE] TRIGGER 触发器名称
BEFORE|AFTER
INSERT|UPDATE|DELETE [OF 字段列表]
ON 表名
[FOR EACH ROW [WHEN(条件)]]
DECLARE
    -- 声明变量.
BEGIN
    -- 实现逻辑语句.
EXCEPTION
    -- 例外处理语句.
END;
/

*** 触发器与伪记录变量的值:
触发语句        :old                            :new
INSERT            所有字段都是NULL空值            将要插入的数据
UPDATE            更新之前改行的值                更新改行后的值
DELETE            删除改行之前的值                所有的字段都是NULL空值

*** Oracle触发器中抛出异常,建议使用RAISE_APPLICATION_ERROR(errorCode,errorMessage)
    函数抛出. errorCode错误代码范围:(-20999,-20000).

练习:
1.商品库存和订单问题?
2.复杂的安全性检查,禁止在非工作时间插入新员工信息?
非工作时间:
    (1)周末
    (2)上班前9.30,下班后6.30
3.数据确认,员工涨工资不能涨长越少?

*** 触发器总结:
触发器应用:
    1.数据确认.
    2.实施复杂的安全性检查.
    3.做审计,跟踪表上所做的数据操作等.
        Oracle数据库已经做了审计功能.
    4.数据的备份和同步.

查询触发器、过程以及函数:
    SELECT * FROM USER_TRIGGERS;
    SELECT * FROM USER_SOURCE;

存储过程PROCEDURE和存储函数FUNCTION:

是指在数据库中供所有用户程序调用的子程序
叫存储过程、存储函数.

存储过程PROCEDURE和存储函数FUNCTION的最大区别:
存储函数可以通过RETURN返回结果.

创建存储过程:
CREATE [OR REPLACE] PROCEDURE 存储过程名称(形参列表)
AS
DECLARE
    -- 声明变量.
BEGIN
    -- 执行语句.
EXCEPTION
    -- 例外处理语句.
END;
/

*** Oracle存储过程形式参数的定义
    格式:形参名称 IN|OUT|INOUT 数据类型

调用存储过程:
1.EXECUTE/EXEC 存储过程名称;
2.在PLSQL中调用存储过程:
DECLARE
BEGIN
    存储过程名称(实参列表);
END;
/

练习:
1.给指定的员工涨指定额外的工资?

存储函数FUNCTION:
函数(FUNCTION)是一个命名的存储程序,可以带参数,
并返回一个值,函数和过程的结构类似,但是必须有一
个RETURN子句,用于返回函数值.函数说明要指定函数
名称,结果值的类型,以及参数类型等.

Oracle创建存储函数:
CREATE [OR REPLACE] FUNCTION 函数名(形参列表)
RETURN 返回函数值的数据类型
AS
DECLARE
    -- 声明变量.
BEGIN
    -- 逻辑处理语句.
EXCEPTION
    -- 异常处理语句.
END;
/

调用存储函数FUNCTION:
1.SELECT 函数名(实参列表) FROM DUAL;
2.PLSQL调用函数.

*** 什么时候使用存储过程,什么时候使用存储函数?
    原则:如果只有一个返回值,使用存储函数,否则
        使用存储过程.

*** 存储过程和存储函数中的形参类型IN和OUT:
    
    一般来说,存储过程和函数的区别就是在于函数
    可以有一个返回值,而存储过程没有.
    
    但是存储过程和函数都可以通过OUT制定一个或
    多个输出参数.我们可以利用OUT参数,在存储过
    程和函数中实现返回多个值.

练习:
1.查询某个员工的姓名、月薪、职位?

数据字典DICTIONARY:

Oracle中的二维表:
    1.基本表
        描述数据库信息,只能由数据库
        服务器进行修改.
    2.用户表
        用户自定义表.

Oracle数据字典总表:DICTIONARY.

数据字典命名规则:
前缀        说明
USER        用户自己的.
ALL            用户可以访问到的.
DBA            管理员视图.
V$            性能相关的数据,动态性能视图.

USER_OBJECTS:
通过查询USER_OBJECTS可以确定当前用户创建的所有对象.
可以获取一下信息:
DATE CREATED -- 创建时间
DATE OF LAST MODIFICATION 最后一次修改时间.
STATUS(状态:VALID(有效) 、 INVALID(无效))

ALL_OBJECTS:
可以通过查询ALL_OBJECTS来确定当前用户能访问
的数据库对象.

数据库管理:

利用DBCA(Database Configuration Assistant)创建Oracle数据库:
在安装Oracle的时候可以选择安装ORCL数据库,
但是在真实的环境中,不要使用DBCA安装ORCL数据库.

Oracle安装文件下有Database Configuration Assistant插件.

Database Configuration Assistant功能:
创建数据库
配置数据库选项
删除数据库
管理模板
配置自动存储管理:ASM (Automatic Store Manage)

DBA:Database Administrator 数据库管理员
(DBA职责) 数据库管理任务:
1.评测数据库服务器硬件.
2.安装Oracle数据库软件.
3.规划数据库.
4.创建并打开数据库.
5.数据库备份.
6.注册用户.
7.实现数据库计划.
8.全库备份、增量备份.
9.调整数据库性能.

Database Configuration Assistant创建数据库步骤:
1.从以下列表中选择模板来创建数据库
2.填写数据库全名称和SID
3.使用Web版数据库管理工具.
4.设置密码.

Oracle初始化参数存储于SPFILE逻辑文件.

Oracle闪回FLASHBACK:

闪回解决的问题:
1.错误的删除了数据,并且COMMIT.
2.错误的删除了表 DROP TABLE.
3.如何获取表上的历史记录.
4.如何撤销一个已经提交的事务.

闪回的类型:
1.闪回表(FLASHBACK TABLE):
    将表回退到过去的一个时间上.
2.闪回删除(FLASHBACK DROP):
    操作Oracle的回收站.
3.闪回版本查询(FLASHBACK VERSION QUERY):
    表上的历史记录.
4.闪回事务查询(FLASHBACK TRANSACTION QUERY):
    获取一个操作UNDO_SQL,然后通过UNDO_SQL来撤销事务.
5.闪回数据库:
    将数据库回退到过去的一个时间上.
6.闪回归档日志:

闪回操作最初出现在Oracle 9i中,最初只有第一种类型,
在10g版本中才增加后几个版本.

闪回的好处:
1.恢复中,闪回技术是革命性的进步.
2.传统的恢复技术缓慢.
    它是整个数据库或者一个文件的恢复,不只是恢复损坏的数据.
    在数据库日志中每个修改都必须被检查.
3.闪回的速度快.
    通过行和事务把改变编入索引.
    仅仅改变的数据会被恢复.
4.闪回的命令很容易.
    没有复杂棘手的多步程序.

闪回表(Flashback Table):

闪回表,实际上是将表中的数据快速恢复到过去的一个焦点或者系统改变号SCN上,
实现表的闪回,需要设计到与撤销表空间相关的UNDO信息,通过SHOW PARAMETER UNDO
命令可以了解这些信息.

用户对表数据的修改操作,都记录在撤销表空间中,这为表的闪回提供了数据恢复
的基础,例如:某个修改操作在提交后被记录在撤销表空间中,保留时间为900秒,
用户可以在这900秒的时间内对表进行闪回操作,从而将表中的数据恢复到修改
之前的状态.

执行表的闪回,需要有Flashback Any Table 权限.

*** 使用系统管理员查看UNDO信息,
    ALTER SYSTEM SET UNDO_RETENTION=1200 SCOPE=BOTH;
    SCOPE : MEMORY|SPFILE|BOTH
    -- 修改撤销表空间的时间.

*** 系统改变号SCN -- 和Oracle系统时间相对应.
    SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:mm') 时间,
           TIMESTAMP_TO_SON(SYSDATE) SCN
    FROM DUAL;

*** 开启表的行移动功能:ALTER TABLE 表名 ENABLE ROW MOVEMENT;
    
闪回表(Flashback Table)语法格式:
FLASHBACK TABLE [schema.]表名
TO 
    [BEFORE DROP [RENAME TO 表名]] 
        BEFORE DROP ->表示恢复到删除之前,
        RENAME TO 表名 ->表示更换表名.
    或[SCN 值]
        表示将表闪回到这个系统改变号对应的时间点上.
    或[TIMESTAMP 值]
        表示将表闪回到这个时间点上.
[[ENABLE|DISABLE] TRIGGER]
    ENABLE TRIGGER表示触发器恢复以后为enable状态,
    默认则为disable状态.

问题:
    如何获取离该操作最近的一段时间或SCN?

闪回表注意的问题:
    1.系统表不能被闪回.
    2.不能跨越DDL操作.
    3.会被写入警告日志.
    4.产生撤销和重做的数据.

闪回删除(Flashback Drop):

查看回收站:SHOW RECYCLEBIN;

清空回收站:PURGE RECYCLEBIN;

查看回收站中的表信息:
*** 使用RECYCLEBIN NAME 值作为表使用.
SELECT * FROM "RECYCLEBIN NAME";

*** 回收站只对表使用.

*** 管理员没有回收站.

执行闪回删除:
FLASHBACK TABLE 原表名|"RECYCLEBIN NAME" 
TO BEFORE DROP [RENAME TO 新表名];

当回收站中有重复的表时?
    通过表名将表从回收站还原,回收站默认还原
最新删除的表.

*** 当第二张同名表要还原的时候,需要重新命名表名.

闪回表和闪回删除小结:
1.闪回表:
    SHOW PARAMETERS UNDO ---> 900秒
    SCN 系统改变号.
    执行闪回表:
        行移动.
    系统表不能闪回(数据字典)
    不能跨越DDL操作.
    如何获取离该操作最近的一个时间.
2.闪回删除:
    Oracle回收站.
    管理员没有回收站.
    执行闪回删除.
        通过表名或"RECYCLEBIN NAME" 闪回.
    闪回同名的表.

闪回版本查询(FLASHBACK VERSION QUERY):
    闪回版本查询,提供了一个审计行改变的查询
功能,通过它可以查找到所有已经提交了的行记录。

Flashback Version Query语法格式:
SELECT 
    字段列表
    [,VERSIONS_OPERATOR,
    VERSIONS_STARTTIME,
    VERSIONS_ENDTIME,
    VERSIONS_XID -- 事务号
    ]
FROM 表名
VERSION BETWEEN
[SCN|TIMESTAMP]
[express|MINVALUE]
AND
[express|MAXVALUE]
AS OF -- AS OF:表示恢复单个版本
[SCN|TIMESTAMP]
express;
-- BETWEEN ... AND ... :表示时间段.

FVQ->解决如何获取最近操作的时间或SCN?

闪回事务查询(Flashback Transaction Query):
    闪回事务查询实际上是闪回版本查询的一个扩充,
通过它可以审计某个事务甚至撤销一个已经提交的事务.

实现闪回事务查询,需要先了解FLASH_TRANSACTION_QUERY视图,从该视图中可以获取事务的历史
操作记录,以及撤销语句(UNDO_SQL).

使用闪回事务查询,可以了解某个表的历史操作记录对应的一个撤销
SQL语句,如果想要撤销这个操作,就可以执行这个SQL语句.

Oracle的导入(import)导出(export):
    *** 轻量级的备份和还原.

*** RMAN(Recovery Manager) 数据的备份.

export导出:
exp -help; 可以查看导出的数据文档.

exp导出的三种方式:
1.表方式:将指定表的数据导出.
exp scott/tiger@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log 
tables=emp,dept

2.用户方式:将指定用户的所有对象以及数据导出.
exp scott/tiger@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log


3.全库方式:将数据库中的所有对象导入导出(管理员权限).
exp system/password@localhost:1521/orcl 
file=d:/temp/a.dmp 
log=d:/temp a.log
full=y

imp导入的三种方式:
1.表方式:将指定表的数据导入.
imp hr/hr@localhost:1521/orcl 
file=d:/temp/a.dmp
log=d:/temp impa.log
tables=emp,dept
fromuser=scott touser=hr
commit=y
ignore=y

2.将指定用户的所有对象以及数据导入.
imp hr/hr@localhost:1521/orcl
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
fromuser=scott touser=hr
commit=y
ignore=y

3.全库方式:将数据库中的所有对象导入(管理员权限).
imp system/password@1521/orcl 
file=d:/temp/a.dmp
log=d:/temp/ia.dmp
full=y
commit=y
destory=y

管理方案(schema):
EM管理器的使用.

什么是方案?

11gOracle登录(enterprise manager)EM:
路径:
    https://localhost:1158/em/

登录需要权限:SELECT_CATALOG_ROLE


*** 命令行切换用户:
    CONN 用户名/密码 [AS SYSDBA(管理员)]

用户管理安全:
用户user:
    1.创建一个用户:
        CREATE USER 用户名 [PROFILE DEFAULT] 
        IDENTIFIED BY 密码 [ACCOUNT UNLOCK]
        GRANT CONNECT TO 用户名;
    2.删除用户:
        DROP USER 用户名 [CASCADE(级联)];
一个Oracle用户具备:
    (1)一个唯一的用户名.
    (2)一个验证方法.
    (3)一个默认表空间.
    (4)一个临时表空间.
    (5)一个用户概要文件.
    (6)一个消费群.
    (7)一个锁状态.
    (8)每个表空间的配额.
    (9)权限和角色.

角色role:
    创建角色:
        CREATE ROLE 角色名称;
    赋予角色权限:
        GRANT ... TO 角色名称;

权限privilege:
    用户权限分类:
        (1)系统权限system:
        (2)对象权限object:

概要文件profile:

Oracle用户的认证方式:
1.password密码认证.
2.External外部认证(或主机认证),当前用户必须是管理员administrator.
    外部认证方式优先于密码认证方式.
    sqlplus / [as sysdba];
3.global全局认证方式(例如:生物认证方式(指纹,眼膜),token认证方式):

*** windows系统打开本地用户和组:lusrmgr.msc

*** Oracle预定义用户:
    SYS(数据库拥有者):
        拥有DBA权限.
        拥有ADMIN OPTION的所有权限.
        拥有startup,shutdown,以及若干维护ml.
        拥有数据字典.
    SYSTEM用户:
        拥有DBA权限.
    *** 这些用户并非用于常规操作.
        
*** 用户解锁:ALTER USER 用户名 ACCOUNT UNLOCK;

*** 用户修改密码:ALTER USER 用户名 IDENTIFIED BY 新密码;

*** 使用ADMIN OPTION 撤销系统权限(system privilege):
 GRANT CREATE TABLE TO 用户名 WITH ADMIN OPTION;
 
 REVOKE CREATE TABLE TO 用户名;-- 不会产生级联撤销.

*** 使用grant option 撤销对象权限:
    撤销时会产生级联效果.
 
*** 用户创建表条件:
    (1)有CREATE TABLE权限.
    (2)有表空间.
        给用户分配表空间:
            ALTER USER 用户名 QUOTA UNLIMITED ON USERS;

*** 常用于创建一个普通用户语句:
CREATE USER 用户名 [PROFILE DEFAULT] 
IDENTIFIED BY 密码 [ACCOUNT UNLOCK];
GRANT CONNECT,RESOURCE TO 用户名;

概要文件profile:
1.指定密码规则.
2.控制资源消费.

Oracle分布式数据库:
数据在物理上被存放在多个节点上,但是逻辑上是一个整体.

分布式数据库的独立性:
    分布式数据的独立性是指用户不关心数据是如何分割和
    存储,只需它关心需要什么数据.

数据库链路:DBLINK
    数据库链路是单向的.
    跨节点的数据创建及查询.
    跨节点的数据更新.
定义数据库链路:
CREATE DATABASE LINK 所需要连接数据库的真实名称SID
CONNECT TO 所需要连接数据库的用户名
INDENTIFIED BY 所需要连接数据库的密码 
USING [所需要连接数据库的服务命名];

*** Oracle数据库程序安装包下:
    启动Oracle Net Manager 创建服务命名.
    
*** 创建数据库链路需要:CREATE DATABASE 权限.

分布式数据库的查询:
SELECT ENAME,DNAME
FROM DEPT,EMP@所需要连接数据库的真实名称SID
WHERE EMP.DEPTNO=DEPT.DEPTNO;

使用同义词给远端的数据库创建别名:
CREATE SYNONYM 同义词名称 FOR EMP@所需要连接数据库的真实名称SID;

分布式数据库的插入:
INSERT INTO EMP SELECT * FROM EMP@SID;

数据的复制:
CREATE TABLE EMP AS SELECT * FROM EMP@SID;

分布式数据库跨节点更新:
快照:
    定义快照维护关系表的异步副本,
    指在主表修改后的指定时间内刷新副本,
    用于主表修改少,但查询频繁的表.
    
    CREATE SNAPSHOT 表名 
    REFRESH START WITH SYSDATE
    NEXT NEXT_DAY(SYSDATE,'MONDAY')
    AS SELECT * FROM EMP@SID;
触发器:
    利用触发器实现数据的同步.

CREATE [OR REPLACE] TRIGGER 触发器名称
BEFORE|AFTER
INSERT|UPDATE|DELETE [OF 字段列表]
ON 表名
[FOR EACH ROW [WHEN(条件)]]
DECLARE
    -- 声明变量.
BEGIN
    -- 实现逻辑语句.
EXCEPTION
    -- 例外处理语句.
END;
/

转载于:https://my.oschina.net/u/2607324/blog/756842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值