【问题标题】:Data Insert Issue from Coldfusion to Oracle从 Coldfusion 到 Oracle 的数据插入问题
【发布时间】:2014-06-05 06:58:03
【问题描述】:

我正在读取一个文本文件,并创建了一个如下字符串以将数据插入数据库 (Oracle 11g)。

INSERT ALL
INTO INDEX_DATA (DATETIME, COMMODITY, IDX, IDX_VALUE, VCDATE) VALUES ('15-May-2014', 'FN1 Comdty', 'PX_LA', 44.75, SYSDATE)
INTO INDEX_DATA (DATETIME, COMMODITY, IDX, IDX_VALUE, VCDATE) VALUES ('15-May-2014', 'FN1 Comdty', 'PX_H', 45.1, SYSDATE)
INTO INDEX_DATA (DATETIME, COMMODITY, IDX, IDX_VALUE, VCDATE) VALUES ('15-May-2014', 'FN1 Comdty', 'PX_L', 44.47, SYSDATE)
and so on ...7000 rows
select * from dual

在一次插入上述查询时,coldfusion 页面超时。该查询适用于 100 条记录。

我真的不确定这是 Oracle 还是 Coldfusion 限制,因为 Toad 也没有响应相同的查询。

如果是冷融合问题,请告知是否有另一种插入数据的方法,而不是为每个插入语句访问数据库。

编辑 1:如果不存在其他解决方案,我可以使用标志并每隔 n 行插入一次。

【问题讨论】:

  • 为什么不使用文本文件作为输入来定义一个外部表呢?生成这种 SQL 不是一个很好的解决方案,它会用垃圾填充共享池,导致许多额外的解析并减慢整个数据库的速度。插入期间会话有哪些等待事件? (查看 v$session)
  • 如果您可以访问 Oracle 的批量加载程序,那将是更好的方法。

标签: oracle coldfusion oracle11g coldfusion-9


【解决方案1】:

我会推荐 2 项操作。首先设置请求超时以覆盖您的默认设置。其次,将您的插入语句加载到一个数组中,循环它们,并定期提交。这是一个演示该行为的简单示例。预期的结果是它会在第 12 条记录出现错误之前将 10 个字母插入 tmp 表。前 10 个将被提交。

<cfsetting requesttimeout="3600"><!--- This is the number of seconds that before coldfusion will timeout your request.  Change it to an appropriate value for your situation.  It can't override timeouts on the database side --->
<cfscript>
    sqlStatements=[
"INSERT INTO tmp (letter) values ('a')"
,"INSERT INTO tmp (letter) values ('b')"
,"INSERT INTO tmp (letter) values ('c')"
,"INSERT INTO tmp (letter) values ('d')"
,"INSERT INTO tmp (letter) values ('e')"
,"INSERT INTO tmp (letter) values ('f')"
,"INSERT INTO tmp (letter) values ('g')"
,"INSERT INTO tmp (letter) values ('h')"
,"INSERT INTO tmp (letter) values ('i')"
,"INSERT INTO tmp (letter) values ('j')"
,"INSERT INTO tmp (letter) values ('k')"
,"INSERT INTO tmp (letter) values ('l')"
,"INSERT INTO tmp (letter) values ('m')"
,"INSERT INTO tmp (letter) values ('n')"
,"INSERT INTO tmp (letter) values ('o')"
,"INSERT INTO tmp (letter) values ('p')"
,"INSERT INTO tmp (letter) values ('q')"
,"INSERT INTO tmp (letter) values ('r')"
,"INSERT INTO tmp (letter) values ('s')"
,"INSERT INTO tmp (letter) values ('t')"
];
commitafter="5";
throwafter="12";
qryInsert= new Query();
qryInsert.setDatasource("yourdatasourcename");
transaction{
    statementCount=0;
for (sqlStatement in sqlStatements){
        statementCount=statementCount+1;
        qryInsert.setSQL(sqlStatement);
        qryInsert.execute();
        if (statementCount eq throwafter) {
            throw (message="manual throw for testing");
        }
        if (statementCount MOD commitafter eq 0){
            transaction action="commit";
        }
    }
    transaction action="commit";
}
</cfscript>

【讨论】:

  • 您可能会发现您不必增加超时时间。
  • 太棒了。谢谢@Gerry。现在批量提交数据。虽然,对于coldfusion页面调试中的每个插入语句,我都收到了这个奇怪的异常Expression Exception - in C:\ColdFusion9\CustomTags\com\adobe\coldfusion\base.cfc : line 375 Cannot find qrynameXXXX key in structure.。有什么想法吗?
  • 只是猜测,没有测试,但试试这个:qryInsert.setName("myName");您可以向它添加一个迭代器以使每个名称都不同,例如这个 qryInsert.setName("myName" & i);假设这些只是警告而不是停止您的代码。我也在运行 CF10,所以这可能是一个微小的差异
  • 是的@GerryGurevich,只是警告;数据按预期插入。该问题与以下链接中的问题类似,但答案并未解决问题; setName 都不起作用。 stackoverflow.com/questions/19349122/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
相关资源
最近更新 更多