如何导入django 已有数据库的外部数据库

如何导入已有的外部数据库
我们平时见到的android数据库操作一般都是在程序开始时创建一个空的数据库,然后再进行相关操作。如果我们需要使用一个已有数据的数据库怎么办呢?
我们都知道android系统下数据库应该存放在 /data/data/com.*.*(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录。
操作方法:1. 把原数据库包括在项目源码的 res/raw 目录下,然后建立一个DBManager类,代码如下:
view plain
package com.android.ImportD&
import java.io.F&
import java.io.FileNotFoundE&
import java.io.FileOutputS&
import java.io.IOE&
import java.io.InputS&
import android.content.C&
import android.database.sqlite.SQLiteD&
import android.os.E&
import android.util.L&
public class DBManager {&
&&& private final int BUFFER_SIZE = 400000;&
&&& public static final String DB_NAME = &countries.db&; //保存的数据库文件名&
&&& public static final String PACKAGE_NAME = &com.android.ImportDatabase&;&
&&& public static final String DB_PATH = &/data&&
&&&&&&&&&&& + Environment.getDataDirectory().getAbsolutePath() + &/&&
&&&&&&&&&&& + PACKAGE_NAME;& //在手机里存放数据库的位置&
&&& private SQLiteD&
&&& private C&
&&& DBManager(Context context) {&
&&&&&&& this.context =&
&&& public void openDatabase() {&
&&&&&&& this.database = this.openDatabase(DB_PATH + &/& + DB_NAME);&
&&& private SQLiteDatabase openDatabase(String dbfile) {&
&&&&&&& try {&
&&&&&&&&&&& if (!(new File(dbfile).exists())) {  //判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库&
&&&&&&&&&&&&&&& InputStream is = this.context.getResources().openRawResource(&
&&&&&&&&&&&&&&&&&&&&&&& R.raw.countries); //欲导入的数据库&
&&&&&&&&&&&&&&& FileOutputStream fos = new FileOutputStream(dbfile);&
&&&&&&&&&&&&&&& byte[] buffer = new byte[BUFFER_SIZE];&
&&&&&&&&&&&&&&& int count = 0;&
&&&&&&&&&&&&&&& while ((count = is.read(buffer)) & 0) {&
&&&&&&&&&&&&&&&&&&& fos.write(buffer, 0, count);&
&&&&&&&&&&&&&&& }&
&&&&&&&&&&&&&&& fos.close();&
&&&&&&&&&&&&&&& is.close();&
&&&&&&&&&&& }&
&&&&&&&&&&& SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbfile,&
&&&&&&&&&&&&&&&&&&& null);&
&&&&&&&&&&&&
&&&&&&& } catch (FileNotFoundException e) {&
&&&&&&&&&&& Log.e(&Database&, &File not found&);&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& } catch (IOException e) {&
&&&&& &&&&&&Log.e(&Database&, &IO exception&);&
&&&&&&&&&&& e.printStackTrace();&
&&&&&&& }&
然后在程序的首个Activity中示例化一个DBManager对象,然后对其执行openDatabase方法就可以完成导入了,可以把一些要对数据库进行的操作写在DBManager类里,然后通过DBManager类的对象调用;也可以在完成导入之后通过一个SQliteDatabase类的对象打开数据库,并执行操作。
我的做法是 在程序的首个Activity中导入数据库:
view plain
package com.android.ImportD&
import android.app.A&
import android.content.I&
import android.os.B&
public class RootView extends Activity {&
&&& public DBManager dbH&
&&& @Override&
&&& public void onCreate(Bundle savedInstanceState) {&
&&&&&&& super.onCreate(savedInstanceState);&
&&&&&&& setContentView(R.layout.main);&
&&&&&&& dbHelper = new DBManager(this);&
&&&&&&& dbHelper.openDatabase();&
&&&&&&& dbHelper.closeDatabase();&
此时在DDMS中可以查看到,外部数据库已经成功导入
在需要使用数据库的类里:
package com.android.ImportD&
import java.util.ArrayL&
import android.app.A&
import android.database.C&
import android.database.sqlite.SQLiteD&
import android.os.B&
public class TaxiActivity extends Activity {&
&&& private SQLiteD&
&&&&&&& ArrayList&CityClass& CITY;&
&&& @Override&
&&& public void onCreate(Bundle savedInstanceState) {&
&&&&&&& super.onCreate(savedInstanceState);&
&&&&& &&setContentView(R.layout.main);&
&&&&&&& database = SQLiteDatabase.openOrCreateDatabase(DBManager.DB_PATH + &/& + DBManager.DB_NAME, null);&
&&&&&&& CITY = getCity();&
&&&&&&& // do something with CITY&
&&&&&&& database.close();&
&&& private ArrayList&CityClass& getCity() {&
&&&&&&& Cursor cur = database.rawQuery(&SELECT city.id_city, city.name FROM taxi, city WHERE city.id_city = taxi.id_city GROUP BY city.id_city&, null);&
&&&&&&& if (cur != null) {&
&&&&&&&&&&& int NUM_CITY = cur.getCount();&
&&&&&&&&&&& ArrayList&CityClass& taxicity = new ArrayList&CityClass&(NUM_CITY);&
&&&&&&&&&&& if (cur.moveToFirst()) {&
&&&&&&&&&&&&&&& do {&
&&&&&&&&&&&&&&&&&&& String name = cur.getString(cur.getColumnIndex(&name&));&
&&&&&&&&&&&&&&&&&&& int id = cur.getInt(cur.getColumnIndex(&id_city&));&
&&&&&&&&&&&&&&&&&&& CityClass city = new CityClass(&&, 0);&
&&&&&&&&&&&&&&&&&&& System.out.println(name);& //额外添加一句,把select到的信息输出到Logcat&
&&&&&&&&&&&&&&&&&&& city.city_name =&
&&&&&&&&&&&&&&&&&&& city.city_id =&
&&&&&&&&&&&&&&&&&&& taxicity.add(city);&
&&&&&&&&&&&&&&& } while (cur.moveToNext());&
&&&&&&&&&&& }&
&&&&&&&&&&&&
&&&&&&& } else {&
&&&&&&&&&&&&
&&&&&&& }&
查看输出的结果:
摘自 wenyizhenglove的专栏
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'如何将备份数据库.bak导入到新的空数据库或已有数据中?做笔记 分享给大家希望有帮助
1、首先,在“SQL企业管理器”中新建一个临时数据库A1。   2、右击A1数据库,选择:所有任务-&还原数据库。   3、在“还原数据库”窗口中,选择:“从设备”。   4、点击“选
1、首先,在“SQL企业管理器”中新建一个临时数据库A1。   2、右击A1数据库,选择:所有任务-&还原数据库。   3、在“还原数据库”窗口中,选择:“从设备”。   4、点击“选择设备”。   5、点击“添加”。   6、从文件名中选择要还原的数据库文件,如A1.BAK。   7、点击“确定”,返回“还原数据库”窗口。   8、点击“选项”卡,进入选项设置。   9、钩选:“在现有数据库上强制还原”。   10、修改“移到物理文件名”为:“c:\a1.ldf”、“c:\a1.mdf”。   11、点确定,即可导入备份文件中的数据到临时数据库A1中。   12、此时,你可以将数据从A1导入到另外一真正要导入的数据库中博客访问: 130428
博文数量: 21
博客积分: 307
博客等级: 入伍新兵
技术积分: 818
注册时间:
oracle数据库DBA
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Oracle
今天公司需要把外部文本的一些数据导入到数据库。这里把相关步骤和注意的地方记录,供需要的人参考学习!这里的环境是在windows下的数据库,linux或者其他数据库同理!
1、准备工作:创建需要导入数据的表结构,如果已有相关的表,此步省略!
SQL> create table test
& 3&&& host&&&&&&&&& VARCHAR2(30),
& 4&&& user_name VARCHAR2(30),
& 5&&& ip_address&&&&& VARCHAR2(15),
& 6&&& pass&&&&&&&&&&& VARCHAR2(4) default 'no' not null,
& 7&&& judge&&&&&&&&&& NUMBER default 0 not null,
& 8&&& endtime&&&&&&&& DATE
表已创建。
2、编写sqlload导入数据的控制文件,这里测试的控制文件如下,可以根据自己需要添加相关的控制参数,测试的话复制保存为txt文件即可!
INFILE 'd:\data.txt'
INTO TABLE test
fields terminated by ','
trailing nullcols
(HOST,USER_NAME,IP_AddrESS,PASS,JUDge,endTIME)
控制文件还有其他参数,根据自己需求调整和测试:
附部分控制参数:具体用法以官方文档为准
OPTIONS (skip=1,rows=128)&& -- sqlldr 命令显示的选项可以写到这里边来,skip=1 用来跳过数据中的第一行
INFILE "users_data.csv"&&&& --指定外部数据文件,可以是不同格式的数据文件,如csv、txt都支持
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 可以写多个 INFILE "another_data_file.csv" 指定多个数据文件
truncate&&&&&&&&&&&&&&&&&&&&&&&&& --操作类型,用 truncate table 来清除表中原有记录,根据情况而定是否需要清楚原有表中数据
INTO TABLE users&&&&&&&&&&&& --要插入记录的表
Fields terminated by ","&&&&& --数据中每行记录用 "," 分隔
Optionally enclosed by '"'&&& --数据中每个字段用 '"' 框起,比如字段中有 "," 分隔符时
trailing nullcols&&&&&&&&&&&&&&&&& &--表的字段没有对应的值时允许为空
& virtual_column FILLER,&&& --这是一个虚拟字段,用来跳过由 PL/SQL Developer 生成的第一列序号
& user_id number,&&&&&&&&&& --字段可以指定类型,否则认为是 CHARACTER 类型, log 文件中有显示
& user_name,
& login_times,
& last_login DATE "YYYY-MM-DD HH24:MI:SS" -- 指定接受日期的格式,相当用 to_date() 函数转换
insert&&&& --为缺省方式,在数据装载开始时要求表为空
append& --在表中追加新记录
replace& --删除旧记录(用 delete from table 语句),替换成新装载的记录
truncate --删除旧记录(用 truncate table 语句),替换成新装载的记录
3、创建需要导入的数据,注意数据格式必须和表结构严格对应,否则导入失败!测试数据如下:有部分数据最后字段为空,所以控制文件中需要加trailing nullcols&参数!
ttt,SCOTT,192.168.1.111,yes,1,
qq,JACK,192.168.1.20,no,1,
YY,TOM,192.168.1.20,no,1,
WEB1,HAHA,192.168.1.1,no,1,
XXX,ROBIN,111.111.111.111,no,1,08-AUG-08
DB2,LUCY,192.168.10.10,no,1,
ORACLE,LILY,222.222.222.222,no,1,
WORKGROUP,DENNIS,133.133.133.133,no,0,08-AUG-08
DCR,CANDY,192.168.100.10,no,1,
T3,FLY,192.168.10.33,no,1,
T1,LINDA,192.168.10.200,no,1,08-AUG-08
T2,LILEI,192.168.100.31,no,1,08-AUG-08
4、导入数据-导入时也有相关的参数进行控制
附部分导入参数:各参数可以再命令行下输入sqlldr查看
C:\Documents and Settings\Administrator>sqlldr
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:13:24 2013
Copyright (c) , Oracle and/or its affiliates.& All rights reserved.
用法: SQLLDR keyword=value [,keyword=value,...]
有效的关键字:
&&& userid -- ORACLE 用户名/口令
&& control -- 控制文件名
&&&&&& log -- 日志文件名
&&&&&& bad -- 错误文件名
&&&&& data -- 数据文件名
&& discard -- 废弃文件名
discardmax -- 允许废弃的文件的数目&&&&&&&& (全部默认)
&&&&& skip -- 要跳过的逻辑记录的数目& (默认 0)
&&&&& load -- 要加载的逻辑记录的数目& (全部默认)
&&& errors -- 允许的错误的数目&&&&&&&& (默认 50)
&&&&& rows -- 常规路径绑定数组中或直接路径保存数据间的行数
&&&&&&&&&&&&&& (默认: 常规路径 64, 所有直接路径)
& bindsize -- 常规路径绑定数组的大小 (以字节计)& (默认 256000)
&&& silent -- 运行过程中隐藏消息 (标题,反馈,错误,废弃,分区)
&&& direct -- 使用直接路径&&&&&&&&&&&&&&&&&&&& (默认 FALSE)
&& parfile -- 参数文件: 包含参数说明的文件的名称
& parallel -- 执行并行加载&&&&&&&&&&&&&&&&&&& (默认 FALSE)
&&&&& file -- 要从以下对象中分配区的文件
skip_unusable_indexes -- 不允许/允许使用无用的索引或索引分区& (默认 FALSE)
skip_index_maintenance -- 没有维护索引, 将受到影响的索引标记为无用& (默认 FALSE)
commit_discontinued -- 提交加载中断时已加载的行& (默认 FALSE)
& readsize -- 读取缓冲区的大小&&&&&&&&&&&&&& (默认 1048576)
external_table -- 使用外部表进行加载; NOT_USED, GENERATE_ONLY, EXECUTE& (默认 NO
columnarrayrows -- 直接路径列数组的行数& (默认 5000)
streamsize -- 直接路径流缓冲区的大小 (以字节计)& (默认 256000)
multithreading -- 在直接路径中使用多线程
&resumable -- 启用或禁用当前的可恢复会话& (默认 FALSE)
resumable_name -- 有助于标识可恢复语句的文本字符串
resumable_timeout -- RESUMABLE 的等待时间 (以秒计)& (默认 7200)
date_cache -- 日期转换高速缓存的大小 (以条目计)& (默认 1000)
no_index_errors -- 出现任何索引错误时中止加载& (默认 FALSE)
如下命令:control=指定控制文件和路径& log=导入日志文件保存& bad=错误信息& data=数据文件
开始导入:
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txt
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:06:52 2013
Copyright (c) , Oracle and/or its affiliates.& All rights reserved.
达到提交点 - 逻辑记录计数 12
导入成功后查看结果:
C:\Documents and Settings\Administrator>sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:07:05 2013
Copyright (c) , Oracle.& All rights reserved.
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select *
HOST&&&&&& USER_NAME& IP_ADDRESS&&&&&&&&&&&&&&&&&&&& PASS&&&&&&&&& JUDGE ENDTIME
----------&&&&& ----------&&&&& ------------------------------&&&&&&&& --------&&&&&&&&&& ---------- --------------
ttt&&&&&&&&&&&& SCOTT&&&&& 192.168.1.111&&&&&&&&&&&&&&&&& yes&&&&&&&&&&&&&& 1
qq&&&&&&&&&&&& JACK&&&&&&&& 192.168.1.20&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
YY&&&&&&&&&&& TOM&&&&&&&&& 192.168.1.20&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
WEB1&&&&&&&&HAHA&&&&&&&&192.168.1.1&&&&&&&&&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1
DB2&&&&&&&&&& LUCY&&&&&&&&&192.168.10.10&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
ORACLE&&&& LILY&&&&&&&&&& 222.222.222.222&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1
DCR&&&&&&&&& CANDY&&&&&& 192.168.100.10&&&&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1
T3&&&&&&&&&&& FLY&&&&&&&&&& 192.168.10.33&&&&&&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1
已选择8行。
结果显然与数据文件不一致,最后一个字段有值的数据没有导入!这不是最后想要的结果!但可以确定已经有数据导入,表示表对象和控制文件没问题!
应该是数据文件的格式问题!注意数据文件最后一个字段是日期型数据。查看是不是数据库现有日期类型不支持数据文件的表示格式
SQL> select sysdate from dual;
--------------
27-2月 -13
显然和我们数据文件的日期显示不一致,且是中文,这里可以把数据文件的最后字段的数据改成和数据库一样的格式,也可以对数据库的格式和语言进行更改,
因为测试系统是windows才会出现这个错误,在linux可以避免!
如果是linux& 可以尝试以下步骤解决:
alter system set nls_date_format='DD-MON-RR';
alter system set nls_language= american scope =------------得重启数据库
这里由于是windows,这里就不更改语言和重启数据库,直接对数据文件进行更改,修改后的数据文件如下
ttt,SCOTT,192.168.1.111,yes,1,
qq,JACK,192.168.1.20,no,1,
YY,TOM,192.168.1.20,no,1,
WEB1,HAHA,192.168.1.1,no,1,
XXX,ROBIN,111.111.111.111,no,1,08-5月 -08
DB2,LUCY,192.168.10.10,no,1,
ORACLE,LILY,222.222.222.222,no,1,
WORKGROUP,DENNIS,133.133.133.133,no,0,08-5月 -08
DCR,CANDY,192.168.100.10,no,1,
T3,FLY,192.168.10.33,no,1,
T1,LINDA,192.168.10.200,no,1,08-5月 -08
T2,LILEI,192.168.100.31,no,1,08-5月 -08
再导入一次,导入后进行查看结果
C:\Documents and Settings\Administrator>sqlldr scott/tiger control=d:\sqlload.txt log=d:\loadlog.txt bad=d:\bad.txt data=d:\data.txt
SQL*Loader: Release 11.2.0.1.0 - Production on 星期三 2月 27 17:48:44 2013
Copyright (c) , Oracle and/or its affiliates.& All rights reserved.
达到提交点 - 逻辑记录计数 12
C:\Documents and Settings\Administrator>sqlplus scott/tiger
SQL*Plus: Release 11.2.0.1.0 Production on 星期三 2月 27 17:49:21 2013
Copyright (c) , Oracle.& All rights reserved.
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> col host for a10
SQL> col user_name for a15
SQL> select *
HOST&&&&&&&&&& USER_NAME&&&&&& IP_ADDRESS&&&&&&&&&&&&&&&&&&&& PASS&&&&&&&&& JUDGE ENDTIME
----------&&&&&&& --------------- ------------------------------&&&&&&&&&&&&&&& --------&&&&&&&& ---------- --------------
ttt&&&&&&&&&&&&&& SCOTT&&&&&&&&&& 192.168.1.111&&&&&&&&&&&&&&&&&&&&& yes&&&&&&&&&&&&&& 1
qq&&&&&&&&&&&&&& JACK&&&&&&&&&&& 192.168.1.20&&&&&&&&&&&&&&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1
YY&&&&&&&&&&&&& TOM&&&&&&&&&&&& 192.168.1.20&&&&&&&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
WEB1&&&&&&&&& HAHA&&&&&&&&&&& 192.168.1.1&&&&&&&&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
XXX&&&&&&&&&&&&&ROBIN&&&&&&&&&& 111.111.111.111&&&&&&&&&&&&&&&&&&&&no&&&&&&&&&&&&&&& 1 08-5月 -08
DB2&&&&&&&&&&&& LUCY&&&&&&&&&&& 192.168.10.10&&&&&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
ORACLE&&&&&& LILY&&&&&&&&&&& 222.222.222.222&&&&&&&&&&&&&&&&&&&& &no&&&&&&&&&&&&&&& 1
WORKGROUP& DENNIS&&&&&&&&& 133.133.133.133&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 0 08-5月 -08
DCR&&&&&&&&&&& CANDY&&&&&&&&&& 192.168.100.10&&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1
T3&&&&&&&&&&&&& FLY&&&&&&&&&&&& 192.168.10.33&&&&&&&&&&&&&&&&&&&&&&& &no&&&&&&&&&&&&&&& 1
T1&&&&&&&&&&& &LINDA&&&&&&&&&& 192.168.10.200&&&&&&&&&&&&&&&&&&&&& &no&&&&&&&&&&&&&&& 1 08-5月 -08
T2&&&&&&&&&&&& LILEI&&&&&&&&&& 192.168.100.31&&&&&&&&&&&&&&&&&&&&&&&& no&&&&&&&&&&&&&&& 1 08-5月 -08
已选择12行。
恢复正常:数据和数据文件完全一样!到此整个数据导入完成!主要注意的地方还是数据文件的建立,确认分隔以及和表的结构对应!欢迎指正学习!
阅读(7390) | 评论(1) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
嘉宾点评:&在我的工作中也经常用到SQLLOAD工具,这里作者采用了一个实例演示如何使用oracle提供的数据库加载工具SQLLOAD将文本文件加载到数据表中,在导入过程中,博主特别提到了时间格式的问题(这个对初学者可能会忽略,导致时间数据无法导读).总的来说,文章井井有条,通俗易懂,希望博主再接再励.(以上是邀请嘉宾的点评,感谢您参与“原创博文评选”获奖结果即将公布)
请登录后评论。如何利用Oracle外部表导入文本文件的数据_数据库技术_Linux公社-Linux系统门户网站
你好,游客
如何利用Oracle外部表导入文本文件的数据
来源:Linux社区&
作者:ivictor
同事最近在忙数据一致性比对工作,需要对不同文本文件中的数据进行比对,有的文件较大,记录较多,如果用普通的文本编辑器打开的话,很显然,会很卡,甚至打不开。
基于此,可将该文本文件的数据导入到数据库中,在集合的层面进行比对。
那么如何将文本文件的数据导入到数据库中呢?在这里,主要利用了的外部表特性。
Oracle外部表支持两种类型的驱动:一种是ORACLE_LOADER,外部表的数据必须来源于文件文件,另一种则是ORACLE_DATAPUMP,外部表的数据必须是二进制dump文件,该dump文件是先前将Oracle内部表的数据导入到外部表中填充的文件。很显然,Oracle希望将数据保留在数据库内部进行处理。
首先,我们来看一下该文本文件的大小及记录。
[oracle@node2 ~]$ du -sm P_00_2002371.
P_00_2002371.
[oracle@node2 ~]$ wc -l P_00_2002371.
2899265 P_00_2002371.
从上面的输出可以看出,该文件274M,有2899265条记录。
其次,构建创建外部表语句。
CREATE TABLE emp_load
(subsid number(18),
servnumber VARCHAR2(20 CHAR),
subsprodid NUMBER(18),
prodid VARCHAR2(32 CHAR),
startdate date,
owner VARCHAR2(4 CHAR))
ORGANIZATION EXTERNAL
(TYPE ORACLE_LOADER
DEFAULT DIRECTORY tmp
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
FIELDS TERMINATED BY "|"
DECIMAL EXTERNAL,
servnumber
subsprodid
DECIMAL EXTERNAL,
startdate date "yyyymmddhh24miss",
enddate date "yyyymmddhh24miss",
LOCATION ('P_00_3479598')
注意,目录tmp必须存在,因为我是在scott用户下执行的,所以scott用户必须对该路径有读写权限。
第三、在scott用户下执行该建表语句。
第四、查看生成的外部表是否有问题
SQL& select count(*) from emp_
------------------
记录与wc-l查看的记录数吻合。
注意,建表过程中没有报错并不一定意味着数据已经成功加载在外部表中。必须通过查询外部表来判定数据是否已成功加载,倘若有错误提示,可参看当前目录下生成的日志文件,具体在本例中,是EMP_LOAD_2000.bad和EMP_LOAD_2000.log。
当然,外部表中的数据只能查询,不能做DML操作,譬如,随机删除表中的一条数据
SQL& delete from emp_load where rownum=1;
delete from emp_load where rownum=1
ERROR at line 1:
ORA-30657: operation not supported on external organized table
如果想对该外部表数据进行DML操作,可先将外部表的数据导入到内部表中。具体步骤如下:
SQL& create table test as select * from emp_load where 1=0;
Table created.
SQL& INSERT /*+ APPEND */ INTO test select * from emp_
2899265 rows created.
Elapsed: 00:01:00.29
SQL& select * from test where rownum&=100;
select * from test where rownum&=100
ERROR at line 1:
ORA-12838: cannot read/modify an object after modifying it in parallel
SQL& commit;
Commit complete.
SQL& select * from test where rownum&=100;
在这里,为了节省时间,我用了直接路径插入,可以看出,插入近300万数据,只用了1分左右的时间,考虑到我虚拟机上的数据库,只给它分配了300M的内存,加载的效率还是相当可观的。
SQL& show parameter memory
------------------------------------ ----------- ------------------------------
hi_shared_memory_address
memory_max_target
big integer 300M
memory_target
big integer 300M
shared_memory_address
后来,测试了一下传统路径插入所消耗的时间,为了和直接路径插入进行比较,剔除SQL解析,data buffer等因素的影响,清空了共享池和buffer cache,具体如下:
SQL& conn /as sysdba
Connected.
SQL& alter system flush shared_
System altered.
SQL& alter system flush buffer_
System altered.
SQL& conn scott/tiger
Connected.
SQL& set timing on
SQL& insert into test select * from emp_
2899265 rows created.
Elapsed: 00:01:05.36
用传统路径插入(即会产生redo日志),耗时1分5秒,相对于直接路径插入,两者效率相差不大,看来还是数据量较小,不能明显的体现直接路径插入速度上的优势。
注意:在SQL*PLUS中,number字段的输出默认为10,这样会导致对于250300这样的数值,可能会显示为9.3712E+17,在这里,可通过set numwidth 18来显示完整的number字段的值。
更多Oracle相关信息见 专题页面
本文永久更新链接地址:
相关资讯 & & &
& (12/24/:37)
& (08/12/:41)
& (08/31/:48)
& (03/02/:40)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 oracle已有添加数据库 的文章

 

随机推荐