Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 查询-字符串文字太长或错误_Oracle_Coldfusion_Coldfusion 11 - Fatal编程技术网

Oracle 查询-字符串文字太长或错误

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>

我在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>
---端函数

<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
使用。最重要的两个好处是:

  • 绑定变量有助于防止文本值作为SQL命令执行,从而防止错误。这可以保护数据库不受包含恶意构建的SQL的值的影响

  • 对于多次执行的查询,绑定变量还通过鼓励数据库重用执行计划来提高性能。否则,当查询参数更改时,数据库可能会选择生成一个新的执行计划,这是非常昂贵的

  • 还有其他一些不错的特性,比如“null”属性。当满足某些条件时,它可用于提交
    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>