Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在存储过程中替换变量和游标的问题_Mysql_Loops_Variables_Stored Procedures_Cursor - Fatal编程技术网

Mysql 在存储过程中替换变量和游标的问题

Mysql 在存储过程中替换变量和游标的问题,mysql,loops,variables,stored-procedures,cursor,Mysql,Loops,Variables,Stored Procedures,Cursor,所以我知道为了替换select语句中的游标,我们需要在prepare语句之前定义它。我可以在那个里替换变量,但对于游标,我有一个相同的问题 例如,下面的语句应该正确地替换表的变量值,并且应该创建一个表作为试验数据 SET @user := 'trial'; SET @group := 'data'; SET @table := CONCAT(@user, '_', @group); SET @stat = CONCAT('CREATE TABLE ',@table,' as SELECT @us

所以我知道为了替换select语句中的游标,我们需要在prepare语句之前定义它。我可以在那个里替换变量,但对于游标,我有一个相同的问题

例如,下面的语句应该正确地替换表的变量值,并且应该创建一个表作为试验数据

SET @user := 'trial';
SET @group := 'data';
SET @table := CONCAT(@user, '_', @group);
SET @stat = CONCAT('CREATE TABLE ',@table,' as SELECT @user, @group;');
PREPARE stmt from @stat;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
然而,当我试图在带有游标的存储过程中应用相同的逻辑时,我遇到了如下错误-

01:13:52    call cursor_ROWPERROW() Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NULL' at line 1    0.000 sec
在这个场景中,我试图通过替换variable和cursor的值来动态创建表。在这里,我试图基于我从信息模式中标识的另一个表中的相同列,动态创建PD_yyyy_uyx表

DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER $$
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
    DECLARE cursor_COL VARCHAR(50);
    DECLARE cursor_TAB VARCHAR(50);
    DECLARE tab VARCHAR(100);
    DECLARE col1 VARCHAR(50);
    DECLARE col2 VARCHAR(50);
    DECLARE done INT DEFAULT 0;
    DECLARE cursor_i CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='xxxxx' AND TABLE_NAME='yyyyy' AND COLUMN_NAME = 'zzzzz';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cursor_i;
    read_loop: LOOP
        FETCH cursor_i INTO cursor_COL, cursor_TAB;
        SET tab := CONCAT('PD', '_', @cursor_TAB, '_' , @cursor_COL);
        SET col1 := CONCAT(@cursor_COL);
        SET col2 := CONCAT(@cursor_COL, '_', 'value');
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET @dyn_sql := CONCAT('CREATE TABLE ',@tab,' AS SELECT Codevalue as ',@col1,', valueLabel as ',@col2,' from valuesets14 where varName = cursor_COL and TableName = cursor_TAB;');
        PREPARE stmt_dyn_view FROM @dyn_sql;
        EXECUTE stmt_dyn_view;
        DEALLOCATE PREPARE stmt_dyn_view;
    END LOOP;
    CLOSE cursor_i;
END;
$$

DELIMITER ;
尽管我用下面的select语句替换了整个SET@dyn_sql块,但它运行良好,并提供了我想要为其创建多个表的确切数据集。请注意,我正在引用的表中没有一个值为NULL,因此我似乎缺少一些游标替换

SELECT Codevalue as ',@col1,', valueLabel as ',@col2,' from valuesets14 where varName = cursor_COL and TableName = cursor_TAB;

有谁能帮我弄清楚这个问题吗?

问题是你混淆了引用变量的各种方式。在声明@符号时应忽略它们

read_loop: LOOP
    FETCH cursor_i INTO cursor_COL, cursor_TAB;
    SET tab := CONCAT('PD', '_', cursor_TAB, '_' , cursor_COL);
    SET col1 := CONCAT(cursor_COL);
    SET col2 := CONCAT(cursor_COL, '_', 'value');
    IF done THEN
        LEAVE read_loop;
    END IF;
    SET @dyn_sql := CONCAT('CREATE TABLE ',tab,' AS SELECT Codevalue as ',col1,', valueLabel as ',col2,' from valuesets14 where varName = cursor_COL and TableName = cursor_TAB;');
    PREPARE stmt_dyn_view FROM @dyn_sql;
    EXECUTE stmt_dyn_view;
    DEALLOCATE PREPARE stmt_dyn_view;
END LOOP;

谢谢你的想法,奈杰尔,但是,我还是遇到了另一个问题,游标变量替换,它抱怨

call cursor_ROWPERROW(): Error Code: 1054. Unknown column 'zzzzz' in 'where clause'
因此,基本上,它无法替换光标值,所以我采用了与您提到的相同的方法,在文本中加上引号,因此使用select query来查看它试图生成的查询,我使用了下面的SQL解决了我的问题

DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER $$
CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
    DECLARE cursor_COL VARCHAR(50);
    DECLARE cursor_TAB VARCHAR(50);
    DECLARE tab VARCHAR(100);
    DECLARE col1 VARCHAR(50);
    DECLARE col2 VARCHAR(50);
    DECLARE done INT DEFAULT 0;
    DECLARE cursor_i CURSOR FOR SELECT COLUMN_NAME, TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='xxxxx' AND TABLE_NAME='yyyyy' AND COLUMN_NAME = 'zzzzz';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cursor_i;
    read_loop: LOOP
        FETCH cursor_i INTO cursor_COL, cursor_TAB;
        SET tab := CONCAT('PD', '_', cursor_TAB, '_' , cursor_COL);
        SET col1 := CONCAT(cursor_COL);
        SET col2 := CONCAT(cursor_COL, '_', 'value');
        IF done THEN
            LEAVE read_loop;
        END IF;
        SET @dyn_sql := CONCAT('CREATE TABLE ',tab,' AS SELECT Codevalue as ',col1,', valueLabel as ',col2,' from valuesets14 where varName = "',cursor_COL,'" and TableName = "',cursor_TAB,'";');
        PREPARE stmt_dyn_view FROM @dyn_sql;
        #SELECT @dyn_sql;
        EXECUTE stmt_dyn_view;
        DEALLOCATE PREPARE stmt_dyn_view;
    END LOOP;
    CLOSE cursor_i;
END;
$$

DELIMITER ;