Тип аргумента в процедурах MySQL?

#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] )$'; 
  

Это должно охватывать большинство (если не все) возможностей.