我需要使用oracle apex或pl / sql代码将csv加载到DB中,但问题是他们要求加载csv文件,该文件不会带有相同数量的列和列名。
我应该创建表&根据我上传的文件名和数据动态上传数据。 对于每个文件,我需要动态创建一个新表并插入csv文件中的数据。
例如:
File1中: col1 col2 col3 col4(注意:如果我上传文件1,表格应根据文件名动态创建,表格应包含与csv文件列标题相同的列名和数据。)
文件2: col1 col2 col3 col4 col 5
文件3: col4 col2 col1 col3
根据列和文件名,我需要为每个文件上传创建表。 我们可以这样加载吗? 如果有,请帮助我。
此致 萨钦。
答案 0 :(得分:1)
((这个解决方案中的PL / SQL代码在哪里!! ??!忍受我...... 答案被埋在这里......我介绍了一些注意事项 并且在进入之前需要考虑的假设 任务。最后,您会发现Oracle APEX实际上有一个 内置的解决方案,完全满足您指定的...用 一些警告。))
如果您在Oracle APEX平台上工作,您将获得一些优势。 APEX版本4.2及更高版本具有名为“数据加载”的新页面元素。然而,缺点是上传目标的定义是固定的而不是动态的。在加载数据之前,您需要知道表格的结构。
解决此问题的一种方法是构建一个通用的双列表作为目标,该表将用于所有上传。第1列将是您的文件名,第2列将是单个clob数据类型,它将包含整个数据文件的内容,包括标题行。 “数据加载”元素将使用户有机会通过几次单击验证并选择此映射约定。
此时,主要是PL / SQL后端工作正在进行繁重的工作来解析和转换上传的数据。就动态表创建而言,我注意到Oracle包DBMS_SQL允许执行DDL SQL命令,这可能是制作自定义表的途径。
Alex Poole的评论也很重要,您需要对数据类型做一些一揽子假设,或者提供更多关于包含哪种数据的线索。假设您可以依赖现有数据值的样本并不好......如果您上传的所有值都为空,该怎么办?我建议数据输入中的第二列可能有关于每列的数据类型的线索......就像预期的标题名称一样,可能是:AAAAA =五个字符列,#=表示数字,MM / DD / YYYY =具有特定屏蔽的日期。
更简单的路线: 您需要允许最终用户访问APEX服务器工作区上的开发人员角色帐户。它并不像你想象的那么可怕。通过仔细的指导和一些简单的预防措施,即使是非技术性的用户,我也能够完成这项工作。原因是在以下菜单项下有一个更强大的上传工具:
SQL Workshop - >实用程序 - >数据研讨会
“数据加载”下有一个选项 - > “电子表格数据”
数据加载工具将自动执行以下操作:
用户确定所有这些映射和设置后,将使用上载的数据创建表。之后立即报告记录上传中的任何错误,并对失败的记录进行详细反馈。
要注意的安全考虑因素: 您可能不希望让最终用户访问您的APEX服务器的后端...但您可以创建一个新的工作区...仅适用于您的最终用户...创建一个新的数据库架构来接收他们的上传,可能需要一些小心资源控制。开发人员是所需的最小角色......但即使最终用户看到其他内容,也无法访问孤立工作区中的任何重要内容。
几年前,我在4.0 / 4.1版APEX平台上实现了隔离工作区方法,并且运行良好。我们的最终用户可以控制其数据输入的分段和质量检查(来自从源组合中收集的excel电子表格/ csv导出)。我认为将她完全从图片中删除可能更好,并专注于自动化我们的数据库和其他来源之间的导出 - 审阅 - 上传过程。在这种情况下,涉及的数据量不够大(100到1000的记录),在将数据推入数据库之前,需要手动审查和编辑导出的数据非常重要...所以人为因素是在这种情况下仍然很重要 - 这是你现在想要考虑的事情。