Oracle,使用utl_file和外部表将csv字符串保存/映射到表

时间:2011-03-30 06:53:30

标签: oracle

我使用pl / sql过程调用webservice。这个webservice给我一个大的csv-string,我把它放在clob中。由于我不想用脚解析csv,我想到使用外部表。所以我需要做的是将csv数据存储在相应的表中。

我目前正在做的是,我使用utl_file存储clob。存储的文件在外部表中定义。好的,当我是唯一一个非常好用的用户时。但由于DB是多用户,我必须注意是否有其他人正在调用该过程并覆盖外部表数据源文件。什么是避免表数据源混乱的最佳方法?或者将cvs-sting存储到表中的最佳方法是什么?

由于 克里斯

3 个答案:

答案 0 :(得分:1)

您希望确保该过程最多只能运行一个会话。有几种方法可以实现这一目标:

  • 最简单的方法是在过程开始时锁定特定行(SELECT ... FOR UPDATE NOWAIT)。如果锁定成功,请继续使用您的批次。如果失败则意味着该过程已由另一个会话执行。当程序结束时,无论是成功还是失败,锁定都将被释放。只有当您的过程不执行中间提交(这将在过程结束之前释放锁定)时,此方法才有效。
  • 您还可以使用DBMS_LOCK包来请求特定于您的程序的锁。使用DBMS_LOCK.request过程请求锁定。您可以要求锁定仅在会话结束时释放(这将允许进行中间提交)。
  • 您也可以使用AQ(Oracle排队系统),但我对AQ的经验不多,所以我不知道这是否是一种明智的方法。

答案 1 :(得分:0)

也许你应该为每个CSV生成临时文件名?类似的东西:

SELECT TO_CHAR(systimestamp, 'YYYYMMDDHH24MISSFF') filename FROM dual

答案 2 :(得分:0)

您可以使用UTL_FILE.FRENAME。

在类似情况下,我将external_table指向一个文件(例如“fred.txt”)。 当我获得一个新的源文件时,我使用UTL_FILE.FRENAME尝试将其重命名为fred.txt。如果重命名失败,则另一个进程正在运行,因此您将返回忙碌错误或等待或等等。

文件处理完毕后,我再次重命名(通常带有一些date_timestamp)。