我有一个可以添加其他字段的表单。用户可以根据需要添加任意多个字段。他们提交表单后,我需要遍历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">
上面的代码是错误的,我不能在另一个##中使用##。有没有一种方法可以将i
和column
的实际值附加到datadescr
?它们看起来像:
column1 datadescr1
column3 datadescr3
column2 datadescr2
我是Oracle领域的新手,对此我无法弄清楚。任何帮助将不胜感激。
答案 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>