Sql*load

1. sql*loader的文件有哪些?

日志文件:概述了作业的成功与失败以及所有相关错误的细节

错误文件(bad file):从输入文件中抽取的行可能会被sqlldr丢弃(原因可能是这些行与控制文件所期望的格式不一致),也可能会被数据库丢失(例如,插入操作可能违反某个完整性约束),在上述两种情况下,这些记录都会被写入错误文件(bad file)

废弃文件(reject file):如果成功的从输入文件中抽取记录,但是由于不匹配某些记录选择标准而被丢弃,那么这些记录会被写入废弃文件(reject file)

控制文件:一个文本文件,是sqlldr如何解释输入文件的内容以及如何利用从输入文件中抽取的记录

实验:将文件中的数据通过sql*loader加载到表中

create table t as select * from emp where 1=2;

将emp的数据输出到操作系统下的一个文件中:

SQL> set trims on
SQL> spool /u01/emp.txt
SQL> desc emp

SQL> select EMPNO||','||
2 ENAME||','||
3 JOB||','||
4 MGR||','||
5 HIREDATE||','||
6 SAL||','||
7 COMM||','||
8 DEPTNO
9 from emp;

EMPNO||','||ENAME||','||JOB||','||MGR||','||HIREDATE||','||SAL||','||COMM||','||
--------------------------------------------------------------------------------
7369,SMITH,CLERK,7902,17-DEC-80,800,,20

SQL> spool off

写控制文件:

vi /u01/load.ctl写入以下内容:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
append
into table t
fields terminated by ','
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

保存退出

开始加载数据:

sqlldr scott/tiger control=/u01/load.ctl log=/u01/emp.log

选项介绍:

1. trailing nullcols

如果一条记录中的结尾字段不存在任何相关占位列插入null值

控制文件内容如下:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,

加载数据:

sqlldr scott/tiger control=load.ctl

SQL> select * from t;

no rows selected

发现没有数据

在控制文件中加入trailing nullcols如:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

sqlldr scott/tiger control=load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 WARD SALESMAN 7698 22-FEB-81 1250 500

发现数据已经加载到表中,deptno为null

2. 按照数据文件中的日期格式将数据加载到表中:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt数据如下:

7521,WARD,SALESMAN,7698,2001-01-01 19:14:13,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

no rows selected

发现日期的格式为yyyy-mm-dd hh24:mi:ss,数据库默认的日期格式为dd-mm-yy,可以将控制文件更改如下:

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE date "yyyy-mm-dd hh24:mi:ss",
SAL,
COMM,
DEPTNO)

export NLS_LANG=american
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'

sqlldr scott/tiger control=/u01/load.ctl

SQL> col empno for 9999
SQL> col deptno for 99
SQL> col mgr for 9999
SQL> col ENAME for a5

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ----- --------- ----- ------------------- ---------- ---------- ------
7521 WARD SALESMAN 7698 2001-01-01:19:14:13 1250 500 30

3. 使用函数,对数据文件中的数据进行加工

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB "substr(:job,1,3)",
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt的内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 WARD SAL 7698 22-FEB-81 1250 500 30

4. 跳过数据列

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME filler,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt的内容如下:

7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7521 SALESMAN 7698 22-FEB-81 1250 500 30

5. 选择数据

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
when deptno='30'
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME filler,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

/u01/emp.txt内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7499 SALESMAN 7698 20-FEB-81 1600 300 30
7521 SALESMAN 7698 22-FEB-81 1250 500 30

6. 输入空值

vi /u01/load.ctl

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
replace
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM nullif deptno='30',
DEPTNO)

/u01/emp.txt内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

sqlldr scott/tiger control=/u01/load.ctl

SQL> select * from t;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 30

7. 直接加载数据

从表的高水位线后面直接加载数据

常规加载方法:

SQL> create table t as select * from emp where 1=2;

Table created.

控制文件如下:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
insert
into table t
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

数据文件内容如下:

7369,SMITH,CLERK,7902,17-DEC-80,800,,20
7499,ALLEN,SALESMAN,7698,20-FEB-81,1600,300,30
7521,WARD,SALESMAN,7698,22-FEB-81,1250,500,30

开始常规加载:

sqlldr scott/tiger control=/u01/load.ctl log=/u01/emp.log

1* select * from t
SQL> /

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30

SQL> select EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 385 8

analyze table scott.t compute statistics;

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
14 5 3

SQL> delete scott.t;

14 rows deleted.

SQL> commit;

Commit complete.

SQL> analyze table scott.t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 5 3

使用直接路径加载:

SQL> delete t;

14 rows deleted.

SQL> commit;

Commit complete.

SQL> analyze table t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from user_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
0 5 3

sqlldr scott/tiger control=/u01/load.ctl direct=y log=/u01/emp.log

SQL> analyze table scott.t compute statistics;

Table analyzed.

SQL> select NUM_ROWS,BLOCKS,EMPTY_BLOCKS from dba_tables where TABLE_NAME='T';

NUM_ROWS BLOCKS EMPTY_BLOCKS
---------- ---------- ------------
14 9 7

SQL> select EXTENT_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='T';

EXTENT_ID BLOCK_ID BLOCKS
---------- ---------- ----------
0 385 8
1 393 8

数据库目录

创建目录对象:

conn scott/tiger

create directory dump_dir as '/u01/dir';

SQL> conn /as sysdba
SQL> create directory dump_dir as '/u01/dir';

SQL> grant read,write on directory dump_dir to scott;

SQL> grant all on directory dump_dir to scott;

select * from all_directories;---------owner仍然是sys

数据泵

1. 导出导入表

创建数据泵目录:

SQL> conn /as sysdba
SQL> create directory dump_dir as '/u01/dir';

SQL> grant read,write on directory dump_dir to scott;

SQL> grant all on directory dump_dir to scott;

导出emp,dept表:

[oracle@nylg ~]$ expdp scott/tiger directory=dump_dir dumpfile=exp%U.dmp tables=emp,dept job_name=exp

[oracle@nylg ~]$ cd /u01/dir
[oracle@nylg dir]$ ls
exp01.dmp export.log
[oracle@nylg dir]$ vi exp01.dmp
[oracle@nylg dir]$ vi export.log
[oracle@nylg dir]$ sqlplus scott/tiger

SQL> drop table emp purge;

SQL> drop table dept purge;

SQL> exit

[oracle@nylg dir]$ impdp scott/tiger directory=dump_dir dumpfile=exp01.dmp tables=emp,dept job_name=imp

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select * from tab;

SQL> select count(*) from dept;

SQL> select count(*) from emp;

查看约束是否存在:

SQL> select CONSTRAINT_NAME from user_constraints where TABLE_NAME='EMP';

select CONSTRAINT_NAME from user_constraints where TABLE_NAME='DEPT'

2. 导出导入用户

导出scott和hr:

[oracle@nylg ~]$ expdp system/a directory=dump_dir dumpfile=schema%U.dmp schemas=scott,hr job_name=schema

删除scott:

SQL> drop user scott cascade;

再将scott导入:

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp schemas=scott job_name=schema

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select * from tab;

将scott改名为s导入到数据库:

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=scott:s schemas=scott job_name=schema

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user s identified by s;

SQL> conn s/s
SQL> select * from tab;

3. 导出全库:

导出全库:

expdp system/a directory=dump_dir dumpfile=full%U.dmp full=y job_name=full parallel=4

4. 数据泵的高级用法

(1)通过指定filesize参数,从而控制导出文件的大小

expdp system/a full=y job_name=full parallel=4 dumpfile=dump_dir:full1%U.dmp,test_dir:full2%U.dmp filesize=20M

表示在两个目录下循环生成多个20M的文件

(2) 过滤某些表

vi /u01/exp.par

exclude=table:"like 'EMPLOYEES%'"
schemas=hr
保存退出

先看一下hr中的表:

[oracle@nylg dir]$ sqlplus hr/hr

SQL> select * from tab;

使用参数文件/u01/exp.par导出hr用户,排除EMPLOYEES表:

expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上的日志中可以看出EMPLOYEES没有导出

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=tab01.dmp remap_schema=hr:test job_name=imp

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user test identified by oracle;

SQL> conn test/oracle
SQL> select * from tab;

通过将导出hr用户数据导入到数据库用户test中可以看出没有EMPLOYEES表

可以使用in进行排除表:

vi /u01/exp.par

exclude=table:"in('EMPLOYEES','DEPARTMENTS')"
schemas=hr

[oracle@nylg dir]$ expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上的日志中可以看出EMPLOYEES和DEPARTMENTS都没有导出

(3)只导出指定类型的对象(比如只导出存储过程等)

使用此选项必须使用参数文件:

vi /u01/exp.par

include=function
include=procedure
include=package
include=view:"like 'PRODUCT%'"
schemas=hr,oe

expdp system/a directory=dump_dir dumpfile=tab%U.dmp job_name=exp parfile=/u01/exp.par

从以上日志中可以看出没有表

(4)只导出数据不导表定义:

通过content控制导出那些数据

metadata_only:只导出对象的定义信息

data_only:只导出表里实际的数据

all:导出对象的定义信息以及实际的数据,这是默认的导出方式。

例如:只导出hr下的对象定义信息:

expdp system/a directory=dump_dir dumpfile=schema%U.dmp schemas=hr content=metadata_only

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=hr:test

[oracle@nylg dir]$ sqlplus / as sysdba

SQL> alter user test identified by a;

SQL> conn test/a
SQL> select * from tab;

SQL> select count(*) from EMPLOYEES;

发现没有数据

SQL> conn hr/hr
SQL> select count(*) from EMPLOYEES

(5)只导出符合条件的数据行

必须用参数文件来完成

vi /u01/exp.par

tables=employees
query=employees:"where department_id=40 order by employee_id"

执行导出:

expdp hr/hr directory=dump_dir dumpfile=emp%U.dmp parfile=/u01/exp.par

将employees表导入到scott中进行验证:

impdp system/a directory=dump_dir dumpfile=emp01.dmp remap_schema=hr:scott

sqlplus scott/tiger
select * from employees;
只有40号部门的数据

conn hr/hr
select * from employees;
原表中有107行

(6)对数据库中的数据采样后,导出采样后的数据,可以用作测试数据:

expdp hr/hr directory=dump_dir dumpfile=schema%U.dmp schemas=hr sample=30

[oracle@nylg dir]$ impdp system/a directory=dump_dir dumpfile=schema01.dmp remap_schema=hr:scott

[oracle@nylg dir]$ sqlplus scott/tiger

SQL> select count(*) from employees;

SQL> conn hr/hr
SQL> select count(*) from employees

SQL> select 33/107 from dual;

(7)中断导出任务后,从中断处继续执行导出任务

在使用数据泵导出数据的时候,可以主动的或由于异常而中断任务

实验:

expdp system/a directory=dump_dir dumpfile=full%U.dmp full=y job_name=full

Export> stop_job
Are you sure you wish to stop this job ([yes]/no): yes

主动中断:ctrl+c

重启导出任务:

expdp system/a attach=full

Export> parallel=2

设置完成后,重新启动导出任务

Export> start_job

start_job开始后,在后台运行,可以调到前台来运行:

Export> continue_client

(8)分布式网络导出导入:

实验:将linux下scott用户导入到windows下

把linux下的scott用户导到window下的u1
u1可以不存在
步骤:

1.在window端:

conn system/a
create database link hndx connect to scott identified by tiger using 'orcl';

2.在window端写参数文件:

network_link=hndx
remap_schema = scott:u1
remap_tablespace = users:example
schemas=scott
job_name = cross_network

3.在linux下给scott受权限

grant exp_full_database to scott;
grant imp_full_database to scott;

4.在window端执行导入:

impdp system/a parfile=c:\imp.txt

外部表

1. 外部表的定义:

表在数据库中是以段存在的,而外部表不是以段存在的,外部表作为数据字典中定义的对象存在
数据存储在操作系统文件里,可以像查询其他表一样查询外部表不能对外部表执行DML操作

2. 外部表的类型:

有两种:一种是sql_load,一种是datapump

3. 创建一个sql_loader的外部表:

生成外部表的数据文件:

[oracle@nylg ~]$ sqlplus scott/tiger

SQL> set trims on
SQL> spool /u01/dir/dept.load
SQL> desc dept

SQL> select DEPTNO||','||
DNAME||','||
LOC from dept;

SQL> spool off
SQL> exit

创建外部表:

create table test_ext
(
deptno number(2),
dname varchar2(14),
loc varchar2(13)
)
organization external
(
type oracle_loader
default directory dump_dir
access parameters
(
records delimited by newline
badfile 'test.bad'
discardfile 'test.dis'
logfile 'test.log'
fields terminated by ','
missing field values are null
)
location ('dept.load')
);

访问外部表:

select * from test_ext;

sql_loader外部表可以通过sql*load来生成创建语法:

控制文件的内容如下:

load data
infile '/u01/emp.txt'
badfile '/u01/bad.emp'
discardfile '/u01/discadr.emp'
insert
into table emp
fields terminated by ','
trailing nullcols
(EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO)

生成外部表的创建语句:

sqlldr userid=scott/tiger control=/u01/load.ctl external_table=generate_only

vi load.log内容如下:

将以上语句的表名,目录名还有文件名改为我们想要的,然后执行此语句,就可以得到我们想要的外部表

4. 创建一个datapump类型的外部表:

生成文件:

SQL> create table test_ext
(
deptno,
dname
)
organization external(
type oracle_datapump
default directory dump_dir
location('load.test')
)
as select deptno,dname from dept;

以上语句执行完后,就生成了一个文件:load.test

进入hr用户创建一个外部表,数据文件使用以上生成的load.test

SQL> conn hr/hr
Connected.
SQL> create table test_ext
(
deptno NUMBER(2),
dname VARCHAR2(14)
)
organization external(
type oracle_datapump
default directory dump_dir
location('load.test')
)

SQL> select * from test_ext;

OCA读书笔记(17) - 移动数据的更多相关文章

  1. OCA读书笔记(9) - 管理数据同步

    9.Managing Data Concurrency 描述锁机制以及oracle如何管理数据一致性监控和解决锁冲突 管理数据的并发--管理锁数据的不一致:脏读更改丢失幻影读 脏读:数据是指事务T2修 ...

  2. 进入保护模式(三)——《x86汇编语言:从实模式到保护模式》读书笔记17

    (十)保护模式下的栈 ;以下用简单的示例来帮助阐述32位保护模式下的堆栈操作 mov cx,00000000000_11_000B ;加载堆栈段选择子 mov ss,cx mov esp,0x7c00 ...

  3. OCA读书笔记(10) - 管理UNDO数据

    Undo自动管理与手动管理 undo段自动管理SQL> show parameter undo_management 将undo段改为手工管理SQL> alter system set u ...

  4. 《利用python进行数据分析》读书笔记--第九章 数据聚合与分组运算(一)

    http://www.cnblogs.com/batteryhp/p/5046450.html 对数据进行分组并对各组应用一个函数,是数据分析的重要环节.数据准备好之后,通常的任务就是计算分组统计或生 ...

  5. OCA读书笔记(12) - 数据库维护

    查询优化器统计信息 搜集统计信息: 不是实时的: SQL> conn /as sysdbaConnected.SQL> grant select on dba_objects to sco ...

  6. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  7. OCA读书笔记(2) - 安装Oracle软件

    Objectives: •Describe your role as a database administrator (DBA) and explain typical tasks and tool ...

  8. OCA读书笔记(1) - 浏览Oracle数据库架构

    Objectives: List the major architectural components of Oracle DatabaseExplain the memory structuresD ...

  9. OCA读书笔记(5) - 管理ASM实例

    Objectives:Describe the benefits of using ASMManage the ASM instanceCreate and drop ASM disk groupsE ...

随机推荐

  1. NET 2016

    .NET 2016   阅读目录 初识 .NET 2016 使用 .NET Framework 4.6 编译应用程序 使用 .NET Core CLI 编译应用程序 小结 厚积薄发这个词是高三英语老师 ...

  2. TNetHttpClient支持异步访问(Delphi 10.1 Berlin,红鱼儿的博客)

    Delphi 10.1进一步改进自Delphi 10带来的Http访问控件TNetHttpClient,支持异步访问,同时增加ConnectionTimeout及ResponseTimeout两个超时 ...

  3. 不用SWIG,Go使用C++代码的方式

    将C++代码用C作一次封装,就可以让Go调用了. 这是一个C++头文件: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #ifndef CGO_CPPGO_C ...

  4. Properties文件及与之相关的System.getProperties操作(转)

    如何使用Java读写系统属性? 读: 简述properties文件的结构和基本用法结构:扩展名为properties的文件,内容为key.value的映射,例如"a=2" 示例用到 ...

  5. boost.xml_parser中文字符问题

    当使用xml_parser进行读xml时,如果遇到中文字符会出现解析错误. 网上有解决方案说使用wptree来实现,但当使用wptree来写xml时也会出错.而使用ptree来写中文时不会出错. 综合 ...

  6. boost 轻量级信号量

    #include <boost/thread/condition_variable.hpp> #include <boost/thread/mutex.hpp>     #in ...

  7. 【linux】开发环境说明

    欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http:// ...

  8. (摘录)MSMQ的简单介绍

    MSMQ(MicroSoft  Message  Queue,微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

  9. 三篇IMO的文章

    http://column.iresearch.cn/b/201411/687499.shtml?from=singlemessage&isappinstalled=1 http://colu ...

  10. “add measurements”(添加度量)菜单问题