Как перебрать массив и вставить записи в базу данных Oracle? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть форма с возможностью добавления дополнительных полей. Пользователь может добавить столько полей, сколько он хочет. Как только они отправят форму, мне нужно перебрать область действия 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 Ответ

0 голосов
/ 19 ноября 2018

Для вывода правильных значений в 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>
...