implicit cursor for loop mariadb似乎不起作用

z3yyvxxp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(473)

我必须在数据库中搜索存在指定列值的表名。列名是“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语句中使用隐式游标“i”。我得到了错误“dbname.i”找不到,或类似的东西。我怎么能做到呢?

bvjxkvbb

bvjxkvbb1#

以下是您需要的部分代码:
在你的尝试中,你做到了 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的输出。应该是几排

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

那你必须 prepare 以及 execute 找到每一行。这会给你

some_table    1
another_table 0

其中1表示真,0表示假。
好的,现在我来修好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)

相关问题