Mysql хранимая процедура: сопоставить правило столбца, чтобы получить значение - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть хранимая процедура, функция которой заключается в получении ColumnProperty на основе входного параметра, совпадающего с ColumnRule.

Например,

Я выполню нижеприведенное, чтобы получитьColumnProperty как строка (короткая). Но проблема в том, что при использовании WHERE для фильтрации ColumnRule полученное значение является строкой и в конце получает неизвестный тип.

CALL `testing-spGetColumnType`('varchar(11)', @outputProperty);
select @outputProperty;

DELIMITER $$
CREATE PROCEDURE `testing-spGetColumnType`(IN pColumnType varchar(50),OUT pColumnProperty varchar(50))
BEGIN

    SELECT ColumnProperty FROM model_column_type where pColumnType like replace(ColumnRule, 'variable', pColumnType) into pColumnProperty;

    SELECT IFNULL(pColumnProperty,'unknown type') into pColumnProperty;

END$$
DELIMITER ;

Пример таблицы:

enter image description here

1 Ответ

0 голосов
/ 01 ноября 2019

, когда условие в предложении WHERE оценивается по строке stringShort, в качестве аргумента которой указывается 'varchar(11)', это эквивалентно

  WHERE 'varchar(11)' 
   LIKE '%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(varchar(11),''('',-1),'')'',1) < 50' 

и результат сравнения LIKE будетFALSE.

Значение из ColumnRule из этой строки

%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(variable,'(',-1),')',1) < 50

является значением . Неважно, что это похоже на текст SQL. В контексте оператора SELECT это просто строка символов. Это строка значение . Это не ссылки на идентификаторы или функции SQL, или логические операторы.

Мы получили бы тот же результат, если бы значение ColumnRule было

%varchar% one two buckle my shoe

Чтобы получить строковое значение, которое будет отображаться как текст SQL, мы можем использовать динамически подготовленный SQL.

В контексте MySQL PROCEDURE мы можем динамически создавать текст SQL и сохранять его в виде строки, а затем выполнять строку примерно так:

 SET @foo = ' foo, bar' ; 
 SET @sql = CONCAT('SELECT ',@foo,' FROM mytab',' ORDER BY ',@foo); 
 PREPARE stmt FROM @sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

Слово предостережения:если мы динамически создаем текст SQL и включаем потенциально небезопасные значения, мы можем открыть зияющую уязвимость SQL-инъекций, как, например, Little Bobby Tables https://xkcd.com/327/

MySQL Reference https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...