mysql - MariaDB 循环的隐式游标似乎不起作用

标签 mysql sql for-loop mariadb procedure

我必须在数据库中搜索存在指定列值的表名。 列名称是“Nummer”,我想将该值作为过程的参数给出。 我使用的 DBMS 是 MariaDB 10.3

我的想法是首先选择其中存在“Nummer”列的每个表,然后循环遍历这些表并检查该值是否存在。 然后我想“返回”在其中找到该值的表名称。

我已经找到了存在“Nummer”列的所有表:

select table_name from information_schema.columns where column_name = 'Nummer'

现在我认为使用 for 循环并循环遍历每个表来搜索值会很有用:

create or replace procedure Forloop (
    in param_nummer int unsigned 
    )
    for i in (select table_name from information_schema.columns where column_name = 'Nummer')
    do 
        -- if exists (select * from i where 'Nummer' = param_nummer);
        -- return i (table_name) ?
    end for;
end//

delimiter;
call forloop();

问题是,当我执行该过程时,MariaDB 似乎没有在 select 语句中使用隐式 cursur“i”。 我收到错误“dbName.i”未找到或类似的错误。 我怎样才能做到这一点?

最佳答案

这是您需要的代码的部分:

在您的尝试中,您执行SELECT table_name ...。而不仅仅是table_name,而是构造您需要执行的查询。使用困惑的 CONCAT(...) (我将在下面提供)来完成此操作。

SELECT CONCAT("select 'table_name', nummer = param_nummer FROM table_name")
         from information_schema.columns
         where column_name = 'nummer'

在下一步之前,请观察选择的输出。它应该是几行,例如

select 'some_table', nummer = 123 FROM some_table
select 'another_table', nummer = 123 FROM another_table

然后您必须准备执行找到的每一行。这会给你

some_table    1
another_table 0

其中 1 表示 true,0 表示 false。

好的,现在我将修复 CONCAT 以使其正常工作。请记住,sql无法像许多其他语言一样进行“插值”。也就是说,我们需要完全依赖 CONCAT

SELECT CONCAT("select 'table_name', nummer = param_nummer FROM table_name")

-->

SELECT CONCAT("select '", table_name, "', nummer = ", param_nummer, " FROM ", table_name)

关于mysql - MariaDB 循环的隐式游标似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53556339/

相关文章:

sql - 如何获取所有列,但必须在sql查询中仅按2列进行分组

R——根据代码列表对观察结果进行分组

MySQL 5.7 无法运行 Windows 10

mysql - 错误 1452 : Cannot add or update a child row: a foreign key constraint fails

sql - 如何使用查询取消选择多值查找字段中的值

javascript - 如何在 for 循环中对具有精确索引的元素重复迭代?

带链接范围的 PHP 分页。需要帮助调整循环

mysql - 在线 SQL 编辑器(或不),自动将 sql 命令大写(例如 SELECT、AND、THEN、DISTINCT、DROP...)

mysql - 如何在Access表单中以多对多关系填充第三个表? (MySQL后端)

java - 使用java命令在mysql中恢复数据库