【问题标题】:How to use external table feature to load .dat file如何使用外部表功能加载 .dat 文件
【发布时间】:2025-12-31 06:25:10
【问题描述】:

我希望使用 oracle 外部表功能导入 .dat 文件。 文件格式如下,文件名为test_210228053753.dat

00000000000005000.00517081233434 28/02/2021 781750202索赔福利支出 781344 00000000000002500.00517081233431 28/02/2021 825229202索赔福利支出 825401 00000000000060000.00517081233433 28/02/2021 452211023索赔福利支出 452001 00000000000075000.00517081233432 28/02/2021 411002002索赔福利支出 411015

请求您帮助...

提前致谢。

【问题讨论】:

  • 无法帮助您了解实际规则,因为这种文件格式并不能真正告诉我们任何事情。也就是说,任何外部表实现都需要 DBA 的帮助。你的用例是什么,你从哪里加载数据(即网络客户端,或从数据库服务器本身)?您是否有权访问数据库服务器上的目录、数据库中的 DBA 权限或创建 DIRECTORY 对象的能力?
  • Oracle 文档提供了有关外部表的完整部分。它应该给你一个更好的起点,在这个网站上提出一般性问题。 Find it here (link)。另外,请记住,外部表的大多数问题都是系统配置问题,您的 DBA 将比我们更好地为您提供帮助。

标签: oracle plsql oracle-sqldeveloper external-tables


【解决方案1】:

一步一步:

作为特权用户 (SYS),创建一个目录(指向包含输入数据文件的文件系统目录的 Oracle 对象)。向将读取该文件的用户授予权限。

SQL> show user
USER is "SYS"
SQL> create or replace directory ext_dir as 'c:\temp';

Directory created.

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

Grant succeeded.

连接为SCOTT,我正在创建一个外部表,它将从输入文件中选择数据。您发布的示例数据表明其列的大小是固定的。如果您的意思是说它们是空格分隔的,那么它们很可能不是,因为在这种情况下无法加载“索赔福利支出”(除非它实际上是 3 个不同的列)。由于您没有解释,我认为它的列的大小是固定的。

SQL> connect scott/tiger
Connected.

SQL> create table test1
  2    (col1    char(35),
  3     col2    char(10),
  4     col3    char(10),
  5     col4    char(20),
  6     col5    char(10)
  7    )
  8  organization external
  9    (type oracle_loader
 10     default directory ext_dir
 11     access parameters
 12       (records delimited by newline
 13        fields ldrtrim
 14          (col1  ( 1:32)   char,
 15           col2  (34:43)   char,
 16           col3  (45:53)   char,
 17           col4  (54:73)   char,
 18           col5  (75:80)   char
 19          )
 20       )
 21     location ('test1.txt')
 22    )
 23  reject limit unlimited;

Table created.

有效吗?

SQL> select * From test1;

COL1                                COL2       COL3       COL4                 COL5
----------------------------------- ---------- ---------- -------------------- ----------
00000000000005000.00517081233434    28/02/2021 781750202  Claim Benefit Payout 781344
00000000000002500.00517081233431    28/02/2021 825229202  Claim Benefit Payout 825401
00000000000060000.00517081233433    28/02/2021 452211023  Claim Benefit Payout 452001
00000000000075000.00517081233432    28/02/2021 411002002  Claim Benefit Payout 411015

SQL>

【讨论】:

  • 嗨,谢谢您的回复....但是我必须加载.dat文件...所以我需要将位置('test1.txt')替换为位置('test1.txt') dat')?
  • 当然;您必须完全按原样指定文件名。