Oracle Loader for .xlsx文件

时间:2017-02-27 09:18:52

标签: excel oracle

我想将.xlsx文件加载到Oracle数据库表中。我的代码出错了。我通常将此代码用于.csv文件,但需要将其用于.xlsx我已经编辑了我的字段名称,表名等 这可能吗?

Drop TABLE Temp_Info;
      CREATE TABLE Temp_Info
                           (
                             Unique_Id varchar2(255)  ,  
                             Name varchar2(255),  
                             Alt_Name varchar2(255)
                           )
             ORGANIZATION EXTERNAL 
             ( 
               TYPE ORACLE_LOADER
               DEFAULT DIRECTORY SEPA_FILES 
               ACCESS PARAMETERS 
               ( 
                 records delimited by newline  
                 skip 1 
                 fields terminated by ',' 
                 missing field values are null
                 ( 
                  Unique ID -(filled automatically),Name,Alt Name
                 )
               ) 
               LOCATION ('Data_File.xlsx') 
             ) 
             REJECT LIMIT UNLIMITED;  

Select * From Temp_Info a;

Error Message: 9:16:55  ORA-29913: error in executing ODCIEXTTABLEOPEN callout
9:16:55  ORA-29400: data cartridge error
9:16:55  KUP-00554: error encountered while parsing access parameters
9:16:55  KUP-01005: syntax error: found "identifier": expecting one of: "comma, char, date, defaultif, decimal, double, float, integer, (, nullif, oracle_date, oracle_number, position, raw, recnum, ), unsigned, varrawc, varchar, varraw, varcharc, zoned"
9:16:55  KUP-01008: the bad identifier was: ID
9:16:55  KUP-01007: at line 6 column 30
9:16:55  ORA-06512: at "SYS.ORACLE_LOADER", line 14
9:16:55  ORA-06

2 个答案:

答案 0 :(得分:1)

1)选项[Pure PL / SQL]

Xlsx文档是压缩的xml文档集。您可以将扩展名xlsx更改为zip,解压缩并找出其中的内容。 Here描述了如何在oracle环境中处理xlsx文档。 这个解决方案有效但实现非常痛苦。

2)选项(PL / SQL + apache POI) 在java中创建实现。并在db中使用它。

3)将xlxs转换为csv。

答案 1 :(得分:0)

您可能需要查看ExcelTable SQL界面(免责声明:我是作者)。
它提供对.xlsx(或.xlsm)文件的访问作为外部表。

这是一个基于你的ext表定义的例子:

SELECT t.* 
FROM TABLE(
       ExcelTable.getRows(
         ExcelTable.getFile('SEPA_FILES','Data_File.xlsx')
       , 'Sheet_name_goes_here'      
       , ' "UNIQUE_ID" for ordinality
         , "NAME"      varchar2(255)
         , "ALT_NAME"  varchar2(255) '
       , 'A2'
       )
     ) t ;

(我假设UNIQUE_ID是某种自动生成的序列)