例程[procedurename]的存储过程错误OUT或INOUT参数1不是BEFORE触发器中的变量或NEW伪变量

时间:2017-03-12 21:34:49

标签: mysql coldfusion coldfusion-11

我使用ColdFusion代码调用存储过程:

<cffunction access="public" name="create" output="FALSE" returntype="numeric" hint="This function inserts a single bk_faqs record into the database." > 
        <cfargument name="faqQuestion" type="string" required="TRUE" default="" />
        <cfargument name="faqAnswer" required="TRUE" default="" />

        <cfset var faqID = "" />
        <cfset var results = "" />

        <cfstoredproc procedure="usp_bk_faqs_insert" datasource="#variables.datasource#">
            <cfprocparam type="OUT" cfsqltype="CF_SQL_INTEGER" variable="faqID" dbvarname="_faqID"  />
            <cfprocparam type="IN" cfsqltype="CF_SQL_VARCHAR" variable="faqQuestion" dbvarname="_faqQuestion" value="#arguments.faqQuestion#" maxlength="255"  />
            <cfprocparam type="IN" cfsqltype="cf_sql_longvarchar" variable="faqAnswer" dbvarname="_faqAnswer" value="#arguments.faqAnswer#"  />

            <cfprocresult name="results"  />
        </cfstoredproc>

        <cfset results = faqID />


        <cfreturn results />
    </cffunction>

使用我从MySQL站点下载的MySQL 5 jar和ColdFusion 11,我开始收到以下错误。在ColdFusion 10中,它是工作属性。

  

执行数据库查询时出错。

     对于例程bakeryshop.usp_bk_faqs_insert,

OUT或INOUT参数1是   BEFORE触发器中不是变量或NEW伪变量

     

错误发生在C:/ColdFusion11/cfusion/wwwroot/project1/cw4/admin/cfc/dao/dynamic/bk_faqs.cfc:line 112

3 个答案:

答案 0 :(得分:2)

这不是ColdFusion问题。这似乎是MySQL的问题。检查存储过程是否具有out变量faqID。存储过程应该

插入语句后的

SELECT @faqID; 或类似的返回 faqID

答案 1 :(得分:0)

有许多关于该错误的错误报告,例如this one。在这种情况下听起来可能是一个驱动程序问题。您可以尝试不同的版本,但根据错误报告的年龄和数量,以及5.1.39和5.1.41具有相同问题的事实,它不是好兆...

就个人而言,我会完全摆脱OUT参数,只需通过SELECT返回ID。然后按照评论中的建议使用cfprocresult捕获结果。假设您要从INSERT语句返回生成的ID,SQL将如下所示:

CREATE PROCEDURE `yourProcedureName`( ... IN parameters here ...)
BEGIN

    --- your INSERT statement here 

    -- Return newly generated ID  
    SELECT LAST_INSERT_ID() AS FaqID
END

答案 2 :(得分:0)

威利,

我强烈建议您从中删除type属性并完全删除out参数,而不是完成所有这些操作。默认情况下,类型为IN。如下所示更改您的程序调用,它应该有效:

         

<cfset var faqID = "" />
<cfset var results = "" />

<cfstoredproc procedure="usp_bk_faqs_insert" datasource="#variables.datasource#">
    <cfprocparam cfsqltype="CF_SQL_VARCHAR" variable="faqQuestion" dbvarname="_faqQuestion" value="#arguments.faqQuestion#" maxlength="255"  />
    <cfprocparam cfsqltype="cf_sql_longvarchar" variable="faqAnswer" dbvarname="_faqAnswer" value="#arguments.faqAnswer#"  />

    <cfprocresult name="results"  />
</cfstoredproc>

<cfset results = faqID />


<cfreturn results />