oracle - 如何在 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
附加到column
and的实际值datadescr
?它们看起来像:
column1 datadescr1
column3 datadescr3
column2 datadescr2
我是甲骨文世界的新手,这是我无法弄清楚的。任何帮助将不胜感激。
解决方案
要在 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>
推荐阅读
- snowflake-cloud-data-platform - 在将数据插入表时使用变量 - 雪花过程
- flutter - 如何在小部件上连续点击一次并在小部件像钢琴一样触摸钢琴键时执行一些操作?
- python - python仪表板滑块格式化返回值
- hive - 试图从 Hive insert into 语句中找出返回码 2
- github - Azure 自托管代理管道上的 Git
- c# - 如何使用 C# 搜索连续 XML 节点的值?
- javascript - 获取时间复杂度
- html - 将标签对齐到中间下拉选择框-Woocommerce
- python - 使用字符串格式隐藏请求标头中发送的 JSON 有效负载中的用户名和密码
- ubuntu - Conda 在 Ubuntu 18.04 上返回 HTTP 连接失败错误