動手實驗: Oracle Hadoop裝載程序sql
實驗環境... 2bash
實驗1: 裝載Hadoop文件到數據庫... 3oracle
步驟3: 運行Oracle Hadoop裝載程序... 3測試
實驗2: 裝載Hadoo文件到DataPump格式文件... 3spa
步驟1: 建立目標表... 3操作系統
實驗3: 裝載Hadoo文件到預分區的DataPump格式文件... 3
步驟3: 運行Oracle Hadoop裝載程序,使用文件名通配符... 3
步驟5: 運行Oracle Hadoop裝載程序,使用文件名列表... 3
軟件環境:
本實驗主要由如下軟件搭建而成: Oracle Enterprise Linux, Oracle 11g, Java SE6update30, Apache Hadoop, Oracle Connector for Hadoop等.
實驗用到的文件:
實驗用到的文件保存在 /home/hadoop/training/OLH 目錄下,包括腳本文件以及一些示例數據文件。
環境變量:
在文件olhodchenv.sh中保存了實驗中須要用到的環境變量. 爲了簡化操做,已經在實驗中的$HOME/.bash_profile引用該文件,這些環境變量會自動生效。
變量名 |
變量值 |
ORACLE_HOME |
/home/oracle/app/oracle/product/11.2.0/dbhome_2 |
HADOOP_HOME |
/opt/hadoop |
OLH_HOME |
/opt/OLH |
OLH_JAR |
OLH_HOME/jlib/oraloader.jar |
HADOOP_CONF_DIR |
${HADOOP_HOME}/conf |
ORACLE_SID |
orcl |
一些有用的信息
下表中也列出了實驗中可能須要的一些信息.
項目 |
值 |
虛擬機 IP |
172.16.22.131 |
虛擬機主機名 |
bigdata01 |
Hadoop default FS |
hdfs://bigdata01:9000 |
Hadoop Job Tracker URL |
hdfs://bigdata01:9001 |
實驗用操做系統用戶密碼 |
hadoop/oracle |
實驗用數據庫用戶密碼 |
Scott/tiger |
操做系統oracle用戶密碼 |
oracle/oracle |
數據庫超級用戶 |
sys/oracle |
操做系統超級用戶 |
root/oracle |
文檔中‘PROMPT>’指的是操做系統SHELL的輸入界面
‘SQL ->’指的是Oracle SQL*Plus的輸入界面
用hadoop/oracle登陸172.16.22.131.
檢查環境變量是否正確設置.
PROMPT> env
應該能看到上面提到的環境變量.
檢查hadoop是否正常.
PROMPT> hadoop dfsadmin -report
檢查數據庫是否正常
PROMPT> sqlplus scott/tiger
SQL> select * from tab;
實驗1: 裝載Hadoop文件到數據庫
在實驗1裏, 咱們將會把一個Hadoop文件系統上的文件裝載到數據庫中(使用JDBC 鏈接)。 這是OLH的最基本功能。
步驟1: 建立目標表
首先, 咱們在數據庫中新建一個表,咱們的數據將會裝載到這個表裏.
檢查腳本文件並運行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab1.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab1.1_target_tab.sql;
步驟2: 在Hadoop中放入示例文件
由於OLH須要從Hadoop文件系統中讀取數據,因此咱們先要在Hadoop中放入一個的數據文件。 下面的腳本先在Hadoop中創建一個目錄,而後把data.dat放入該目錄中.
PROMPT> cat ./lab1.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
PROMPT> ./lab1.2_init_hadoop_files.sh
步驟3: 運行Oracle Hadoop裝載程序
咱們如今就能夠開始裝載程序了.
檢查腳本文件:
PROMPT> cat ./lab1.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml
在裝載程序中,須要創建一個在Hadoop中新建一個目錄,用來存放」 _SUCCESS」和」_logs」 文件;在使用離線裝載選項時,還有可能須要存放一些離線裝載的文件。因此,咱們先要確保沒有該目錄,以避免建立失敗。
裝載程序須要讀取一些配置信息,在這個例子中,咱們使用配置文件: MyConf.xml. 仔細檢查 MyConf.xml. 文件裏包含裏一些運行OLH所需的主要參數,以下表所示:
表: OLH的主要參數
mapreduce.inputformat.class |
指定輸入文件的格式。除了文本文件,還支持hive格式文件。也能夠是自定義的文件格式。 |
mapred.input.dir |
Hadoop裏輸入的數據文件(含路徑) |
mapreduce.outputformat.class |
指定裝載的輸出方式 在線裝載: OCIOutputFormat(*),JDBCOutputFormat 離線裝載: DataPumptOutputFormat , DelimitedTextOutputFormat |
mapred.output.dir |
輸出目錄(同時也是LOG所在目錄) |
oracle.hadoop.loader.loaderMapFile |
文件與表的對應關係,包括表名,欄位對應等 |
oracle.hadoop.loader.connection.url/user/pass |
目標數據庫的鏈接信息,包括url,用戶名,密碼 |
(注: OCIOutputFormat 只支持64位的Linux)
對於實驗1, 最關鍵參數是mapreduce.outputformat.class,確保它的值是 JDBCOutputFormat.
運行腳本文件.
PROMPT>./lab1.3_run_loader.sh
除了使用-conf=配置文件,咱們也能夠用 「-D參數=值」 的方式來傳遞參數,並且,-D方式會覆蓋-conf設定的值.
好比:
hadoop jar ${OLH_JAR} oracle.hadoop.loader.OraLoader -D mapred.input.dir olh_lab_in -D mapreduce.inputformat.class oracle.hadoop.loader.lib.input.DelimitedTextInputFormat
….
步驟4: 驗證結果
登陸到數據庫,檢查數據是否已經成功進入到數據庫
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
10000
返回10000,表示咱們已經成功裝載了10000行記錄到數據庫裏面了.
實驗2: 裝載Hadoop文件到DataPump格式文件
咱們也能夠不直接把數據裝載到數據庫,而是裝載成爲datapump格式文件. 再根據須要使用該文件。
步驟1: 建立目標表
首先, 咱們在數據庫中新建一個表,咱們的datapump的格式定義根據這個表產生.
檢查腳本文件並運行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab2.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab2.1_target_tab.sql;
步驟2: 在Hadoop中放入示例文件
和實驗1同樣,在HDFS中建立新的數據文件.
檢查腳本文件並運行之:
PROMPT> cat ./lab2.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
PROMPT> ./lab2.2_init_hadoop_files.sh
步驟3: 運行Oracle Hadoop裝載程序
開始運行裝載程序以前,須要編輯文件MyConf.xml。 把參數mapreduce.outputformat.class 的值修改爲oracle.hadoop.loader.lib.output.DataPumpOutputFormat。 固然,也能夠直接在命令行中指定該參數.
(vi簡單操做提示:按i或者a進入編輯模式,按esc退出編輯模式,輸入:wq保存並退出,輸入 :q! 退出但不保存)
PROMPT> vi MyConf.xml
…
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.DataPumpOutputFormat </value>
</property>
檢查腳本文件並運行之:
PROMPT> cat ./lab2.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.DataPumpOutputFormat
PROMPT>./lab2.3_run_loader.sh
…
步驟4: 把生成的文件取回到本地
經過離線裝載選項,OLH已經生成了一個Oracle能夠直接訪問的文件. 咱們須要把這個文件先拷貝到本地文件系統. 因爲在後面的操做中,Oracle須要使用文件所在目錄,因此咱們直接拷貝整個out目錄,並授予oracle用戶讀寫權限。
檢查腳本文件並運行之:
PROMPT> cat lab2.4_get_datapump_files.sh
rm -rf datapumpfiles
hadoop fs -get olh_lab_out datapumpfiles
chmod 777 datapumpfiles
PROMPT> ./lab2.4_get_datapump_files.sh
步驟5: 將文件之外部表附加到數據庫
OLH在生成離線文件同時,也生成了一個用來建立外部表的腳本<輸出目錄>/oraloader-dp.sql. 咱們能夠經過編輯文件,來建立外部表. 首先,把腳本中的目錄改成實際目錄(/home/hadoop/training/OLH/datapumpfiles),而後,去掉 「CREATE OR REPLACE DIRECTORY」前面的註釋標記,便可運行.
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/datapumpfiles ';
step5_load_dpfile_as_ext_tab.sql是已經修改好的文件。
檢查腳本文件並運行之:
PROMPT> sqlplus scott/tiger
SQL> !cat step5_load_dpfile_as_ext_tab.sql
--Oracle Loader for Hadoop Release 1.1.0.0.1 - Production
--
--Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
--
--Generated by DataPumpOutputFormat
--
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS
'/home/hadoop/training/OLH/datapumpfiles';
--GRANT READ, WRITE ON DIRECTORY OLH_EXTTAB_DIR TO SCOTT;
--
--ALTER SESSION ENABLE PARALLEL DML;
--INSERT INTO "SCOTT"."OLH_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_TABLE";
--
drop table "SCOTT"."EXT_OLH_TABLE";
CREATE TABLE "SCOTT"."EXT_OLH_TABLE "
(
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION ('oraloader-00000-dp-0.dat')
);
SQL> @lab2.5_load_dpfile_as_ext_tab.sql
步驟6: 檢查結果
SQL> select count(*) from EXT_OLH_TABLE;
10000
步驟7: 導入數據
咱們也能夠經過insert/select語句把數據真正導入到數據庫中。
檢查腳本文件並運行之:
SQL> !cat lab2.7_load_to_heap_table.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date
);
INSERT INTO "SCOTT"."OLH_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_TABLE";
SQL>@lab2.7_load_to_heap_table.sql
步驟8: 再次檢查結果
SQL> select count(*) from olh_table;
10000
結果顯示,數據成功導入到數據庫。
實驗3: 裝載Hadoop文件到預分區的DataPump格式文件
OLH支持把Hadoop文件根據數據庫內定義的分區條件,在Hadoop中把數據文件裝載成預分區的DataPump文件,每一個文件對應一個分區。
步驟1: 建立目標表
首先, 咱們在數據庫中新建一個分區表,以第一個欄位爲分區條件(value=0/1/2),咱們的datapump輸出文件將這個表的分區條件自動生成多個文件.
檢查腳本文件並運行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab3.1_target_tab.sql
-- Drop table if table exists
drop table olh_parted_table purge;
-- create table olh_parted_table (part_key number,col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date) partition ..;
create table olh_parted_table(
part_key number,col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date
)
partition by list(part_key)
(
partition p0 values(0),
partition p1 values(1),
partition p2 values(2),
partition pn values(default)
)
;
SQL> @lab3.1_target_tab.sql;
步驟2: 在Hadoop中放入示例文件
和實驗1同樣,在HDFS中建立新的數據文件。爲了更爲直觀,文件中第一欄等於0的數據會比1/2的數據稍多. 咱們能夠經過腳本簡單計算一下:
PROMPT>awk -F, '{a[$1]++}END{for (i in a)print "KEY="i":",a[i],"rows"}' olh_lab_with_part_key.dat
PART_KEY=0: 4010 rows
PART_KEY=1: 2990 rows
PART_KEY=2: 3000 rows
檢查腳本文件並運行之:
PROMPT> cat ./lab3.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab_with_part_key.dat olh_lab_in/data.dat
PROMPT> ./lab3.2_init_hadoop_files.sh
步驟3: 運行Oracle Hadoop裝載程序
開始運行裝載程序以前,因爲表結構和文件結構有所變化,須要把oracle.hadoop.loader.loaderMapFile參數指向一個新的Mapping文件。編輯MyConf.xml,設置oracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
固然,這個參數也能夠直接在命令行中指定。
PROMPT> vi MyConf.xml
…
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.DataPumpOutputFormat </value>
</property>
…
<property>
<name>oracle.hadoop.loader.loaderMapFile</name>
<value>file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml</value>
</property>
…
同時看一下loaderMap_lab_part_tab.xml文件,瞭解一下新的mapping關係:
PROMPT> cat loaderMap_lab_part_tab.xml
<?xml version="1.0" encoding="UTF-8" ?>
<LOADER_MAP>
<SCHEMA>SCOTT</SCHEMA>
<TABLE>OLH_PARTED_TABLE</TABLE>
<COLUMN field="F0">PART_KEY</COLUMN>
<COLUMN field="F1">COL1</COLUMN>
<COLUMN field="F2">COL2</COLUMN>
<COLUMN field="F3">COL3</COLUMN>
<COLUMN field="F4" format="yyyy-MM-dd HH:mm:ss">COL4</COLUMN>
</LOADER_MAP>
檢查腳本文件並運行之:
PROMPT> cat ./lab3.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.DataPumpOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
PROMPT>./lab3.3_run_loader.sh
步驟4: 把生成的文件取回到本地
如今把生成的文件取回到本地.
檢查腳本文件並運行之:
PROMPT> cat lab3.4_get_datapump_files.sh
rm -rf datapumpfiles
hadoop fs -get olh_lab_out parted_datapumpfiles
chmod 777 parted_datapumpfiles
PROMPT> ./lab3.4_get_datapump_files.sh
檢查一下文件大小.
PROMPT> cd parted_datapumpfiles; ls -l *.dat
文件 oraloader-00000-dp-1.dat 比另外兩個要大,由於第一個分區有更多的記錄.
步驟5: 將部分文件之外部表附加到數據庫
修改OLH提供的oraloader-dp.sql的文件。首先,把腳本中的目錄改成實際目錄(/home/hadoop/training/OLH/parted_datapumpfiles),而後,去掉 「CREATE OR REPLACE DIRECTORY」前面的註釋標記。.
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/parted_datapumpfiles ';
另外,咱們能夠只把一部分的文件映射到數據庫中,只要在建立外部表腳本中去掉不想要的分區文件。這裏,咱們只選擇第一個分區.
檢查腳本文件並運行之:
PROMPT> sqlplus scott/tiger
SQL> !cat lab3.5_load_dpfile_as_ext_tab.sql
--Oracle Loader for Hadoop Release 1.1.0.0.1 - Production
--
--Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
--
--Generated by DataPumpOutputFormat
--
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/parted_datapumpfiles';
--GRANT READ, WRITE ON DIRECTORY OLH_EXTTAB_DIR TO SCOTT;
--
--ALTER SESSION ENABLE PARALLEL DML;
--INSERT INTO "SCOTT"."OLH_PARTED_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_PARTED_TABLE";
--
CREATE TABLE "SCOTT"."EXT_OLH_PARTED_TABLE"
(
"PART_KEY" NUMBER,
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION
( 'oraloader-00000-dp-1.dat' )
);
SQL> @lab3.5_load_dpfile_as_ext_tab.sql
步驟6: 檢查結果
SQL> select count(*) from EXT_OLH_PARTED_TABLE;
4010
只有part_key=0的附加到數據庫中.
步驟7: 把其餘分區附加到數據庫
繼續修改OLH提供的oraloader-dp.sql的文件, 咱們也能夠其餘的數據附加到數據庫.
檢查腳本文件並運行之:
SQL> !cat lab3.7_load_rest_dpfile_as_ext_tab.sql
DROP TABLE "SCOTT"."EXT_OLH_REST_PARTED_TABLE";
CREATE TABLE "SCOTT"."EXT_OLH_REST_PARTED_TABLE"
(
"PART_KEY" NUMBER,
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION
(
'oraloader-00000-dp-2.dat',
'oraloader-00000-dp-3.dat'
)
);
SQL>@ lab3.7_load_rest_dpfile_as_ext_tab.sql
步驟8: 再次檢查結果
SQL> select count(*) from EXT_OLH_REST_PARTED_TABLE;
5990
正好是part_key=1和part_key=2的數據。
實驗4: 裝載多個Hadoop文件
OLH 也支持同時裝載多個文件到同一個表裏面。在實驗4中,咱們將測試這個功能.
步驟1: 建立目標表
和實驗1同樣,建立目標表.
檢查腳本文件並運行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab4.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab4.1_target_tab.sql;
步驟2: 在Hadoop中放入示例文件
往Hadoop中放入多個示例文件.
檢查腳本文件並運行之:
PROMPT> cat ./lab4.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
hadoop fs -put olh_lab.dat olh_lab_in/data2.dat
hadoop fs -put olh_lab.dat olh_lab_in/data3.dat
hadoop fs -put olh_lab.dat olh_lab_in/data.txt
PROMPT> ./lab4.2_init_hadoop_files.sh
步驟3: 運行Oracle Hadoop裝載程序,使用文件名通配符
運行OLH以前,編輯MyConf.xml,mapred.input.dir 參數改成帶通配符的形式:olh_lab_in/*.dat. 把 mapreduce.outputformat.class 改回 oracle.hadoop.loader.lib.output.JDBCOutputFormat, 把 oracle.hadoop.loader.loaderMapFile改回files:///home/hadoop/training/OLH/loaderMap_lab.xml. 固然, 也能夠直接在命令行中指定.
PROMPT> vi MyConf.xml
…
<property>
<name>mapred.input.dir</name>
<value>olh_lab_in/*.dat</value>
</property>
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.JDBCOutputFormat</value>
</property>…
<property>
<name>oracle.hadoop.loader.loaderMapFile</name>
<value>files:///home/hadoop/training/OLH/loaderMap_lab.xml</value>
</property>…
檢查腳本文件並運行之:
PROMPT> cat ./lab4.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.JDBCOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab.xml \
-Dmapred.input.dir=olh_lab_in/*.dat
PROMPT>./lab4.3_run_loader.sh
步驟4: 檢查結果
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
30000
返回30000的結果是由於 olh_lab_in/*.dat 匹配到3個輸入文件.
步驟5: 運行Oracle Hadoop裝載程序,使用文件名列表
運行OLH以前,編輯MyConf.xml,mapred.input.dir 參數改成件名列表的形式:
olh_lab_in/data.dat, olh_lab_in/data.txt。 固然,也能夠直接在命令行中指定.
PROMPT> vi MyConf.xml
…
<property>
<name>mapred.input.dir</name>
<value>olh_lab_in/data.dat, olh_lab_in/data.txt</value>
</property>
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.JDBCOutputFormat</value>
</property>
…
檢查腳本文件並運行之:
PROMPT> cat ./lab4.5_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.JDBCOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab.xml \
-Dmapred.input.dir=olh_lab_in/data.dat,olh_lab_in/data.txt
PROMPT>./lab4.5_run_loader.sh
步驟6: 再次檢查結果
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
返回50000的結果是由於olh_lab_in/data.dat,olh_lab_in/data.txt匹配到2個輸入文件.