我必须在数据库中搜索存在指定列值的表名。 列名是“ 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”或类似信息。 我该怎么办呢?
答案 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
然后,您必须prepare
和execute
每找到一行。这会给你
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)