我必须在数据库中搜索存在指定列值的表名。 列名称是“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/