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

时间:2018-11-30 11:07:24

标签: mysql sql for-loop mariadb procedure

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

我的想法是首先选择存在“ 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”或类似信息。 我该怎么办呢?

1 个答案:

答案 0 :(得分:0)

这是您需要的代码的部分

尝试进行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

然后,您必须prepareexecute每找到一行。这会给你

some_table    1
another_table 0

其中1表示正确,0表示错误。

好的,现在我将修复CONCAT使其起作用。请记住,sql与许多其他语言一样,没有 no 方式进行“插值”。也就是说,我们需要完全依靠CONCAT

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

->

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