如何遍历数组并在Oracle数据库中插入记录?

时间:2018-11-19 16:25:08

标签: oracle oracle11g coldfusion insert cfloop

我有一个可以添加其他字段的表单。用户可以根据需要添加任意多个字段。他们提交表单后,我需要遍历from范围并在ORACLE数据库中插入记录。这是我的代码示例:

<cfquery name="insertRec" datasource="dbs">
    INSERT INTO myTbl(
        RecordID, First, Last, Email, Subject, Description, ActionDt
    ) VALUES
    <cfset count = 1>
    <cfloop from="1" to="#arrayLen(arrData)#" index="i">
    (
        SYS_GUID(),
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.first)#" maxlength="50">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.last)#" maxlength="50">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.email)#" maxlength="320">,
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.column1)#" maxlength="100">, 
        <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.datadescr1)#" maxlength="4000">, 
        CURRENT_TIMESTAMP
    )
    <cfif count NEQ arrayLen(arrDpr)>,</cfif>
    <cfset count++>
</cfloop>

当我尝试测试上面的代码时,第一个问题是使用我的Oracle Insert语句。我收到错误消息:

[Macromedia][Oracle JDBC Driver][Oracle]ORA-00933: SQL command not properly ended

我查看了错误消息,Oracle插入代码如下:

INSERT INTO myTbl(
    RecordID, First, Last, Email, Subject, Description, ActionDt
) VALUES ( 
    SYS_GUID(), 
    (param 1) , 
    (param 2) , 
    (param 3) , 
    (param 4) , 
    (param 5) , 
    CURRENT_TIMESTAMP 
) , 
( 
    SYS_GUID(), 
    (param 1) , 
    (param 2) , 
    (param 3) , 
    (param 4) , 
    (param 5) , 
    CURRENT_TIMESTAMP
) , 
( 
    SYS_GUID(), 
    (param 1) , 
    (param 2) , 
    (param 3) , 
    (param 4) , 
    (param 5) , 
    CURRENT_TIMESTAMP
)

上面的代码显然是错误的,并且SQL插入字符串的构建方式不正确。我想知道如何解决?在ColdFusion for ORACLE数据库中执行此操作的最佳方法是什么?

我还有另一个问题与ColdFusion和在cfqueryparam中输出数组索引有关。如您所见,上面的Subject和Description列的值是硬编码的。我正在尝试找到输出数组索引值的方法。因此,例如,如果我的数组具有此值[1,3,2],则在cfloop中,我需要在cfqueryparam中获取它:

<cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.column#i#)#" maxlength="50"> 
<cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.datadescr#i#)#" maxlength="500">

上面的代码是错误的,我不能在另一个##中使用##。有没有一种方法可以将icolumn的实际值附加到datadescr?它们看起来像:

column1   datadescr1
column3   datadescr3
column2   datadescr2

我是Oracle领域的新手,对此我无法弄清楚。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

要在cfqueryparam中输出正确的值,可以使用以下方法:

<cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(Evaluate('form.column#i#')#" maxlength="50">

<cfset tempCol = FORM["column#i#"]>

然后在查询中使用此变量。 另外关于您的查询: 您需要在循环内设置“插入到”或从“双重”使用。这个问题应该有所帮助 Best way to do multi-row insert in Oracle?

    INSERT INTO myTbl(
    RecordID, First, Last, Email, Subject, Description, ActionDt
)
    <cfset count = 1>
        <cfloop from="1" to="#arrayLen(arrData)#" index="i">
        (
           select SYS_GUID(),
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.first)#" maxlength="50">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.last)#" maxlength="50">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.email)#" maxlength="320">,
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.column1)#" maxlength="100">, 
            <cfqueryparam cfsqltype="cf_sql_varchar" value="#trim(form.datadescr1)#" maxlength="4000">, 
            CURRENT_TIMESTAMP
        ) from dual
        <cfif count NEQ arrayLen(arrDpr)> union all </cfif>
        <cfset count++>
    </cfloop>