当前位置: 首页 > 面试题库 >

使用PDO使用Out参数调用存储过程

长孙骏
2023-03-14
问题内容

我已经使用PDO一段时间了,并且正在重构一个项目,以便它使用存储的proc而不是内联SQL。我收到一个我无法解释的错误。我正在使用PHP版本5.3.5和MySQL版本5.0.7。

我只是想获得一个带有输出的基本存储过程。这是存储的过程:

DELIMITER //  
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))  
BEGIN  
    SET var1 = 'This is a test';  
END //

这是我用来调用proc的代码,$ db是PDO的一个实例

$stmt = $db->prepare("CALL proc_OUT(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

    // call the stored procedure
    $stmt->execute();
    echo $returnvalue;

简单吧?但是,它导致以下错误:

exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger

如果我直接这样调用proc:

CALL proc_OUT(@res);
SELECT @res;

它按预期工作,这使我相信PHP调用方式存在问题,但是我似乎找不到问题所在。我正在按照手册中的说明进行操作,但仍然出现此错误。有人可以建议我做错了什么吗?任何建议将不胜感激。非常感谢!


问题答案:

似乎这里有一个错误在起作用,我发现的最佳解决方案是:

http://www.php.net/manual/zh/pdo.prepared-
statements.php#101993

从以上链接的评论中:

$dbh->query("CALL SomeStoredProcedure($someInParameter1,

$someInParameter2, @someOutParameter)”);
$dbh->query(“SELECT @someOutParameter”);

// OR, if you want very much to use PDO.Prepare(),
// insert "SELECT @someOutParameter" in your stored procedure and then

use:

$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)");
$stmt ->execute(array($someInParameter1, $someInParameter2));


 类似资料:
  • 尝试调用MSSQL存储过程。过程基本上是这样的:使用[DATABASE]GO SET ANSI _ NULLS ON GO SET QUOTED _ IDENTIFIER ON GO 更改过程。[stored procedure](@ username varchar(10))as 从表名中选择用户名 输出是:array(0) { }这个数据库中有大量的数据。 我知道与数据库的连接是有效的,但当我

  • 我通过Hibernate调用了一个带有OUT参数的存储过程,得到了以下错误: 我的存储过程: Hibernate映射: 我按如下方式调用了存储过程: 有人能解释一下这段代码有什么问题吗?

  • 问题内容: 我希望能够在PetaPoco中使用命名参数调用存储的proc。 为了调用执行搜索/获取的存储过程: 我可以做这样的事情: 另外,如何调用执行插入操作的存储过程? 谢谢,Nac 问题答案: 更新: 我尝试了以下操作来进行获取和插入,并且效果很好: 可以进一步改进以传递SQL参数。

  • 本文向大家介绍PHP使用PDO调用mssql存储过程的方法示例,包括了PHP使用PDO调用mssql存储过程的方法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP使用PDO调用mssql存储过程的方法。分享给大家供大家参考,具体如下: 数据库中已创建存储过程user_logon_check, PHP调用示例如下, 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP基于pd

  • 我有一个在包中定义的存储过程。该过程接受两个参数,一个是游标: 我是这样调用这个过程的: 它将返回以下错误: 你好,阿尼尔班。

  • 问题内容: 我在SQL Server 2008 R2中有一个Oracle链接服务器。我需要执行Oracle存储过程(在第一个过程中使用输出参数,在第二个过程中使用输入参数): 我没有找到有关此问题的完整文档,只有带有无参数选择/非选择过程的简单示例,并且想知道如何调用这些过程,具有内部select的过程以及具有基本参数类型的多参数过程。 问题答案: 它应该像这样工作: 如果您有几个参数,则可能如下