如何测试用户变量并在drop视图中使用它

zynd9foi  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(309)

我不熟悉mysql中的用户变量,在尝试将它们用于select语句以外的任何语句时遇到了一些错误。我正在尝试运行批处理作业以删除在数据库中创建的临时视图。过程是:
步骤1:识别临时视图并将列表放入变量中。
步骤2:测试变量是否为空
步骤3:删除视图
问题1:即使我没有测试null,drop也不起作用。我在第13行收到这个消息:error1064(42000):您的sql语法有错误;在第1行的“@viewlist\u pre”附近,检查与您的mysql服务器版本对应的手册,以获得正确的语法
问题2:包含空测试时,空测试不起作用。我收到这个错误:mysql:[警告]在命令行界面上使用密码可能不安全。第12行出现错误1064(42000):您的sql语法有错误;请查看与您的mysql服务器版本对应的手册,以获得正确的语法,以便在“if(@viewlist\u pre为空)附近使用,然后将view@viewlist\u pre放在第1行
下面是代码。必须如何写才能工作?我真的很感激你的帮助!谢谢您!!

SET SESSION group_concat_max_len = 18446744073709551615;

-- Get the PreSummary views
SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");

SELECT @VIEWLIST_PRE; -- THIS WORKS!
IF(@VIEWLIST_PRE IS NULL) THEN  -- BREAKS
    DROP VIEW @VIEWLIST_PRE;  -- BREAKS
END IF;
  • 解决方案*

我调整了used\ by\ already的解决方案(根据我收集的信息,在一个准备好的语句中一次只能执行一个命令)。以下是批量投放的最终代码:

SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");
SET @DROP_VIEW_PRE = CONCAT('DROP VIEW IF EXISTS ', @VIEWLIST_PRE);
PREPARE stmt1 FROM @DROP_VIEW_PRE;
EXECUTE stmt1;

有人提出了一个很好的问题,即为什么没有使用定向投放。原因是它没有从php成功执行,但是没有收到任何错误。然而,经过多次搜索,我发现了问题,现在可以做有针对性的下降。

cigdeys3

cigdeys31#

我不能确定为什么或者如何创建这些临时视图,但是与其尝试定期进行一些大容量清理,不如使用:

drop view IF EXISTS some_view_name;

就在当前用于创建每个临时视图的代码之前。
这样,视图是否存在就无关紧要了。
如果要继续进行看起来像是批量清理的操作,那么查询需要看起来更像这样:

SET @VIEWLIST_PRE = (concat((select group_concat(concat('drop view if exists ',table_name) SEPARATOR '; ')  
                             from information_schema.views 
                             where table_schema = 'raptor' and table_name  like'%Pre%')
                            ,';'))

生成的字符串如下所示:

drop view if exists Pre1; drop view if exists Pre2;

那你需要用一个 prepared statement 执行生成的sql。不能仅将用户变量作为sql代码字符串包含在查询中。
请参阅:mysql准备的satement语法

krugob8w

krugob8w2#

我调整了used\ by\ already的解决方案(根据我收集的信息,在一个准备好的语句中一次只能执行一个命令)。以下是批量投放的最终代码:

SET @VIEWLIST_PRE = (SELECT
                    CONCAT(
                        GROUP_CONCAT(TABLE_NAME)
                    ) AS stmt
                    FROM information_schema.TABLES
                    WHERE TABLE_SCHEMA = "raptor" AND TABLE_NAME LIKE "%Pre%");
SET @DROP_VIEW_PRE = CONCAT('DROP VIEW IF EXISTS ', @VIEWLIST_PRE);
PREPARE stmt1 FROM @DROP_VIEW_PRE;
EXECUTE stmt1;

有人提出了一个很好的问题,即为什么没有使用定向投放。原因是它没有从php成功执行,但没有收到任何错误。然而,经过多次搜索,我发现了问题,现在可以做有针对性的下降。

相关问题