【问题标题】:why is my Coldfusion stored procedure not executed in MySql?为什么我的 Coldfusion 存储过程没有在 MySql 中执行?
【发布时间】:2012-06-02 14:34:32
【问题描述】:

我正在使用 Coldfusion8 并试图获得一个简单的存储过程来运行 MySQL id-lookup。

当我从 MySQL 内部启动该过程时,它正在工作。但是在我的 Coldfusion 页面上,什么也没有发生。

这是我的程序:

 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_select_extern`(IN `iln_to_match` VARCHAR(13))
     LANGUAGE SQL
     NOT DETERMINISTIC
     READS SQL DATA
     SQL SECURITY DEFINER
     COMMENT ''
  BEGIN

      SELECT tn.iln
      FROM   teilnehmer AS tn
      WHERE tn.iln = iln_to_match
      LIMIT 1;
  END

我在 Coldfusion 中的程序调用:

<cfstoredproc procedure="proc_select_extern" datasource="dns">
   <cfprocparam type="in" value="#Session.Extern#" cfsqltype="cf_sql_varchar" maxlength="13">
   <cfprocresult name="extern">         
</cfstoredproc>
<cfoutput query="extern">
    <p>Hello #extern.username#</p>
</cfoutput>

我想我至少会在 MySQL 中得到一个CALL proc_select_extern('value'); 报告,但我什至没有得到这个。

编辑:
所以我让它像这样在一个空页面上作为 CFQUERY 工作:

 <cfquery datasource="db" NAME="extern">
   SELECT tn.iln
   FROM teilnehmer AS tn
   WHERE tn.iln = #Session.Extern#
   LIMIT 1
 </cfquery>
 <cfdump var="#extern#">
 <cfoutput>#IsDebugMode()#</cfoutput>

现在尝试使用 storedProc。

【问题讨论】:

  • cfoutput 循环不是一个好的试金石。正如 Dave 建议的那样,启用调试,这样您就可以看到对数据库进行的任何调用。另外,尝试 cfdumping 整个查询,即 `cfdump var="#extern#"
  • @Leigh 通过在 URL 中添加 mode=debug 来启用调试?我也在尝试cfump。谢谢!
  • 必须在 CF 管理员中启用调试(并且允许您的 IP)。确定是否启用:&lt;cfoutput&gt;#IsDebugMode()#&lt;/cfoutput&gt;

标签: mysql stored-procedures coldfusion


【解决方案1】:

是否有某种形式的 ColdFusion 错误消息?另外,如果您在请求上启用了调试,您是否看到那里正在进行过程调用?

另外,只是一个观察。存储过程中的 SQL 非常基本(单表选择,没有连接)。将其作为存储过程将产生比内联查询更多的 sql 开销。使用存储过程不会提高性能。

【讨论】:

  • 我收到 Coldfusion 错误,即“extern.username 在变量中未定义”。但我不确定该过程是否已触发,因为我不应该在 MySQL 中获得 CALL 吗?
  • 关于存储过程:所以我不应该将其转换为存储过程?我继承了这个网站,并且仍在思考如何通过(CF 新手)的最佳方式。我认为将所有查询转换为存储过程至少会使数据库“可移植”。这是我开始的一个查询。有一堆更复杂的查询我还不敢碰(除了 cf-paraming all parameters,这还没有完成)
  • 如果您遇到错误,是否有可能在过程调用之前发生错误?如果是这样,过程调用就不会发生。
  • 转换为存储过程不会增加可移植性,但实际上会限制它。然后您被锁定到数据库类型(可能还有版本)。存储过程应该用于复杂的数据逻辑或减少数据库调用。
  • 就转换为存储过程而言,在我更熟悉整个应用程序之前,我个人不会进行如此彻底的更改。等到你了解全貌,因为你以后学到的东西可能会影响你的决定。只是我的 0.02 美元
【解决方案2】:

我没有在上面看到明确的答案。我遇到了同样的问题,并通过在 CF admin 中编辑数据源并在高级设置下,选中允许的 SQL 部分中的“存储过程”来修复它。

【讨论】:

    【解决方案3】:

    这对我有用:

    <cfquery name ="myQuery" datasource="mydataSource">
    call sp_myprocedure();
    </cfquery>
    

    一段时间以来,我一直在寻找解决此错误消息的方法,但一无所获。我在 Coldfusion 10 上,我的 MySQL 程序在 MySQL 服务器上运行时运行良好。当我尝试时购买

    <cfstoredprocedure .....
    

    它会抛出以下错误:

    “执行数据库查询时出错。用户无权访问元数据 需要确定存储过程参数类型。如果权利可以 不被授予,配置连接 "noAccessToProcedureBodies=true" 让驱动程序生成参数 表示 INOUT 字符串,无论实际参数类型如何。"

    我尝试使用上述参数设置 JDBC 连接,但也无济于事。所以最终将调用作为查询传递给该过程,这似乎工作正常。将解决方案放在这里以供将来参考。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多