Oracle 查询-字符串文字太长或错误
我在Cold Fusion 11*工作,我得到以下错误:Oracle 查询-字符串文字太长或错误,oracle,coldfusion,coldfusion-11,Oracle,Coldfusion,Coldfusion 11,我在Cold Fusion 11*工作,我得到以下错误: ORA-01704: string literal too long. 首先,我收到了此错误,并在查看了多个站点后通过更改代码更正了此错误: <cfquery datasource="#dsn#"> update paragraphs set paragraph_text = #input# where paragraph_id=#rs_d.paragraph_id# </cfquery>
ORA-01704: string literal too long.
首先,我收到了此错误,并在查看了多个站点后通过更改代码更正了此错误:
<cfquery datasource="#dsn#">
update paragraphs
set paragraph_text = #input#
where paragraph_id=#rs_d.paragraph_id#
</cfquery>
---端函数
<cffunction name="cfstmt">
<cfargument name="sql">
<cfquery name="rs" datasource="#dsn#">
#PreserveSingleQuotes(sql)#
</cfquery>
</cffunction>
#保留单引号(sql)#
错误的原因是旧段落文本和新段落文本。我想知道是否有可能像我前面提到的问题/解决方案那样,为这个问题提供cfqueryparam类型的解决方案。我尝试像第一个一样直接包含它,但代码中出现编译错误。任何想法或提示都会很有帮助,谢谢。我建议重新安排您的逻辑,以确定
字段null
变量,然后这些变量将在cfqueryparam的null属性中使用。大概是这样的:
<cfscript>
fieldOneNull = conditionForNull ? true : false;
fieldTwoNull = conditionForNull ? true : false;
etc
</cfscript>
<cfquery>
insert into table
(field1, field2, etc)
values
(
<cfqueryparam cfsqltype="cf_sql_whatever" value="something" null="#fieldOneNull#">
, <cfqueryparam cfsqltype="cf_sql_whatever" value="something" null="#fieldTwoNull#">
, etc
)
fieldOneNull=conditionForNull?真:假;
fieldTwoNull=conditionForNull?真:假;
等
插入表格
(字段1、字段2等)
价值观
(
,
等
)
我建议重新安排您的逻辑,以确定字段null
变量,然后将这些变量用于cfqueryparam的null属性。大概是这样的:
<cfscript>
fieldOneNull = conditionForNull ? true : false;
fieldTwoNull = conditionForNull ? true : false;
etc
</cfscript>
<cfquery>
insert into table
(field1, field2, etc)
values
(
<cfqueryparam cfsqltype="cf_sql_whatever" value="something" null="#fieldOneNull#">
, <cfqueryparam cfsqltype="cf_sql_whatever" value="something" null="#fieldTwoNull#">
, etc
)
fieldOneNull=conditionForNull?真:假;
fieldTwoNull=conditionForNull?真:假;
等
插入表格
(字段1、字段2等)
价值观
(
,
等
)
谢谢你的建议。我没有修改应用程序不同区域中使用的现有函数,而是在调用函数以处理CLOB的位置添加了一个新的insert语句。为了处理空字段,我使用了case
语句
<cfquery datasource="#dsn#">
insert into log (
LOG_ENTRY_ID, program_id, paragraph_id, userid, action, paragraph_text_old
, paragraph_text_new, comment_id, current_program_status, new_program_status
)
values (
null ,#program_id#,(case when #paragraph_id# = '' then null else #paragraph_id# end)
, #Session.userid# , 'Paragraph Updated'
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value=#rs_d.paragraph_text#>
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value=#input#>
, null, null , null
)
</cfquery>
插入日志(
日志条目ID、程序ID、段落ID、用户ID、操作、段落文本
,段落文本新,注释id,当前程序状态,新程序状态
)
价值观(
null,#程序#id#,#(当#段落#id#="时的情况,然后null其他#段落#id#结束)
,#Session.userid,#,'段落更新'
,
,
,空,空,空
)
谢谢你的建议。我没有修改应用程序不同区域中使用的现有函数,而是在调用函数以处理CLOB的位置添加了一个新的insert语句。为了处理空字段,我使用了case
语句
<cfquery datasource="#dsn#">
insert into log (
LOG_ENTRY_ID, program_id, paragraph_id, userid, action, paragraph_text_old
, paragraph_text_new, comment_id, current_program_status, new_program_status
)
values (
null ,#program_id#,(case when #paragraph_id# = '' then null else #paragraph_id# end)
, #Session.userid# , 'Paragraph Updated'
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value=#rs_d.paragraph_text#>
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value=#input#>
, null, null , null
)
</cfquery>
插入日志(
日志条目ID、程序ID、段落ID、用户ID、操作、段落文本
,段落文本新,注释id,当前程序状态,新程序状态
)
价值观(
null,#程序#id#,#(当#段落#id#="时的情况,然后null其他#段落#id#结束)
,#Session.userid,#,'段落更新'
,
,
,空,空,空
)
(注释太长)
希望限制代码,而不是确定空值
在查询之外,我添加了case语句
老实说,它并没有节省太多,因为代码本质上是以if/else两种方式执行的。除了现在,工作是在db端完成的,而不是它所属的应用服务器
在使用了大量遗留应用程序之后,我意识到它们经常包含您可能委婉地称之为“可疑”的代码;-)但是,您不应该在SQL中使用原始客户机变量。除非有很好的理由不这样做,否则请始终使用cfqueryparam
在内部,cfqueryparam
使用。最重要的两个好处是:
null
值
最后,就最佳实践而言,充分考虑所有变量也是一个好主意。例如,如果变量是在表单范围内提交的,那么最终查询可能如下所示。(根据需要修改cfsqltypes。)
插入日志(
程序id
,第
,用户ID
,行动
,段落_text _old
,段落_text _new
)
价值观
(
,
,
,“更新段落”
,
,
)
NB:除非为某列指定了不同的默认值,否则当从插入列表中省略该列时,将自动插入NULL
。(注释过长)
希望限制代码,而不是确定空值
在查询之外,我添加了case语句
老实说,它并没有节省太多,因为代码本质上是以if/else两种方式执行的。除了现在,工作是在db端完成的,而不是它所属的应用服务器
在使用了大量遗留应用程序之后,我意识到它们经常包含您可能委婉地称之为“可疑”的代码;-)但是,您不应该在SQL中使用原始客户机变量。除非有很好的理由不这样做,否则请始终使用cfqueryparam
在内部,cfqueryparam
使用。最重要的两个好处是:
绑定变量有助于防止文本值作为SQL命令执行,从而防止错误。这可以保护数据库不受包含恶意构建的SQL的值的影响
对于多次执行的查询,绑定变量还通过鼓励数据库重用执行计划来提高性能。否则,数据库可能会选择生成新的ex
<cfquery datasource="#variables.dsn#">
INSERT INTO into log (
program_id
, paragraph_id
, userid
, action
, paragraph_text_old
, paragraph_text_new
)
VALUES
(
<cfqueryparam value="#FORM.program_id#" cfsqltype="CF_SQL_INTEGER">
, <cfqueryparam value="#FORM.paragraph_id#" cfsqltype="CF_SQL_INTEGER" null="#NOT IsNumeric(FORM.paragraph_id)#">
, <cfqueryparam value="#Session.userid#" cfsqltype="CF_SQL_INTEGER">
, 'Paragraph Updated'
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value="#rs_d.paragraph_text#">
, <cfqueryparam cfsqltype="CF_SQL_CLOB" value="#FORM.input#">
)
</cfquery>