【问题标题】:Bad query in cursol in procedure mysql程序mysql中游标中的错误查询
【发布时间】:2012-08-23 11:00:05
【问题描述】:

我对 curosr 有疑问,完全是查询:SELECT Crc32 FROM tableName。我想从 Crc32 列中读取所有行,并根据前四个字符找到一个与四个数字同名的表

错误:

0   12:58:57    call ShowNewUserComments("User66")  Error Code: 1146. Table 'comments.tableName' doesn't exist

调用程序:

call ShowNewUserComments("User66");

代码

DELIMITER $$
DROP PROCEDURE IF EXiSTS ShowNewUserComments $$
CREATE PROCEDURE `ShowNewUserComments`(tableName varchar(255)/*, Date TIMESTAMP*/)
BEGIN


             DECLARE recordNotFound INTEGER DEFAULT 0;
             DECLARE oneRow VARCHAR(10) DEFAULT "";
             DECLARE getCrc32,i int (11);
             DECLARE myCursor CURSOR FOR SELECT Crc32 FROM tableName;    
             DECLARE CONTINUE HANDLER FOR NOT FOUND SET recordNotFound = 1; 
             OPEN myCursor;
            set i = 0;
             allRows: LOOP
                FETCH myCursor INTO oneRow;
                   set  i = i + 1;
                     IF recordNotFound THEN
                        LEAVE allRows;
                     END IF;

             END LOOP allRows;
             CLOSE myCursor;

END

【问题讨论】:

  • 错误告诉你表'cmets.tableName'不存在所以在调用这个sp之前你需要在你的数据库comments中创建表tableName
  • 是的,我知道这一点,但我在过程中声明了 tableName 输入值。程序“User66”和User66中的表示例输入参数存在于数据库中
  • 我想使用 set @query = ("SELECT Crc32 FROM ", tableName);但不适用于光标。另一种解决方案使用: set tableNameUser = CONCAT("User",UserId);和 UserId 它的输入参数但是我不能在单词 DECLARE 之前使用“SET”

标签: mysql cursor procedure


【解决方案1】:

您不能直接将表名从变量替换为 MySQL 中的查询,因为您需要使用动态 sql 使用 PREPARE,如下所示:

DELIMITER $$
DROP PROCEDURE IF EXiSTS ShowNewUserComments $$
CREATE PROCEDURE `ShowNewUserComments`(tableName varchar(255)/*, Date TIMESTAMP*/)
BEGIN

     DECLARE recordNotFound INTEGER DEFAULT 0;
     DECLARE oneRow VARCHAR(10) DEFAULT "";
     DECLARE getCrc32,i int (11);
     DECLARE myCursor CURSOR FOR SELECT Crc32 FROM temp_table;
     DECLARE CONTINUE HANDLER FOR NOT FOUND SET recordNotFound = 1;


    DROP TEMPORARY TABLE IF EXISTS temp_table;

    SET @query1 = CONCAT('CREATE TEMPORARY  TABLE temp_table AS
                            SELECT Crc32
                            FROM ',tableName,' ');
    PREPARE stmt FROM @query1; EXECUTE stmt; DEALLOCATE PREPARE stmt;


     OPEN myCursor;
     set i = 0;
     allRows: LOOP
        FETCH myCursor INTO oneRow;
           set  i = i + 1;
             IF recordNotFound THEN
                LEAVE allRows;
             END IF;

     END LOOP allRows;
     CLOSE myCursor;

    DROP TEMPORARY TABLE IF EXISTS temp_table;
END

【讨论】:

  • 在 DEALLOCATE PREPARE 之后出现 DECLARE 字样错误.... 我想粘贴错误代码,但我现在不知道如何
  • 哦,我的错。所有DECLARE 语句都必须在顶部。尝试更新的答案。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2018-05-20
  • 1970-01-01
  • 2018-08-11
  • 2016-07-21
相关资源
最近更新 更多