Выполнить sql с использованием хранимой процедуры в mysql - PullRequest
1 голос
/ 05 августа 2020

У меня есть следующая хранимая процедура. Идея состоит в том, чтобы получить список баз данных и выполнить оператор sql.

DELIMITER $$
CREATE PROCEDURE updateMySQL (
    IN  theSQL varchar(4000)
)
BEGIN
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE theDatabases varchar(100) DEFAULT "";

    -- declare cursor for employee email
    DEClARE curDatabase 
        CURSOR FOR 
            SELECT schema_name FROM information_schema.schemata where SCHEMA_NAME = 'mydb' order by 1;

    -- declare NOT FOUND handler
    DECLARE CONTINUE HANDLER 
        FOR NOT FOUND SET finished = 1;

    OPEN curDatabase;

    getDatabase: LOOP
        FETCH curDatabase INTO theDatabases;
        IF finished = 1 THEN 
            LEAVE getDatabase;
        END IF;
        -- build email list
      -- SET emailList = CONCAT(theDatabases,";",emailList);
        SET @sql:=CONCAT('USE ',@curDatabase);
        PREPARE dynamic_statement FROM @SQL;
        EXECUTE dynamic_statement;
        
        PREPARE dynamic_statement FROM @theSQL;
        EXECUTE dynamic_statement;
        
        
    END LOOP getDatabase;
    CLOSE curDatabase;

END$$
DELIMITER ;

Я пытаюсь выполнить такую ​​хранимую процедуру,

SET @theSQL = 'ALTER VIEW `Reports` AS
    SELECT DISTINCT
        `tableA`.`Id` AS `Id`,
        `tableA`.`letterId` AS `letterId`
    FROM
        `mytable` `tableA`
    ORDER BY 1';

call updateMySQL(@theSQL);

EDIT Произошла ошибка при выполнении процедуры, Код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'NULL' в строке 1

Я использую mysql 8.0.17

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Тщательно исследуйте MySQL 8.0 Справочное руководство / SQL Операторы / Подготовленные операторы , раздел «SQL Синтаксис, разрешенный в подготовленных операторах».

В этом разделе заявлен ПОЛНЫЙ список утверждений, которые разрешены в Подготовленных отчетах. ALTER VIEW НЕ указано. Так что это НЕ разрешено.

Вместо этого используйте DROP VIEW и CREATE VIEW.

Всегда получайте и исследуйте все сообщения об ошибках.

1 голос
/ 05 августа 2020

Вы должны изменить эту часть

    SET @sql:=CONCAT('USE ',@curDatabase);
    PREPARE dynamic_statement FROM @SQL;
    EXECUTE dynamic_statement;
    
    PREPARE dynamic_statement FROM @theSQL;
    EXECUTE dynamic_statement;

на это:

    SET @sql:=CONCAT('USE ',@curDatabase);
    PREPARE dynamic_statement FROM @SQL;
    EXECUTE dynamic_statement;
    DEALLOCATE PREPARE dynamic_statement; /* don't forget to deallocate */
    
    /* there's a difference between the variables @theSQL and theSQL (your parameter) */
    /* IIRC prepare statements need user defined variables or a syntax error occurs. Therefore I simply assign the parameter to a user-defined variable */
    SET @theSQL = theSQL;
    PREPARE dynamic_statement FROM @theSQL;
    EXECUTE dynamic_statement;
    DEALLOCATE PREPARE dynamic_statement;

Подробнее об определяемых пользователем переменных здесь: https://dev.mysql.com/doc/refman/8.0/en/user-variables.html Здесь объясняются различия: { ссылка } Если вы не инициализируете их, их содержимое будет просто NULL. Поскольку существует разница между пользовательскими переменными и локальными переменными (а также вашей переменной-параметром), ваше текущее решение ничего не дало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...