Неявный курсор для цикла MariaDB не работает - PullRequest
0 голосов
/ 30 ноября 2018

Мне нужно найти имя таблицы в моей базе данных, в которой существует указанное значение столбца.Имя столбца "Nummer", и я хочу дать значение в качестве параметра процедуры.Я использую СУБД 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 не использует неявныйcursur "я" в утверждении выбора.Я получил ошибку "dbName.i" не найден, или что-то в этом роде.Как мне это сделать?

1 Ответ

0 голосов
/ 01 декабря 2018

Вот часть необходимого вам кода:

В вашей попытке вы делаете 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)
...