#mysql #stored-procedures #typechecking #procedures
#mysql #хранимые процедуры #проверка типов #процедуры
Вопрос:
Я пишу некоторые процедуры MySQL для веб-приложения, и что меня поражает, так это то, что проверка типа аргумента вообще отсутствует.
Например, если у меня есть следующее :
CREATE PROCEDURE foo(n CHAR(4))
Я могу вызвать его с любым, что захочу, он примет это и примет только четыре первых символа. Но если я хочу сделать что-то вроде этого :
use base;
DELIMITER $$
DROP PROCEDURE IF EXISTS open $$
CREATE PROCEDURE open(n INT)
BEGIN
SELECT * FROM prod_charts LIMIT n;
END $$
DELIMITER ;
Это просто приведет к сбою при вызове с параметром, отличным от int. И нет обратной связи: при вызове из php я просто ничего не получаю, а когда я пытаюсь это сделать в phpMyAdmin, меня отправляют обратно на домашнюю страницу.
Итак, мой вопрос: как я могу сделать это немного безопаснее? есть ли способ проверить тип переменной в этих процедурах?
Ответ №1:
К сожалению, я не знаю способа сделать это непосредственно в MySQL. В других RDMS, подобных MS SQL, есть такие функции, как IsNumeric(), которые вы можете использовать.
Создайте следующую функцию в MySQL и используйте ее для проверки, является ли переданное значение числовым.
CREATE FUNCTION ISNUMERIC(myVal VARCHAR(1024))
RETURNS TINYINT(1) DETERMINISTIC
RETURN myVal REGEXP '^(-|\ )?([0-9] \.[0-9]*|[0-9]*\.[0-9] |[0-9] )$';
Это должно охватывать большинство (если не все) возможностей.