Как перебрать массив и вставить записи в базу данных 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 Database?

Другая проблема, с которой я столкнулся, связана с 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">

Код выше неверен, и я не могу иметь ## внутри другого ##. Есть ли способ получить реальную стоимость i добавлен в column а также datadescr? Они будут выглядеть так:

column1   datadescr1
column3   datadescr3
column2   datadescr2

Я новичок в мире Oracle, и это то, что я не могу понять. Любая помощь будет принята с благодарностью.

1 ответ

Для вывода правильных значений в cfqueryparam вы можете использовать это:

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

Или же

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

А затем используйте эту переменную в своем запросе. Также касательно вашего запроса: вам нужно установить вашу вставку внутри цикла или использовать из двойного. Этот вопрос должен помочь Лучший способ сделать многострочную вставку в 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>
Другие вопросы по тегам