oracle 外部表
expdp access_method
expdp access_methodexpdp是Oracle数据库中的一个工具,用于将数据库中的数据以二进制格式导出。
在expdp命令中,access_method参数用于指定数据导出的方式。
本文将重点介绍expdp access_method的相关内容。
在Oracle数据库中,expdp access_method参数有两个可选值:direct path和external table。
下面将详细介绍这两种方式的特点和适用场景。
1. 直接路径导出(direct path)直接路径导出是一种快速导出数据的方式。
在这种方式下,expdp 会绕过Oracle数据库的buffer cache,直接读取磁盘上的数据文件,并将数据以二进制格式导出。
这种方式的优点是导出速度快,适用于大规模数据的导出。
但是,由于绕过了buffer cache,所以在导出过程中对数据库的访问会增加磁盘I/O负载。
直接路径导出的语法如下:expdp username/password@connect_string directory=directory_name dumpfile=dumpfile_name access_method=direct2. 外部表导出(external table)外部表导出是一种将数据导出到外部表的方式。
在这种方式下,expdp会创建一个外部表,然后将数据插入到外部表中,最后将外部表的数据导出。
这种方式的优点是可以将数据以文本格式导出,便于人工查看和处理。
同时,外部表导出的过程中不会增加磁盘I/O负载。
但是,由于需要创建外部表,所以在导出大规模数据时可能会占用较多的内存和磁盘空间。
外部表导出的语法如下:expdp username/password@connect_string directory=directory_name dumpfile=dumpfile_name access_method=external_table需要注意的是,外部表导出需要事先创建外部表的定义。
oracle读取文件方法
Oracle读取文件方法及应用实践正文内容:引言:在Oracle数据库中,读取外部文件是一项常见的任务。
无论是读取文本文件、CSV文件、XML文件还是其他格式的文件,Oracle提供了多种方法来实现这个功能。
本文将介绍一些常用的Oracle读取文件的方法,并结合实际案例来说明其应用。
一、使用UTL_FILE包读取文本文件UTL_FILE包是Oracle提供的一个标准包,可以用于读取和写入文本文件。
它提供了多个过程和函数,可以实现对指定目录下的文件进行读取、写入、定位等操作。
下面是一个使用UTL_FILE包读取文本文件的示例:DECLAREfile_handle UTL_FILE.FILE_TYPE;file_line VARCHAR2(255);BEGIN-- 打开文件file_handle := UTL_FILE.FOPEN('DATA_DIR', 'example.txt', 'R');-- 逐行读取文件内容LOOPUTL_FILE.GET_LINE(file_handle, file_line);-- 处理文件内容DBMS_OUTPUT.PUT_LINE(file_line);END LOOP;-- 关闭文件UTL_FILE.FCLOSE(file_handle);EXCEPTIONWHEN UTL_FILE.INVALID_DIRECTORY THENDBMS_OUTPUT.PUT_LINE('无效的目录');WHEN UTL_FILE.INVALID_OPERATION THENDBMS_OUTPUT.PUT_LINE('无效的操作');WHEN UTL_FILE.INVALID_FILEHANDLE THENDBMS_OUTPUT.PUT_LINE('无效的文件句柄');END;二、使用外部表读取CSV文件除了使用UTL_FILE包读取文本文件外,还可以使用外部表来读取CSV文件。
oracle update left join用法
Oracle UPDATE LEFT JOIN 用法一、什么是 Oracle UPDATE LEFT JOIN在 Oracle 数据库中,UPDATE LEFT JOIN 是一种用于更新一张表中的数据,同时根据另一张表中的匹配条件进行连接的操作。
通过使用 UPDATE LEFT JOIN,我们可以根据两个表之间的关联关系,更新被连接表中符合条件的记录。
通常,在使用 UPDATE 语句时,只能更新一个表中的数据。
但是,在某些情况下,我们需要根据外部表的数据来更新主表,这时就需要使用到 LEFT JOIN。
二、UPDATE LEFT JOIN 语法格式下面是在 Oracle 数据库中使用 UPDATE LEFT JOIN 的语法格式:UPDATE table1SET column1 = value1, column2 = value2, ...FROM table1LEFT JOIN table2ON table1.column = table2.columnWHERE condition;在上述语法中:•table1是要进行更新操作的表;•column1, column2是要更新的列和对应的值;•table2是要连接的外部表;•table1.column和table2.column是用于连接两个表的列;•condition是 WHERE 子句用于过滤符合条件的记录。
三、Oracle UPDATE LEFT JOIN 示例假设我们有两张表,一张是employees表,另一张是departments表。
我们需要根据departments表中的数据来更新employees表中的department_id列。
步骤 1:创建示例表首先,我们需要创建并插入一些示例数据到employees和departments表中。
下面是创建表和插入数据的 SQL 语句:CREATE TABLE employees (employee_id NUMBER,first_name VARCHAR2(100),last_name VARCHAR2(100),department_id NUMBER);CREATE TABLE departments (department_id NUMBER,department_name VARCHAR2(100));INSERT INTO employees VALUES (1, 'John', 'Doe', NULL);INSERT INTO employees VALUES (2, 'Jane', 'Smith', NULL);INSERT INTO employees VALUES (3, 'Mike', 'Johnson', NULL);INSERT INTO departments VALUES (1, 'HR');INSERT INTO departments VALUES (2, 'Finance');INSERT INTO departments VALUES (3, 'Marketing');步骤 2:执行 UPDATE LEFT JOIN 操作下面是使用 UPDATE LEFT JOIN 语句来更新employees表的示例:UPDATE employeesSET department_id = departments.department_idFROM employeesLEFT JOIN departmentsON employees.employee_id = departments.department_id;上述语句将根据employees.employee_id和departments.department_id进行连接,并将符合条件的department_id数据更新到employees表中的相应记录。
oracle三种表连接方式
oracle三种表连接⽅式
1、排序合并连接(Sort Merge Join)
排序合并连接的执⾏过程如下所⽰:
* 将每个⾏源的⾏按连接谓词列排序
* 然后合并两个已排序的⾏源,并返回⽣成的⾏源
例如:
select * from employees d,departments t where d.department_id=t.department_id;
访问机制如下:访问departments表并排序department_id列,访问employees表并排序department_id列,然后依次交替⽐较、归并。
注意:排序合并连接⼀般⽤在两张表中没有索引,并且连接列已经排好序的情况下。
2、嵌套循环连接(Nested Loops Join)
* 两个表中的⼀个被定义为“外部表”(或“驱动表”)
* 另⼀个表被称为“内部表”
* 将针对外部表中的每⼀⾏检索内部表中所有匹配的⾏
注意:join的顺序很重要,⼀般选择⼩表作为“驱动表”,⼤表作为“内部表”。
如两个表,⼀个100⾏,⼀个10000⾏,理想的连接⽅式是:100⾏的⼩表作为“驱动表”,10000⾏的⼤表作为“内部表”,⽤⼩表中的每条记录去匹配⼤表中的记录。
如果两张表的连接词在⼤表中是索引列,则是最完美的。
3、哈希连接(Hash Join)
* 优化器对⼩表利⽤连接键在内存中建⽴hash表
* 扫描⼤表,每得到⼀条记录,就来hash表中“探测”⼀次,找出与hash表匹配的⾏
注意:Hash Join 是CBO做⼤数据集连接时的常⽤⽅式。
使用Oracle的外部表查询警告日志文件
使用Oracle的外部表查询警告日志文件从Oracle9i开始,Oracle的外部表技术(Oracle External Tables)被极大的增强,通过外部表访问外部数据增强了Oracle数据库和外部数据源进行数据交互的能力,对于数据仓库和ETL来说,这些增强极大的方便了数据访问。
对于DBA来说,最常见一个例子是可以使用外部表来访问警告日志文件或其他跟踪文件.以下一个例子用来说明外部表的用途。
首先需要创建一个Directory:[oracle@jumper oracle]$ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.4.0 - Production on Sun Oct 15 21:42:28 2006Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.4.0 - ProductionWith the Partitioning optionJServer Release 9.2.0.4.0 - ProductionSQL> create or replace directory bdump2 as '/opt/oracle/admin/eygle/bdump';Directory created.SQL> col DIRECTORY_PATH for a30SQL> col owner for a10SQL> select * from dba_directories;OWNER DIRECTORY_NAME DIRECTORY_PATH---------- ------------------------------ ------------------------------SYS BDUMP /opt/oracle/admin/eygle/bdump然后创建一个外部表:SQL> create table alert_log ( text varchar2(400) )2 organization external (3 type oracle_loader4 default directory BDUMP5 access parameters (6 records delimited by newline7 nobadfile8 nodiscardfile9 nologfile10 )11 location('alert_eygle.log')12 )13 reject limit unlimited14 /Table created.然后我们就可以通过外部表进行查询警告日志的内容:SQL> select * from alert_log where rownum < 51;TEXT----------------------------------------------------------------------------------------- Mon Jun 26 12:00:24 2006Starting ORACLE instance (normal)Mon Jun 26 12:00:25 2006WARNING: EINVAL creating segment of size 0x0000000008c00000 fix shm parameters in /etc/system or equivalentLICENSE_MAX_SESSION = 0LICENSE_SESSIONS_WARNING = 0SCN scheme 2Using log_archive_dest parameter default valueLICENSE_MAX_USERS = 0SYS auditing is disabledStarting up ORACLE RDBMS Version: 9.2.0.4.0.System parameters with non-default values:processes = 150timed_statistics = TRUEshared_pool_size = 104857600large_pool_size = 0java_pool_size = 0control_files = /opt/oracle/oradata/eygle/control01.ctldb_block_size = 8192db_cache_size = 16777216db_cache_advice = ONcompatible = 9.2.0.0.0db_file_multiblock_read_count= 16fast_start_mttr_target = 300log_checkpoints_to_alert = TRUEundo_management = AUTOundo_tablespace = UNDOTBS1undo_retention = 10800remote_login_passwordfile= EXCLUSIVEdb_domain =instance_name = eyglejob_queue_processes = 10hash_join_enabled = TRUEbackground_dump_dest = /opt/oracle/admin/eygle/bdumpuser_dump_dest = /opt/oracle/admin/eygle/udumpcore_dump_dest = /opt/oracle/admin/eygle/cdumpsort_area_size = 524288db_name = eygleopen_cursors = 500star_transformation_enabled= FALSEquery_rewrite_enabled = FALSEpga_aggregate_target = 52428800aq_tm_processes = 0PMON started with pid=2DBW0 started with pid=3LGWR started with pid=4CKPT started with pid=5SMON started with pid=6RECO started with pid=750 rows selected.SQL>如果我们需要查看数据库中曾经出现过的ORA-错误,那么可以执行如下查询: SQL> select * from alert_log where text like 'ORA-%';TEXT----------------------------------------------------------------------------------- ORA-1652: unable to extend temp segment by 128 in tablespace TEMP ORA-1113 signalled during: alter database open...ORA-1113 signalled during: alter database datafile 3 online...ORA-09968: scumnt: unable to lock fileORA-1102 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'TEXT----------------------------------------------------------------------------------- ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'TEXT----------------------------------------------------------------------------------- ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: alter database open...ORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-27037: unable to obtain file statusORA-01157: cannot identify/lock data file 4 - see DBWR trace fileORA-1113 signalled during: alter database open...ORA-1122 signalled during: alter database open...ORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-1122 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: ALTER DATABASE OPEN...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1122 signalled during: ALTER DATABASE OPEN...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01122: database file 1 failed verification checkTEXT-----------------------------------------------------------------------------------ORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-01207: file is more recent than controlfile - old controlfileORA-1122 signalled during: alter database open...ORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-1194 signalled during: alter database open resetlogs...ORA-283 signalled during: ALTER DATABASE RECOVER datafile 1 ...TEXT-----------------------------------------------------------------------------------ORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-1194 signalled during: alter database open resetlogs...ORA-283 signalled during: ALTER DATABASE RECOVER datafile 1 ...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1589 signalled during: ALTER DATABASE OPEN...ORA-01110: data file 4: '/opt/oracle/oradata/eygle/eygle01.dbf'TEXT-----------------------------------------------------------------------------------ORA-01115: IO error reading block from file 4 (block # 1)ORA-27069: skgfdisp: attempt to do I/O beyond the range of the fileORA-01194: file 1 needs more recovery to be consistentORA-01110: data file 1: '/opt/oracle/oradata/eygle/system01.dbf'ORA-1194 signalled during: alter database open resetlogs...ORA-1109 signalled during: alter database close...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1113 signalled during: alter database open...ORA-00202: controlfile: '/opt/oracle/oradata/eygle/control01.ctl'ORA-27037: unable to obtain file statusTEXT----------------------------------------------------------------------------------- ORA-205 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-01501: CREATE DATABASE failedORA-01526: error in opening file '?/rdbms/admin/sql.bsq'ORA-07391: sftopn: fopen errorORA-01526: error in opening file ''ORA-1092 signalled during: CREATE DATABASE eygleORA-1079 signalled during: ALTER DATABASE MOUNT...ORA-1507 signalled during: alter database open...ORA-214 signalled during: alter database mount...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...TEXT----------------------------------------------------------------------------------- ORA-214 signalled during: ALTER DATABASE MOUNT...ORA-214 signalled during: alter database mount...ORA-1113 signalled during: ALTER DATABASE OPEN...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1113 signalled during: ALTER DATABASE OPEN...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1113 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1100 signalled during: alter database mount...ORA-1178 signalled during: alter database create datafile '/opt/oracle/produc...ORA-1516 signalled during: alter database create datafile '/opt/oracle/oradat...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'TEXT-----------------------------------------------------------------------------------ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusTEXT-----------------------------------------------------------------------------------ORA-283 signalled during: ALTER DATABASE RECOVER database ...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/users01.dbf'ORA-27037: unable to obtain file statusORA-283 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-279 signalled during: ALTER DATABASE RECOVER database using backup cont... ORA-308 signalled during: ALTER DATABASE RECOVER CONTINUE DEFAULT ...TEXT-----------------------------------------------------------------------------------ORA-308 signalled during: ALTER DATABASE RECOVER CONTINUE DEFAULT ...ORA-1547 signalled during: ALTER DATABASE RECOVER CANCEL ...ORA-1589 signalled during: alter database open...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1503 signalled during: CREATE CONTROLFILE REUSE DATABASE "EYGLE" NORESETL... ORA-1178 signalled during: alter database create datafile '/opt/oracle/produc...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-01157: cannot identify/lock data file 3 - see DBWR trace fileORA-01110: data file 3: '/opt/oracle/oradata/eygle/eygle02.dbf'ORA-27037: unable to obtain file statusORA-1157 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1113 signalled during: alter database open...ORA-1991 signalled during: ALTER DATABASE MOUNT...ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1031 signalled during: alter database open...ORA-3217 signalled during: ALTER TABLESPACE TEMP DEFAULT STORAGE (INITIAL 10M... ORA-1507 signalled during: alter database close...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1507 signalled during: alter database close normal...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1106 signalled during: alter database dismount...ORA-1531 signalled during: alter database open...TEXT-----------------------------------------------------------------------------------ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1531 signalled during: alter database open...ORA-1109 signalled during: alter database close...ORA-1507 signalled during: alter database close...ORA-1507 signalled during: ALTER DATABASE CLOSE NORMAL...ORA-1185 signalled during: alter database add logfile group 6ORA-350 signalled during: alter database drop logfile group 3...163 rows selected.SQL>。
Oracle数据库基础题库【含答案】
1、判断题,正确请写写"T",错误请写写"F",1、oracle数据库系统中,启动数据库的第一步是启动一个数据库实例。
( T )2、Oracle服务器端的监听程序是驻留在服务器上的单独进程,专门负责响应客户机的连接请求。
( F)3、oracle数据库中实例和数据库是一一对应的(非ORACLE并行服务,非集群)。
( T)4、系统全局区SGA 是针对某一服务器进程而保留的内存区域,它是不可以共享的。
( F )5、数据库字典视图ALL_***视图只包含当前用户拥有的数据库对象信息。
( F )8、数据字典中的内容都被保存在SYSTEM表空间中。
( T )9、HAVING后面的条件中可以有聚集函数,比如SUM(),AVG()等, WHERE 后面的条件中也可以有聚集函数。
( F )10、"上海西北京" 可以通过like ‘%上海_’查出来。
( F )11、表空间是oracle 最大的逻辑组成部分。
Oracle数据库由一个或多个表空间组成。
一个表空间由一个或多个数据文件组成,但一个数据文件只能属于一个表空间。
( T )12、表空间分为永久表空间和临时表空间两种类型。
( T )13、truncate是DDL操作,不能 rollback。
( T )14、如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用WHERE语句。
( F )15、Oracle数据库中字符串和日期必须使用双引号标识。
( F )16、Oracle数据库中字符串数据是区分大小写的。
( T )17、Oracle数据库中可以对约束进行禁用,禁用约束可以在执行一些特殊操作时候保证操作能正常进行。
( F )18、为了节省存储空间,定义表时应该将可能包含NULL值的字段放在字段列表的末尾。
( T ) 20、在连接操作中,如果左表和右表中不满足连接条件的数据都出现在结果中,那么这种连接是全外连接。
oracle 数据库表同步方法
oracle 数据库表同步方法Oracle数据库是一种关系型数据库管理系统,可以用于存储和管理大量数据。
在日常的数据库管理工作中,经常会遇到需要将数据从一个表同步到另一个表的情况。
本文将介绍几种常见的Oracle数据库表同步方法。
方法一:使用INSERT INTO SELECT语句INSERT INTO SELECT语句可以将一个表的数据插入到另一个表中。
首先,我们需要创建目标表,确保目标表的结构与源表相同。
然后,使用INSERT INTO SELECT语句将源表的数据插入到目标表中。
该方法适用于数据量较小、结构相同的表之间的同步。
方法二:使用MERGE语句MERGE语句可以同时执行插入、更新和删除操作,可以将源表的数据同步到目标表中。
首先,我们需要创建目标表,确保目标表的结构与源表相同。
然后,使用MERGE语句将源表的数据同步到目标表中。
该方法适用于数据量较大、需要同时进行插入、更新和删除操作的表之间的同步。
方法三:使用Oracle GoldenGateOracle GoldenGate是一种高性能的数据同步和复制工具,可以实现实时的、零数据丢失的数据同步。
使用Oracle GoldenGate可以将源表的数据实时同步到目标表中,并保持数据的一致性。
该工具适用于对数据同步要求较高的场景,但需要购买和配置相应的许可证和环境。
方法四:使用Oracle Data PumpOracle Data Pump是Oracle数据库自带的一种数据导入导出工具,可以将表数据导出为二进制文件,然后再导入到目标表中。
使用Oracle Data Pump可以将源表的数据导出为.dmp文件,然后再导入到目标表中。
该方法适用于数据量较大、需要跨不同数据库实例进行数据同步的场景。
方法五:使用外部表外部表是一种特殊的表,它不存储数据,而是通过定义外部表和数据文件的映射关系,实现对外部文件中数据的查询和操作。
可以使用外部表将数据从源表同步到目标表。
Oracle 修改外部表
Oracle 修改外部表
当在操作系统环境中修改了数据文件所对应的OS路径后,为了使用Oracle能够正确标识OS文件所在的目录,则必须改变DIRECTORY对象。
例如,下面的语句修改外部表EXT_EMP的默认DIRECTORY对象为EXT_NEW:
SQL>alter table ext_emp default direct ext_new;
当在操作系统中修改了OS文件名后,为了使Oracle能够正确标识该OS文件,则必须逻辑修改外部表对应的OS文件。
例如,下面的语句修改外部表EXT_EMP对应OS文件EMP.CVS:
SQL>alter table ext_emp location('emp.csv');
当数据文件的数据格式发生改变时,如分隔符由“,”变为“;”,这就需要改变访问参数设置。
例如:
SQL>alter table ext_emp access parameters
2 (fields terminated by ';')。
将文本数据导入到ORACLE数据库的方法
将文本数据导入到ORACLE数据库的方法
1. 使用命令行工具 sqlldr:
sqlldr 是 ORACLE 提供的一个命令行工具,可以用于将文本数据导入到 ORACLE 数据库。
以下是使用 sqlldr 导入数据的步骤:
a.创建一个控制文件,控制文件描述了文本数据的结构和如何导入数据库。
例如,可以指定字段的名称、类型和顺序等。
b. 使用 sqlldr 命令加载数据,命令格式如下:
2. 使用外部表(External Table):
外部表是ORACLE数据库的一种特殊对象,它将外部文件(如文本文件)映射为数据库表的一部分。
以下是使用外部表导入数据的步骤:
a.创建外部表,指定外部文件的位置和格式。
例如,可以使用ANIZATIONEXTERNAL语句创建外部表。
b.使用INSERT...SELECT语句将外部表中的数据插入到其他数据库表中。
3.使用ORACLEDATAPUMP工具:
ORACLEDATAPUMP是ORACLE提供的一个工具,可以方便地导入和导出数据库对象和数据。
以下是使用ORACLEDATAPUMP工具导入数据的步骤:
a. 使用 expdp 命令导出数据,命令格式如下:
b.创建一个目标表,用于接收导入的数据。
c. 使用 impdp 命令导入数据,命令格式如下:
4.使用ETL工具:
总结起来,将文本数据导入到 ORACLE 数据库的方法包括使用sqlldr 命令行工具、外部表、ORACLE DATA PUMP 工具和 ETL 工具。
根据具体情况选择合适的方法进行数据导入。
Oracle外部表的应用
Oracle外部表的应用在本练习中,将在SCOTT模式中练习如何创建外部表,并进行练习如何通过外部表将外部数据导入到数据库。
(1)创建两个文本文件F1和F2文件,在两个文件中输入如下的数据并保存:F1.txt文件:132,OneLine464,TwoLineF2.TEXT文件:133,ThreeLine467,FourLine(2)以SYSTEM身份连接到数据库,并创建指向两个数据文件所在位置的目录对象,然后将对该目录进行读写的权限授予SCOTT用户:create directory ext_data as 'd:\exterior';grant read,write on directory ext_data to scott;注意,这里假设将数据文件存放在D:\EXTERIOR目录。
(3)连接到SCOTT模式,创建外部表。
create table exterior_table(id number(5),tip varchar(20))ORGANIZATION EXTERNAL(TYPE ORACLE_LOADERDEFAULT DIRECTORY ext_dataACCESS Parameters(RECORDS DELIMITED BY NEWLINEbadfile 'bad_dev.txt'LOGFILE 'log_dev.txt'FIELDS TERMINATED BY ',')LOCATION('F1.txt','F2.txt'));(4)查询外部表,显示两个数据文件中的数所。
select * from test_table;(5)在文本文件F1.TXT中添加一行数据,然后再使用上一步中的语句查询外部表。
这时显示的数据应该包括新添加的数据行。
(6)在外部表中,用户不可以直接修改、添加数据,为了解决这个问题,可以将外部表中显示的数据导入到数据库。
oracle的insert into用法
oracle的insert into用法提起oracle,大家可能会首先想到它是一种数据库管理系统,可用于存储数据和管理数据库。
但是,oracle不仅有存储和管理数据库的功能,它也拥有一系列SQL语言,比如INSERT INTO语句,可以用来将数据插入到数据库中。
在oracle中,INSERT INTO语句用于将新行插入到表中,以添加新数据。
INSERT INTO语句定义如下:INSERT INTO名 (列名1,列名2) VALUES (值1,值2…);表名是要插入数据的表名;列名1,列名2是要插入的列名;值1,值2是要插入的值。
如果要插入的行中的所有值都有效,则可以使用以下INSERT INTO语句:INSERT INTO名 VALUES (值1,值2…);使用INSERT INTO语句可以在oracle中插入多行,INSERT INTO 语句还可以使用SELECT子句来实现,此时可以使用以下语句:INSERT INTO名 (列名1,列名2… SELECT名1,列名2… FROM名。
以上的语法只是oracle的基本insert into语句的用法。
实际上,oracle的insert into语句还有更多的用法,比如带WHERE子句的INSERT INTO语句,外部表INSERT INTO语句,SELECT WHERE 子句INSERT INTO语句,以及VALUES子句的INSERT INTO语句等。
WHERE子句的INSERT INTO语句用于将数据插入到满足WHERE子句指定条件的行中,语法如下:INSERT INTO名 (列名1,列名2…VALUES (值1,值2… WHERE件1 and件2…。
外部表INSERT INTO语句用于将数据从外部表中插入到oracle 数据库中,语法如下:INSERT INTO名 (列名1,列名2… VALUES (值1,值2… FROM部表;SELECT WHERE子句INSERT INTO语句用于从oracle数据库中的一个表中查询数据并插入到另一个表中。
Oracle数据库基础题库【含答案】
1、判断题,正确请写写"T",错误请写写"F",1、oracle数据库系统中,启动数据库的第一步是启动一个数据库实例。
( T )2、Oracle服务器端的监听程序是驻留在服务器上的单独进程,专门负责响应客户机的连接请求。
( F)3、oracle数据库中实例和数据库是一一对应的(非ORACLE并行服务,非集群)。
( T)4、系统全局区SGA 是针对某一服务器进程而保留的内存区域,它是不可以共享的。
( F )5、数据库字典视图ALL_***视图只包含当前用户拥有的数据库对象信息。
( F )8、数据字典中的内容都被保存在SYSTEM表空间中。
( T )9、HAVING后面的条件中可以有聚集函数,比如SUM(),AVG()等, WHERE 后面的条件中也可以有聚集函数。
( F )10、"上海西北京" 可以通过like ‘%上海_’查出来。
( F )11、表空间是oracle 最大的逻辑组成部分。
Oracle数据库由一个或多个表空间组成。
一个表空间由一个或多个数据文件组成,但一个数据文件只能属于一个表空间。
( T )12、表空间分为永久表空间和临时表空间两种类型。
( T )13、truncate是DDL操作,不能 rollback。
( T )14、如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用WHERE语句。
( F )15、Oracle数据库中字符串和日期必须使用双引号标识。
( F )16、Oracle数据库中字符串数据是区分大小写的。
( T )17、Oracle数据库中可以对约束进行禁用,禁用约束可以在执行一些特殊操作时候保证操作能正常进行。
( F )18、为了节省存储空间,定义表时应该将可能包含NULL值的字段放在字段列表的末尾。
( T )20、在连接操作中,如果左表和右表中不满足连接条件的数据都出现在结果中,那么这种连接是全外连接。
Oracle 建立外部表
Oracle 建立外部表建立外部表也是使用CREATE TABLE语句来完成的,但建立外部表是必须指定ORGANIZATION EXTERNAL子句。
与建立普通表不同,建立外部表包括两部分:一部分描述列的数据类型,另一部分描述OS文件数据与表列的对应关系。
为了演示如何建立外部表,这里将使用包含逗号分隔符的文件“成绩表.CSV”,该类型的文件可以被Excel使用。
(1)为了建立外部表,Oracle需要知道外部文件在操作系统中的位置,这可以通过使用目录对象作为服务器文件系统上目录的别名来解决。
创建时还需为非特权用户或DBA用户授予CREATE ANY DIRECTORY系统权限。
另外,为了使数据库用户可以访问特定目录下的OS文件,必须将读写目录对象的权限授予用户。
SQL>conn / as sysdba已连接。
SQL> create directory exterior_data2 as 'd:\orcldata\exterior';目录已创建。
SQL> grant read,write on directory exterior_data to scott;授权成功。
在上面的语句中,建立一个名为EXTERIOR_DATA的目录,该目录指向服务器上“d:\orcldata\exterior”目录,D:\ORCLDATA\EXTERIOR目录也是存放EMPLOYEES.XLS 数据文件的位置。
(2)在指定数据文件的位置后,就可以使用CREATE TABLE ... ORGANIZATION EXTERNAL语句创建外部表。
这里需要注意,数据文件中的数据并不会被存储在数据库中。
创建的外部表EXT_EMP的语句如下:SQL> create table ext_emp2 (empno number(4),3 ename varchar2(12),4 job varchar2(12) ,5 mgr number(4) ,6 hiredate date,7 salary number(8),8 comm number(8),9 deptno number(3))10 organization external11 (type oracle_loader12 default directory exterior_data13 access parameters(14 records delimited by newline15 fields terminated by ',')16 location('employees.csv'));表已创建。
Oracle数据库基础题库【含答案】
一、判断题,正确请写写"T",错误请写写"F",1、oracle数据库系统中,启动数据库的第一步是启动一个数据库实例。
( T )2、Oracle服务器端的监听程序是驻留在服务器上的单独进程,专门负责响应客户机的连接请求。
( F)3、oracle数据库中实例和数据库是一一对应的(非ORACLE并行服务,非集群)。
( T)4、系统全局区SGA 是针对某一服务器进程而保留的内存区域,它是不可以共享的。
( F )5、数据库字典视图ALL_***视图只包含当前用户拥有的数据库对象信息。
( F )8、数据字典中的内容都被保存在SYSTEM表空间中。
( T )9、HAVING后面的条件中可以有聚集函数,比如SUM(),AVG()等, WHERE 后面的条件中也可以有聚集函数。
( F )10、"上海西北京" 可以通过like ‘%上海_’查出来。
( F )11、表空间是oracle 最大的逻辑组成部分。
Oracle数据库由一个或多个表空间组成。
一个表空间由一个或多个数据文件组成,但一个数据文件只能属于一个表空间。
( T )12、表空间分为永久表空间和临时表空间两种类型。
( T )13、truncate是DDL操作,不能 rollback。
( T )14、如果需要向表中插入一批已经存在的数据,可以在INSERT语句中使用WHERE 语句。
( F )15、Oracle数据库中字符串和日期必须使用双引号标识。
( F )16、Oracle数据库中字符串数据是区分大小写的。
( T )17、Oracle数据库中可以对约束进行禁用,禁用约束可以在执行一些特殊操作时候保证操作能正常进行。
( F )18、为了节省存储空间,定义表时应该将可能包含NULL值的字段放在字段列表的末尾。
( T )20、在连接操作中,如果左表和右表中不满足连接条件的数据都出现在结果中,那么这种连接是全外连接。
ORACLE-技术文档-oracle 驱动表(包含 hint使用 nested loop hash join sortmergegate方式)
Oracle 驱动表Oracle驱动表(driving table/outer table)也叫做外部表,也叫外层表,是在多表关联查询中首先遍历的表,驱动表的每一行都要到另一个表中寻找相应的记录,然后计算返回最终数据。
驱动表的概念只在nested loops和hash join时存在。
原则:1.驱动表一般是小表,但不绝对,看下边2.驱动表一般是通过where条件筛选后剩余行数较少的表。
3.如果表的一条记录很长,占用几个数据块也适合做驱动表4.CBO和RBO中,对于驱动表的选择是不同的,CBO中通过对统计信息的参考进行计算来选择驱动表,而RBO中按照既定原则选择驱动表。
5.RBO中,from后边最右边的表为驱动表(from后边表从右向左遍历,where条件从下向上遍历)6.涉及驱动表的查询,连接条件的索引很重要,驱动表连接字段可以没有索引,但是被驱动表需要被扫描驱动表经过筛选后剩余条数的遍数,所以被驱动表的连接字段上有一条索引是非常重要的。
分析:假设a表10行记录,b表1000行记录,两个表都有id列,查询时使用id列进行关联Select * from a,b where a.id=b.id and a.id=100;A表作为驱动表比较合适,假设a.id=100只有1行,即使全表扫描a表也就几个块,假设a 表占用10个块。
B表的id假如非唯一,如果b表的id列有索引,b表占用100个块,每个块10行记录,id 列索引占用10个块,并且id为100有2条记录,在两个块中那么这条语句的成本(以块计算,下同):A表(10个块)*b表索引(10个块)+b表id为100的2个块=102个块如果b表没有索引,成本为:A表(10个块)*b表(100个块)=1000个块如果a,b表都没有索引,可以看出不管哪个表作为驱动表,语句的执行成本都是一样的。
如果a,b表id列都有索引,a表id列索引占2个块,成本为:A表id列索引(2个块)*b表id列索引(10个块)+ b表id为100的2个块=22个块如果B表的记录很长,可以作为驱动表的情况比较复杂,大家可以自己想象适合的场景。
postgres fdw oracle 原理
postgres fdw oracle 原理
PostgreSQLFDW(ForeignDataWrapper)是一种机制,允许PostgreSQL数据库通过一个插件来访问外部数据源。
其中一个常见
的外部数据源是Oracle数据库。
PostgreSQL FDW通过使用Oracle的OCI(Oracle Call Interface)来访问Oracle数据库。
OCI是Oracle提供的一组API,用于访问Oracle数据库。
FDW使用OCI来执行所有的连接、查询和更新操作,并将结果转换为PostgreSQL能够理解的格式。
FDW插件包括两个部分:一个是外部表定义,另一个是访问外部数据源的C代码。
外部表定义包括表的列和数据类型,以及访问外部数据源所需的连接信息。
C代码使用OCI来连接到外部数据源,并执行SQL查询或更新操作。
它还负责将查询结果转换为PostgreSQL可
以处理的格式,并将更新操作转换为Oracle可以理解的格式。
使用PostgreSQL FDW访问Oracle数据库可以简化数据集成过程,无需将数据导入PostgreSQL中。
它还可以提高数据查询性能,因为PostgreSQL和Oracle可以在不同的服务器上运行,从而使查询可以并行执行。
总的来说,PostgreSQL FDW是一个强大的数据集成工具,可以
让PostgreSQL数据库访问外部数据源,如Oracle数据库。
它通过使用OCI来执行所有的连接、查询和更新操作,并将结果转换为PostgreSQL能够理解的格式,从而简化了数据集成过程。
- 1 -。
Oracle执行计划详解
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)
索引全扫描(index full scan)
索引快速扫描(index fast full scan)
(1) 索引唯一扫描(index unique scan)
SQL> explain plan for select empno, ename from emp
where empno > 7876 order by empno;
Query Plan
--------------------------------------------------------------------------------
Oracle执行计划详解
简介:
本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容。
并有总结和概述,便于理解与记忆!
+++
目录
---
一.相关的概念
Rowid的概念
RecursiveSql概念
Predicate(谓词)
DRiving Table(驱动表)
SELECT STATEMENT[CHOOSE] Cost=
TABLE ACCESS FULL DUAL
2) 通过ROWID的表存取(Table Access by ROWID或rowid lookup)
行的ROWID指出了该行所在的数据文件、数据块以及行在该块中的位置,所以通过ROWID来存取数据可以快速定位到目标数据上,是Oracle存取单行数据的最快方法。
oracle中outer用法
oracle中outer用法在Oracle数据库中,outer关键字用于指定查询的外部范围,包括外部连接和外部筛选。
它对于处理多表查询和数据整合非常有用。
本文将介绍outer用法的常见应用场景和示例。
一、外部连接(Outer Join)外部连接可以将两个表中的记录匹配,同时也可以将一个表中未匹配的记录添加到结果集中。
outer连接主要有左外连接(Left Outer Join)、右外连接(Right Outer Join)和全外连接(Full Outer Join)。
1. 左外连接(Left Outer Join)左外连接返回左表中的所有记录以及右表中匹配的记录。
未匹配的左表记录将包含NULL值。
示例:假设有两个表Table1和Table2,其中Table1包含员工信息,Table2包含销售业绩。
我们希望获取所有员工及其对应的销售业绩,同时包括未销售的员工的记录。
```sqlSELECT *FROM Table1 T1LEFT OUTER JOIN Table2 T2ON T1.employee_id = T2.employee_id;```上述查询将返回所有员工及其对应的销售业绩,对于未销售的员工,其业绩字段将显示为NULL。
2. 右外连接(Right Outer Join)右外连接返回右表中的所有记录以及左表中匹配的记录。
未匹配的右表记录将包含NULL值。
示例:假设有两个表Table3和Table4,其中Table3包含订单信息,Table4包含订单明细。
我们希望获取所有订单及其对应的订单明细,同时包括未下订单的记录。
```sqlSELECT *FROM Table3 T3RIGHT OUTER JOIN Table4 T4ON T3.order_id = T4.order_id;```上述查询将返回所有订单及其对应的订单明细,对于未下订单的订单,其明细字段将显示为NULL。
3. 全外连接(Full Outer Join)全外连接返回左表和右表中的所有记录,包括匹配和未匹配的记录。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-- Oracle外部表--=================外部表只能在Oracle 9i之后来使用。
简单地说,外部表,是指不存在于数据库中的表。
通过向Oracle提供描述外部表的元数据,我们可以把一个操作系统文件当成一个只读的数据库表,就像这些数据存储在一个普通数据库表中一样来进行访问。
外部表是对数据库表的延伸。
一、外部表的特性位于文件系统之中,按一定格式分割,如文本文件或者其他类型的表可以作为外部表。
对外部表的访问可以通过SQL语句来完成,而不需要先将外部表中的数据装载进数据库中。
外部数据表都是只读的,因此在外部表不能够执行DML操作,也不能创建索引。
ANALYZE语句不支持采集外部表的统计数据,应该使用DMBS_STATS包来采集外部表的统计数据。
二、创建外部表的注意事项1.需要先建立目录对象2.对于操作系统文件的要求文件要有固定的格式、不能有标题列、访问时会自动创建一个日志文件3.在建立临时表时的相关限制对表中字段的名称存在特殊字符的情况下,必须使用英文状态的下的双引号将该表列名称连接起来。
如采用”SalseID#”。
对于列名字中特殊符号未采用双引号括起来时,会导致无法正常查询数据。
建议不用使用特殊的列标题字符在创建外部表的时候,并没有在数据库中创建表,也不会为外部表分配任何的存储空间。
创建外部表只是在数据字典中创建了外部表的元数据,以便对应访问外部表中的数据,而不在数据库中存储外部表的数据。
简单地说,数据库存储的只是与外部文件的一种对应关系,如字段与字段的对应关系。
而没有存储实际的数据。
由于存储实际数据,故无法为外部表创建索引,同时在数据使用DML时也不支持对外部表的插入、更新、删除等操作。
4.删除外部表或者目录对象一般情况下,先删除外部表,然后再删除目录对象,如果目录对象中有多个表,应删除所有表之后再删除目录对象。
如果在未删除外部表的情况下,强制删除了目录,在查询到被删除的外部表时,将收到"对象不存在"的错误信息。
查询dba_external_locations来获得当前所有的目录对象以及相关的外部表,同时会给出这些外部表所对应的操作系统文件的名字。
5.对于操作系统平台的限制不同的操作系统对于外部表有不同的解释和显示方式如在Linux操作系统中创建的文件是分号分隔且每行一条记录,但该文件在Windows操作系统上打开则并非如此。
建议避免不同操作系统以及不同字符集所带来的影响三、创建外部表使用CREATE TABLE语句的ORGANIZATION EXTENERAL子句来创建外部表。
外部表不分配任何盘区,因为仅仅是在数据字典中创建元数据。
1.外部表的创建语法createtabletable_name(col1 datatype1,col2 datatype2,col3 datatype3)organization exteneral(.....)2.由查询结果集,使用Oracle_datapump来填充数据来生成外部表a.创建系统目录以及Oracle数据目录名来建立对应关系,同时授予权限[oracle@oradb ~]$ mkdir-p/home/oracle/external_tb/datasys@ORCL>createorreplacedirectory dat_diras'/home/oracle/external_tb/data/';sys@ORCL>grantread,writeondirectory dat_dirtoscott;b.创建外部表scott@ORCL>createtableex_tb1 --创建外部表2 (ename,job,sal,dname) --表列描述,注意未指定数据类型3 organizationexternal4 (5 typeoracle_datapump --使用datapump将查询结果填充到外部表,注,此处由select 生成,故不支持oracle_loader6 defaultdirectory dat_dir --指定外部表的存放目录7 location('tb1.exp','tb2.exp') --产生外部表的内容将填充到这些文件中8 )9 parallel --按并行方式来填充10 as11 selectename,job,sal,dname -填充使用的原始数据12 fromempjoindept13 onemp.deptno=dept.deptno;c.--验证外部表scott@ORCL>select*fromex_tb1;ENAME JOB SAL DNAME---------- --------- ---------- --------------SMITH CLERK 800 RESEARCHALLEN SALESMAN 1600 SALESWARD SALESMAN 1250 SALESJONES MANAGER 2975 RESEARCH..........对于使用上述方式创建的外部表可以将其复制到其他路径作为外部表的原始数据来生成新的外部表,用于转移数据。
3.使用SQLLDR提供外部表的定义并创建外部表关于SQL*Loader的使用请参照:SQL*Loader使用方法我们使用SQL*Loader和下面的这个控制文件来生成外部表的定义[oracle@oradb ~]$ cat demo1.ctlLOADDATAINFILE*INTOTABLEDEPT_NEWFIELDS TERMINATEDBY','(DEPTNO,DNAME,LOC)BEGINDATA10,Sales,Virginia20,Accounting,Virginia30,Consulting,Virginia40,Finance,Virginia[oracle@oradb ~]$ sqlldr scott/tiger control=demo1.ctl external_table=generate_onlyEXTERNAL_TABLE参数有以下三个值:NOT_USED:默认值。
EXECUTE:这个值说明SQLLDR不会生成并执行一个SQLINSERT语句;而是会创建一个外部表,且使用一个批量SQL语句来加载。
GENERATE_ONLY:使SQLLDR并不具体加载任何数据,而只是会生成所执行的SQL DDL和DML 语句,并放到它创建的日志文件中。
注:DIRECT=TRUE覆盖EXTENAL_TABLE=GENERATE_ONLY。
如果指定了DIRECT=TRUE,则会加载数据,而不会生成外部表。
[oracle@oradb ~]$ cat demo1.log --查看sqlldr产生的日志文件TableDEPT_NEW,loadedfromevery logical record.Insertoptionineffectforthistable:INSERTColumnName Position Len Term Encl Datatype------------------------------ ---------- ----- ---- ---- ---------------------DEPTNO FIRST * , CHARACTERDNAME NEXT * , CHARACTERLOC NEXT * , CHARACTERCREATEDIRECTORY statements neededforfiles --创建一个目录------------------------------------------------------------------------CREATEDIRECTORY SYS_SQLLDR_XT_TMPDIR_00000AS'/home/oracle/'CREATETABLEstatementforexternaltable: --生成创建外部表的命令------------------------------------------------------------------------CREATETABLE"SYS_SQLLDR_X_EXT_DEPT_NEW"("DEPTNO" NUMBER(2),"DNAME" VARCHAR2(20),"LOC" VARCHAR2(20))ORGANIZATIONexternal --该子句表明是一个外部表heap对应普通表,index对应iot,external对应外部表(TYPEoracle_loader --说明外部文件访问方式:oracle_loader或oracle_datapump(9i不支持)DEFAULTDIRECTORY SYS_SQLLDR_XT_TMPDIR_00000 --指定外部文件的缺省目录ACCESS PARAMETERS --这个访问参数有些类似于sqlldr中控制文件中的描述信息( --系统根据这些描述信息来生成外部表的格式RECORDS DELIMITEDBYNEWLINE CHARACTERSET US7ASCII --记录默认以换行符结束BADFILE'SYS_SQLLDR_XT_TMPDIR_00000':'demo1.bad' --存放处理失败的记录文件描述LOGFILE'demo1.log_xt' --日志文件READSIZE 1048576--Oracle读取输入数据文件所用的默认缓冲区,此处为MB,如专用模式则从PGA分配,如共享模式则从SGA分配SKIP 6 --跳过的记录数,因为我们使用了控制文件,所以前面的控制信息需要跳过FIELDS TERMINATEDBY"," LDRTRIM --描述字段的终止符REJECT ROWSWITHALLNULLFIELDS --所有为空值的行被跳过并且记录到bad file.( --下面是描述外部文件各个列的定义"DEPTNO"CHAR(255)TERMINATEDBY",","DNAME"CHAR(255)TERMINATEDBY",","LOC"CHAR(255)TERMINATEDBY","))location('demo1.ctl' --描述外部文件的文件名))REJECT LIMIT UNLIMITED --描述允许的错误数,此处为无限制INSERTstatements usedtoloadinternal tables: --用于将数据填充到表,使用append 方式------------------------------------------------------------------------INSERT/*+ append */INTODEPT_NEW(DEPTNO,DNAME,LOC)SELECT"DEPTNO","DNAME","LOC"FROM"SYS_SQLLDR_X_EXT_DEPT"statementstocleanup objects createdbyprevious statements: --用于删除目录和外部表的定义信息------------------------------------------------------------------------DROPTABLE"SYS_SQLLDR_X_EXT_DEPT_NEW"DROPDIRECTORY SYS_SQLLDR_XT_TMPDIR_00000----------------------------------------------------------------------------------------------------------------------- sys@ORCL>grantcreateanydirectorytoscott;sys@ORCL>grantdropanydirectorytoscott;scott@ORCL>createtabledept_new2 (deptno number,dname varchar2(20),loc varchar2(25));scott@ORCL>select*fromdept_new;norows selected[oracle@oradb ~]$ sqlldr scott/tiger control=demo1.ctl external_table=executescott@ORCL>select*fromdept_new;DEPTNO DNAME LOC---------- -------------------- -------------------------10 Sales Virginia20 Accounting Virginia30 Consulting Virginia40 Finance Virginia4.使用平面文件定义并生成外部表a.平面文件数据1.dat:7369,SMITH,CLERK,7902,17-DEC-80,100,0,207499,ALLEN,SALESMAN,7698,20-FEB-81,250,0,307521,WARD,SALESMAN,7698,22-FEB-81,450,0,307566,JONES,MANAGER,7839,02-APR-81,1150,0,202.dat:7654,MARTIN,SALESMAN,7698,28-SEP-81,1250,0,307698,BLAKE,MANAGER,7839,01-MAY-81,1550,0,307934,MILLER,CLERK,7782,23-JAN-82,3500,0,10b.继续使用前面创建的目录/home/oracle/external_tb/data来存放数据文件:sys@ORCL>select*fromdba_directories;OWNER DIRECTORY_NAME DIRECTORY_PATH--------------- --------------- ---------------------------------------------SYS DATA_PUMP_DIR /u01/oracle/10g/rdbms/log/SYS DAT_DIR /home/oracle/external_tb/data/scott@ORCL>ho ls/home/oracle/external_tb/data/1.dat2.dat tb1.exp tb2.expc.创建外部表scott@ORCL>get/u01/bk/scripts/tb.emp_new1 createtableemp_new2 (3 emp_id number(4),4 ename varchar2(15),5 job varchar2(12),6 mgr_id number(4),7 hiredate date,8 salary number(8),9 comm number(8),10 dept_id number(2)11 )12 organizationexternal13 (14 typeoracle_loader15 defaultdirectory dat_dir16 access parameters17 (18 records delimitedbynewline19 fields terminatedby','20 )21 location22 ('1.dat','2.dat')23*);scott@ORCL>start/u01/bk/scripts/tb.emp_newd.验证外部表scott@ORCL>select*fromemp_new;EMP_ID ENAME JOB MGR_ID HIREDATE SALARY COMM DEPT_ID---------- --------------- ------------ ---------- --------- ---------- ---------- ----------7369 SMITH CLERK 7902 17-DEC-80 100 0 207499 ALLEN SALESMAN 7698 20-FEB-81 250 0 30............................scott@ORCL>deletefromemp_newwhereename='SMITH'; --外部表不能执行DMLdeletefromemp_newwhereename='SMITH'*ERROR at line 1:ORA-30657:operationnotsupportedonexternalorganizedtablescott@ORCL>insertintoemp_new(emp_id,ename)select8888,'Robinson'fromdual;insertintoemp_new(emp_id,ename)select8888,'Robinson'fromdual*ERROR at line 1:ORA-30657:operationnotsupportedonexternalorganizedtablee.获得外部表的有关信息:scott@ORCL>col access_parameters format a35scott@ORCL>selectowner,table_name,type_name,default_directory_name,access_parameters2 fromdba_external_tables;OWNER TABLE_NAME TYPE_NAME DEFAULT_DIRECTO ACCESS_PARAMETERS---------- --------------- ------------------------------ --------------- -----------------------------------SCOTT EX_TB1 ORACLE_DATAPUMP DAT_DIRSCOTT EMP_NEW ORACLE_LOADER DAT_DIRrecords delimitedbynewlinefields terminatedby','SCOTT EMP_PUMP ORACLE_DATAPUMP DAT_DIR records delimitedbynewlinefields terminatedby','f.获得平面文件的位置,使用如下的查询:scott@ORCL>select*fromdba_external_locationsorderbytable_name;OWNER TABLE_NAME LOCATION DIR DIRECTORY_NAME---------- --------------- --------------- --- ------------------------------SCOTT EMP_NEW 1.dat SYS DAT_DIRSCOTT EMP_NEW 2.dat SYS DAT_DIRSCOTT EMP_PUMP 1.dat SYS DAT_DIRSCOTT EMP_PUMP 2.dat SYS DAT_DIRSCOTT EX_TB1 tb2.exp SYS DAT_DIRSCOTT EX_TB1 tb1.exp SYS DAT_DIR5.外部表定义的进一步分析CREATETABLEexternal_table(COL01 VARCHAR2(100),COL02 NUMBER,......)ORGANIZATIONEXTERNAL(TYPEORACLE_LOADERDEFAULTDIRECTORY "XXX"ACCESS PARAMETERS(RECORDS DELIMITEDBY0X'0A'SKIP 1BADFILE'bad.txt'FIELDS TERMINATEDBY','OPTIONALLY ENCLOSEDBY'"'LRTRIM MISSING FIELDVALUESARENULLREJECT ROWSWITHALLNULLFIELDS)LOCATION("CJ_DIR":'data.txt'))REJECT LIMIT UNLIMITED;外部表定义的几个重点ANIZATIONEXTERNAL关键字,必须要有。