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

Stored procedure error OUT or INOUT argument 1 for routine [procedurename] is not a variable or NEW pseudo-variable in BEFORE trigger

我正在使用 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 中,它正在工作 属性。

Error Executing Database Query.

OUT or INOUT argument 1 for routine bakeryshop.usp_bk_faqs_insert is not a variable or NEW pseudo-variable in BEFORE trigger

The error occurred in C:/ColdFusion11/cfusion/wwwroot/project1/cw4/admin/cfc/dao/dynamic/bk_faqs.cfc: line 112

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

SELECT @faqID; 在插入语句之后,或类似的返回 faqID

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

就我个人而言,我会完全摆脱 OUT 参数,只通过 SELECT return ID。然后按照评论中的建议使用 cfprocresult 捕获结果。假设您想要 return 从 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

威利,

我强烈建议您删除类型属性并完全删除 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 />