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