例程 [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 />
我正在使用 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 />