【问题标题】:Oracle external tablesOracle 外部表
【发布时间】:2014-05-30 20:55:38
【问题描述】:

尽管我研究了 Oracle 论坛,但我正在努力使用 Oracle 外部表。仍然没有成功。

假设我有一个简单的表格

DESCRIBE PRODUCTS
Name                           Null     Type                                                                                                                                                                                          
------------------------------ -------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
ID                             NOT NULL NUMBER                                                                                                                                                                                        
NAME                                    VARCHAR2(30)                                                                                                                                                                                  
VALUE                                   NUMBER(5,2)                                                                                                                                                                                   
DEP                                     VARCHAR2(30)                                                                                                                                                                                  
COUNT                                   NUMBER(3)     

然后,我创建了一个 oracle 文件夹:

CREATE OR REPLACE DIRECTORY ext_prod_dir AS 'c:\';

我将该表的内容保存在 .lst 文件中

spool c:\products.lst
select p.id || ';' || p.name || ';' || p.value  || ';' || p.dep || ';' || p.count FROM products p;
spool off;

P.ID||';'||P.NAME||';'||P.VALUE||';'||P.DEP||';'||P.COUNT                                                                                                                                
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
1;Settlers of Catan;29,95;Toys;3                                                                                                                                                         
2;DVD Player;82,97;Electronics;2                                                                                                                                                         
3;Red Shirt;12,49;Clothes;3                                                                                                                                                              
4;Black Leather Couch;399,99;Furniture;5                                                                                                                                                 
5;Oak Cofee Table;223,99;Furniture;5                                                                                                                                                     
6;Technodrome;27,99;Toys;4                                                                                                                                                               
7;Oh Cereal;3,95;Foods;1                                                                                                                                                                 
8;Game Console;299,95;Toys;2                                                                                                                                                             
9;Video Game;29,95;Toys;3                                                                                                                                                                
10;Lawn Chair;34,99;Furniture;11                                                                                                                                                         
11;Dog Toy Bone;34,99;Toys;9                                                                                                                                                             
12;Heated Blanket;27,95;Toys;8                                                                                                                                                           
13;Flux Capacitor;27,95;Toys;7                                                                                                                                                           
14;Chocolate Pie;3,14;Foods;7

然后我尝试创建外部表:

CREATE TABLE products_ext 
  (ID NUMBER, 
  NAME VARCHAR2(30),
  VALUE NUMBER(5,2),
  DEP VARCHAR2(30),
  COUNT NUMBER(3)) 
  ORGANIZATION EXTERNAL 
  (TYPE oracle_loader DEFAULT DIRECTORY ext_prod_dir 
  ACCESS PARAMETERS 
      (RECORDS DELIMITED BY NEWLINE 
      FIELDS TERMINATED BY ';'
      MISSING FIELD VALUES ARE NULL 
      BADFILE ext_prod_dir:'products.bad_xt'
      LOGFILE ext_prod_dir:'products.log_xt'

      (ID CHAR(6),
      NAME CHAR(30),
      VALUE CHAR(8),
      DEP CHAR(30),
      COUNT CHAR(3))) 
      location ('products.lst')
      ) REJECT LIMIT UNLIMITED

到目前为止一切顺利。然后当我从外部表中选择数据时,我得到了:

ORA-29913: error in executing ODCIEXTTABLEOPEN callout 
ORA-29400: data cartridge error 
KUP-00554: error encontered while parsing access parameters 
KUP-01005: syntax error: found "badfile": expecting one of: "column (,reject"
KUP-01007: at line 4 column 7

我尝试了大量的东西,但我得到了这个错误的变化。我完成的最好的事情是我摆脱了错误,但桌子是空的。如果有更多经验的人能指出正确的方向,我将非常感激。

【问题讨论】:

    标签: oracle external-tables


    【解决方案1】:

    BADFILE 和 LOGFILE 不是 FIELDS 子句的一部分。因此,将它们移到 FIELDS TERMINATED 上方。

    CREATE TABLE products_ext
      (ID NUMBER,
      NAME VARCHAR2(30),
      VALUE NUMBER(5,2),
      DEP VARCHAR2(30),
      COUNT NUMBER(3))
      ORGANIZATION EXTERNAL
      (TYPE oracle_loader DEFAULT DIRECTORY ext_prod_dir
      ACCESS PARAMETERS
          (RECORDS DELIMITED BY NEWLINE
          BADFILE ext_prod_dir:'products.bad_xt'
          LOGFILE ext_prod_dir:'products.log_xt'
          FIELDS TERMINATED BY ';'
          MISSING FIELD VALUES ARE NULL
          (ID CHAR(6),
          NAME CHAR(30),
          VALUE CHAR(8),
          DEP CHAR(30),
          COUNT CHAR(3)))
          LOCATION ('products.lst')
          ) REJECT LIMIT UNLIMITED
    

    另外,你说当你摆脱错误时,表是空的。你检查过日志文件吗?如果错误与 VALUE 列有关,则检查 NLS_NUMERIC_CHARACTERS 参数 查看 v$nls_parameters。

    select * from v$nls_parameters;
    

    检查小数点是否确实是逗号。如果不是,则更新此参数或在数据文件中更改它。

    【讨论】:

    • 好的,所以我在将它们移到 FIELDS TERMINATED 上方后消除了错误,但现在表格又是空的。在日志文件中显示 KUP-04021:字段 ID 的字段格式错误。 id 字段可能有什么问题?
    • @user3139925 - 您的.lst 文件是否仍包含查询中的列标题? P.ID||' 会出错。您应该在生成文件时删除标题或set heading off
    • 嘿,非常感谢!我删除了标题。我用“。”替换了“,”字符。每一行都以“;”结尾。我的 .lst 文件看起来像 1;Settlers of Catan;29.52;Toys;3;
      2;DVD Player;82;Electronics;2;
      ...现在,当我 SELECT * FROM products_ext 它显示只有第一行。不过,向前迈了一步。还能是什么?
    • @user3139925 - 日志文件现在说什么错误?
    • @user3139925 - 使用此答案中的控制文件和没有标题的数据,我从表中得到 14 行。你的只给你看DVD播放器吗? NLS_NUMERIC_CHARACTERS 的事情可能是一个红鲱鱼;如果您的查询使用, 作为小数分隔符,那么外部表也将使用,它需要保持一致(无论如何对于会话)。但是,如果现在是错误的,您的日志文件将显示 ORA-01722 错误。 (另外,请考虑使用set trimspool on,这样您就不需要添加尾随;)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多