Тип аргумента в процедурах MySQL? - PullRequest
3 голосов
/ 26 мая 2011

Я пишу некоторые процедуры 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 Ответ

0 голосов
/ 31 мая 2011

К сожалению, я не знаю, как это сделать напрямую в 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]+)$'; 

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

...