首页 > 解决方案 > 如何在 Oracle 数据库中循环遍历数组并插入记录?

问题描述

我有一个可以添加额外字段的表单。用户可以根据需要添加任意数量的字段。一旦他们提交表单,我需要遍历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。如您所见,主题和描述列的上述值是硬编码的。我正在尝试找到输出数组索引值的方法。因此,例如,如果我的数组有这个值[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">

上面的代码是错误的,我不能在另一个 ## 中包含 ##。有没有办法获得i附加到columnand的实际值datadescr?它们看起来像:

column1   datadescr1
column3   datadescr3
column2   datadescr2

我是甲骨文世界的新手,这是我无法弄清楚的。任何帮助将不胜感激。

标签: oracleoracle11gcoldfusioninsertcfloop

解决方案


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

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

或者

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

然后在您的查询中使用此变量。另外关于您的查询:您需要将 Insert Into 设置在循环内或从 dual 使用。这个问题应该有助于 在 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>

推荐阅读