调用过程时显示存储过程查询

Posted

技术标签:

【中文标题】调用过程时显示存储过程查询【英文标题】:Displaying stored procedure query while calling procedure 【发布时间】:2013-03-26 06:28:07 【问题描述】:

我创建了一个这样的存储过程,并使用输入参数调用该过程。我想在正常情况下使用参数调用它时获得它自己的过程,就像回声查询一样。

            $procedure              =   "CREATE PROCEDURE pdruser_login(IN userName VARCHAR(300), IN password VARCHAR(500)) 
                                        BEGIN 
                                        DECLARE _sqlQuery VARCHAR(2046);
                                        SET _sqlQuery = 'SELECT login_id, authorized, admin_authorize FROM tbluser_login WHERE user_name = userName AND user_pwd = password AND authorized = 1 AND privacy_policy = 1 AND is_deleted = 0';
                                        SET @sqlQuery = _sqlQuery;
                                        PREPARE dynquery FROM @sqlQuery;
                                        EXECUTE dynquery;
                                        DEALLOCATE PREPARE dynquery;
                                        END;";              
            if (!mysqli_query($this->con,"DROP PROCEDURE IF EXISTS pdruser_login") ||!mysqli_query($this->con,$procedure))
                
                    file_put_contents("minefile1.txt", "Stored procedure creation failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con));
                
            if (!($result   =   mysqli_query($this->con,"CALL pdruser_login('".$userName."','".$password."'"))) 
                
                    file_put_contents("minefile2.txt","CALL failed: (" . mysqli_errno($this->con) . ") " . mysqli_error($this->con));
                   

但上述过程显示错误“CALL failed: (1064) You have an error in your SQL syntax;检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的 '' 附近使用的正确语法”。

如何在调用存储过程时显示存储过程查询。有没有什么方法可以获取动态查询,以便在复杂查询中轻松跟踪错误?

【问题讨论】:

【参考方案1】:

由于某种原因,您没有将 SQL 存储在变量中 - 因此,您不能在调试信息中包含它

$sql = "DROP PROCEDURE IF EXISTS pdruser_login";
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]");
$sql = $procedure;
mysqli_query($this->con,$sql) or trigger_error(mysqli_error($this->con)." [$sql]");
// and so on.

请注意,trigger_error 比 file_put_contents 更有用。它可以将错误放在日志文件中,也可以将其显示在屏幕上,这非常方便。并且它有必不可少的文件/行标记

【讨论】:

【参考方案2】:

首先要创建 MySQL 过程,您需要设置 DELIMITER 以外的 ;然后在过程执行后重置分隔符,因为在内部进程中,所有块都应该被视为单个查询,但是过程内部的查询可能会破坏 sql 语句(由于使用;)

来自 mysql 站点的示例。

DELIMITER // 
DROP PROCEDURE IF EXISTS GetAllProducts //
CREATE PROCEDURE GetAllProducts() 
BEGIN 
  SELECT * FROM products; 
END // 
DELIMITER ; 

【讨论】:

以上是关于调用过程时显示存储过程查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 存储过程,获取使用游标查询的结果集

MySQL存储过程中如何遍历查询结果然后调用另一个存储过程?

怎么在mysql中查询已建立的存储过程

sql 调用已经建立的存储过程

添加参数,如果执行存储过程后没有返回记录,则显示消息

sybase存储过程中怎么调用存储过程