【问题标题】:importing CSV data in Oracle (trying Apex/SQL Developer)在 Oracle 中导入 CSV 数据(尝试 Apex/SQL Developer)
【发布时间】:2012-04-14 00:54:24
【问题描述】:

我最初在超级用户上问过这个问题,但有人建议我在这里重新发布。

我正在使用最新版本的 APEX (4.1.1) 和 Oracle (11.2.0.3)。

我正在将 CSV 数据上传到一组表。 我一直在尝试,遇到了一些我以前没有遇到过的问题。

例如,我尝试将数据导入此表:

CREATE TABLE SW_ENGINEER 
   (ENGINEER_NO VARCHAR2(10), 
          ENGINEER_NAME VARCHAR2(50), 
           CONSTRAINT SW_ENG_PK PRIMARY KEY (ENGINEER_NO))

在这个简化的数据子集上失败了:

call log no,contract_no,call date,agreed date,agreed time,actual arrive,engineer no,engineer name,equipment code,cust desc,eng desc
a,b,c,22-Mar-06,1,23/03/2006 15:00,654,Flynn Hobbs,d,e,f
a,b,c,22-Mar-06,2,23/03/2006 15:00,654,Flynn Hobbs,d,e,f
a,b,c,19-Mar-06,3,19/03/2006 09:15,351,Rory Juarez,d,e,f

(在更大的数据集上以同样的方式失败) 我无法使用 APEX 或 SQL Developer 加载它,如下所示:

  • APEX:使用 APEX Data Workshop,导入文本,加载现有表格,使用逗号分隔,选择表格和文件,勾选“标题行”复选框,我们就有了显示正确数据的列映射表单。然后将除engineer_no 和engineer_name 之外的所有列设置为“No”,然后点击Load Data。

这似乎有效,并在文本数据加载存储库中显示了一个摘要行,但在检查时它已加载 0 行和 79 行失败。单击 79 表明它们都患有“ORA-01008: not all variables bound”。所选列对我来说看起来不错,所以我想知道尽管设置为“否”,但它是否仍包括其他一些列?

如果我在上传之前编辑 csv 以删除不相关的列,则不会出现此问题,但如果我可以使用列映射会容易得多。

  • SQL Developer:使用 SD 中的导入数据向导,我发现它不会进行列映射,除非选中 Header Row(按钮已启用但不起作用 - 为什么不呢?), - 但如果它被检查(在这种情况下是正确的)然后验证步骤失败,因为“表列 Engineer_no 不够大......”。

我发现可以通过从 csv 文件列中删除标题值来克服这个问题。因此,似乎设置 Header Row 复选框实际上并不会导致它完全忽略标题行,而是标题值“engineer-no”导致了错误。这对我来说似乎不对。 我过去使用这两种方法都没有问题,我想知道最近的升级是否与此有关。

有什么想法吗?还是我遗漏了一些明显的东西?

【问题讨论】:

  • csv 文件中的任何字段中是否包含,
  • 是的,但随后它们被引用为“like, this”
  • 您是否测试过没有此类字段的简单 1 行或 2 行 csv。还有 1 或 2 行带有此类字段的 csv?如果前者失败了,那你的问题就更大了。如果前者成功而后者失败,那么您已经隔离了问题。如果两者都成功,那么您的数据中还有其他一些特殊性。在 Excel 中分析它。
  • 即使是前三行(我在这里包括的那些)也无法导入。我没有看到任何应该破坏导入的东西......但显然没有朝着正确的方向发展。
  • 赏金还剩几个小时...所以这是一个 APEX 错误,最糟糕的解决方法是将我们想要的列粘贴在 CSV 文件的左端,是吗?我觉得在这里奖励自己是愚蠢的:)

标签: sql oracle csv import oracle-apex


【解决方案1】:

我不太清楚为什么它不适合你。使用带有复制和粘贴功能的 Apex Data Workshop 对我来说效果很好。 (版本 5.0.4)

当然,我只能上传这三个结果中的两个,其中一个有重复的 ID 值。但它奏效了。

PS:对于较大的数据集,您可能将“,”作为行的列值的一部分,请考虑使用“可选括在”选项,方法是在上传期间使用双引号 (") 设置它们向导。它将整个值视为一个值。

【讨论】:

    【解决方案2】:

    在 CSV 中

    call log no,contract_no,call date,agreed date,agreed time,actual arrive,engineer no,engineer name,equipment code,cust desc,eng desc
    a,b,c,22-Mar-06,1,23/03/2006 15:00,654,Flynn Hobbs,d,e,f
    a,b,c,22-Mar-06,2,23/03/2006 15:00,654,Flynn Hobbs,d,e,f
    a,b,c,19-Mar-06,3,19/03/2006 09:15,351,Rory Juarez,d,e,f
    

    您有 11 列,您尝试将其导入 3 列。

    1. 如果您在 csv 中有 ",则应将其全部删除。
    2. 您需要在此 CSV 的表中恰好有 11 列。
    3. 表中的每一列都可以有正确的数据类型。
    4. CSV 中的每个 , 都是一个列分隔符。

    【讨论】:

      【解决方案3】:

      我的一位同事找到了这个(不完全令人满意的)解决方案:

      如果您需要的列都在开头,则可以使用,如下所示:

      engineer no,engineer name,equipment code,cust desc,eng desc,call log no,contract_no,call date,agreed date,agreed time,actual arrive
      654,Flynn Hobbs,d,e,f,a,b,c,22-Mar-06,1,23/03/2006 15:00
      654,Flynn Hobbs,d,e,f,a,b,c,22-Mar-06,2,23/03/2006 15:00
      351,Rory Juarez,d,e,f,a,b,c,19-Mar-06,3,19/03/2006 09:15
      

      所以它看起来像是 APEX 文本导入中 YES/NO 包含功能的错误?

      【讨论】:

        猜你喜欢
        • 2020-07-31
        • 2019-01-06
        • 2021-09-20
        • 2013-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-27
        • 1970-01-01
        相关资源
        最近更新 更多