• 数据目标oracle copy 与postgresql copy


    在本篇文章中,我们主要分析数据目标的内容,自我感觉有个不错的提议和大家分享下

        先分析oracle copy,其实这个令命我到现在都没用过,也是做数据迁移的令命,注意这个令命是SQL*PLUS的令命,不是oracle的,通过这个令命可以在不同的表之间挪动数据

        1.基本法语:

        COPY {FROM database | TO database | FROM database TO database} {APPEND|CREATE|INSERT|REPLACE} destination_table [(column, column, column, ...)] USING query

        a) databaseusername/password@dbname

        from database|to database可以任选一,少缺的一方默许应用前当sqlplus录登的数据库替代。

        b) query:通普的select语句,多行时行尾应用连符字 ’-‘ 换行标记

        支撑的数据类型:CHAR,DATE,LONG,NUMBER,VARCHAR2

        copy datasqlplus作为数据流的管道,不需要间中文件,数据库名应用tns中的配置。query子句在数据源库上执行,结果直接发到目标库。

        2.四种式模:

        c) append:目标表不存在时先建表再插入数据,若存在直接加载数据。

        d) create:直接建表,若目标表存在,报错退出。

        e) insert:直接插入数据,若目标表不存在,报错退出。

        f) replace:目标表存在时会先除删表,再重建及加载数据,一般很罕用这个式模

        注意:createreplace 面后没有table关键字,insert面后没有intovalues关键字

        l 参数:应用sqlplus参数,跟数据库有关。这些参数可以在sqlplus里,show 参数名来看查详细值。

        a) arraysize:一个次批传输的数据量,默许值是100,可以在sqlplus里,应用show arraysize看查。

        b) copycommit:义定多少次批主动commitcopycommit*arraysize=一次commit的数据量,这个乘积对事务小大有影响。默许是0,就是有所数据加载毕完才做一次commit,提议应用非0数字。

        c) long:可以传输long数据的长度,默许值是20000

        destination_table [(column, column, column, ...)] 目标表的列名,不指定的话,那么应用面后查询语句的列名

        每日一道理
    聪明人学习,像搏击长空的雄鹰,仰视一望无际的大地;愚笨的人学习,漫无目的,犹如乱飞乱撞的无头飞蛾;刻苦的人学习,像弯弯的河流,虽有曲折,但终会流入大海;懒惰的人学习,像水中的木头,阻力越大倒退得越快。

        举例:

        SQL> copy from sf/sf@skyread to sf/sf@skyread create tb1 using select * from am_role;

        Array fetch/bind size is 15. (arraysize is 15)
    Will commit when done. (copycommit is 0)
    Maximum long size is 80. (long is 80)

        CPY-0012: Datatype cannot be copied

        SQL> desc am_role
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     ROLEID                                    NOT NULL VARCHAR2(32 CHAR)
     ROLENAME                                           VARCHAR2(255 CHAR)
     TAG                                                VARCHAR2(255 CHAR)
     MEMO                                               VARCHAR2(2000 CHAR)
     UPDATEUSER                                         VARCHAR2(50 CHAR)
     UPDATEDATE                                         TIMESTAMP(6)
     FAST                                               VARCHAR2(1 CHAR)

        看到数据类型不能匹配,这里有TIMESTAMP

        SQL> select count(*) from A_USER_CONSUME;

          COUNT(*)
    ----------
          8632

        SQL> desc A_USER_CONSUME
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     IMSI                                      NOT NULL VARCHAR2(30)
     DAYS                                               NUMBER(38)
     DIRECT_CONSUME                                     NUMBER
     MO_CONSUME                                         NUMBER

        SQL> copy from sf/sf@skyread to sf/sf@skyread create tb1 using select * from A_USER_CONSUME;

        Array fetch/bind size is 15. (arraysize is 15)
    Will commit when done. (copycommit is 0)
    Maximum long size is 80. (long is 80)
    Table TB1 created.

           8632 rows selected from sf@skyread.
       8632 rows inserted into TB1.
       8632 rows committed into TB1 at sf@skyread.

        SQL> select count(*) from tb1;

          COUNT(*)
    ----------
          8632

        注意这里from 和to 起码要指定一个,如果不写,那么默许在前当schema下,必定注意这里create面后没有table关键字,是直接跟表名的

        oracle这里用copy的利益是较比活灵,当然这里和create table ... as select ...种这果效是一样的,但是如果是追加新的记录insert into ... select ...如果量很大的话,那么会产生大量的redo和undo,对IO有很大影响,这里copy是不生成undo信息,当然果效会好一些,实际情况用copy还是较比少的,这里只是了解一下oracle有这个功能

         

        另外postgresql 也有copy这个令命,用起来也很活灵,是迁移数据的一个好工具

        Syntax:
    COPY table_name [ ( column [, ...] ) ]
        FROM { 'filename' | STDIN }
        [ [ WITH ] ( option [, ...] ) ]

        COPY { table_name [ ( column [, ...] ) ] | ( query ) }
        TO { 'filename' | STDOUT }
        [ [ WITH ] ( option [, ...] ) ]

        where option can be one of:

            FORMAT format_name
        OIDS [ boolean ]
        DELIMITER 'delimiter_character'
        NULL 'null_string'
        HEADER [ boolean ]
        QUOTE 'quote_character'
        ESCAPE 'escape_character'
        FORCE_QUOTE { ( column [, ...] ) | * }
        FORCE_NOT_NULL ( column [, ...] ) |
        ENCODING 'encoding_name'

        法语也是很简明的,分析几个常用的选项

        DELIMITER :指定分隔符

        HEADER:声明文件包含一个头标识,包含字段名称

         

        postgres=# copy  t1 to '/home/postgres/t1.sql';
    COPY 5

        postgres=# copy t1 from '/home/postgres/t1.sql';
    COPY 5

        postgres=# select count(*) from t1;
     count 
    -------
        10
    (1 row)

        可以看到这里多了5行

        postgres=# copy shoelace_log to '/home/postgres/shoelace_log.sql' DELIMITER ':';

        1:apple

        导出为CVS格式:

        postgres=#copy  t1 to '/home/postgres/t1.csv'  csv header;

        这里with写可不写

         

        指定需要导出的列:

        postgres=#copy  t1(a,b)  to '/home/postgres/t1.csv' with DELIMITER ':' csv header;

    文章结束给大家分享下程序员的一些笑话语录: 雅虎最擅长的不是开通新业务,是关闭旧业务。

  • 相关阅读:
    ACM-ICPC 2018 徐州赛区网络预赛 Morgana Net
    ACM-ICPC 2018 焦作赛区网络预赛 E. Jiu Yuan Wants to Eat ,树链抛分+线段树
    ACM-ICPC 2018 焦作赛区网络预赛 Poor God Water 矩阵快速幂
    ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge 状压dp
    codeforces 776 D The Door Problem
    codeforces 765 E Tree Folding
    codeforces 765 D Artsem and Saunders
    P2764 最小路径覆盖问题
    SPOJ Count on a tree 主席树+lca
    BZOJ 1066 蜥蜴
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3069701.html
Copyright © 2020-2023  润新知