Переопределить функцию «есть»

К сожалению, ответ, предоставленный @RuiDC, не работает в версиях MySQL до 5.5, потому что не существует реализации SIGNAL для хранимых процедур.

Решение, которое я обнаружено, что представляет собой симуляцию сигнала, выдающего ошибку table_name doesn't exist, нажатие персонализированного сообщения об ошибке в table_name.

Хак может быть реализован с помощью триггеров или с использованием хранимой процедуры , Я описываю оба варианта ниже, следуя примеру, используемому @RuiDC.

Использование триггеров

DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
    BEFORE INSERT ON test FOR EACH ROW
    BEGIN
        -- condition to check
        IF NEW.id < 0 THEN
            -- hack to solve absence of SIGNAL/prepared statements in triggers
            UPDATE `Error: invalid_id_test` SET x=1;
        END IF;
    END$$

DELIMITER ;

Использование хранимой процедуры

Хранимые процедуры позволяют использовать динамические sql, что делает возможным инкапсуляцию функции генерации ошибок в одну процедуру. Противоположность заключается в том, что мы должны контролировать методы вставки / обновления приложений, поэтому они используют только нашу хранимую процедуру (не предоставляя прямые привилегии INSERT / UPDATE).

DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
    SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
    PREPARE my_signal_stmt FROM @sql;
    EXECUTE my_signal_stmt;
    DEALLOCATE PREPARE my_signal_stmt;
END$$

CREATE PROCEDURE insert_test(p_id INT)
BEGIN
    IF NEW.id < 0 THEN
         CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
    ELSE
        INSERT INTO test (id) VALUES (p_id);
    END IF;
END$$
DELIMITER ;

29
задан Yacov 18 December 2013 в 08:41
поделиться

3 ответа

Из перегружаемых операторов могут быть перегружены следующие операторы:

  • Унарные: +, -, !, ~, ++, --, true, false
  • Двоичные: +, -, *, /, %, &, |, ^, <<, >>
  • Сравнение: ==, !=, <, >, <=, >=

И эти операторы не могут быть перегружены:

  • Логический: &&, ||
  • Индексирование массива: []
  • В ролях: (T)x
  • Назначение: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
  • Другие: =, ., ?:, ??, ->, =>, f(x), as, checked, unchecked, default, delegate, is, new, sizeof, typeof

Кроме того, операторы сравнения должны быть перегружены попарно Если вы перегружаете одну, вы должны перегрузить другую:

  • == и !=
  • < и >
  • <= и >=
49
ответ дан Bobby 18 December 2013 в 08:41
поделиться

Прямой ответ: нет, is нельзя переопределить (потому что это ключевое слово).

Но вы можете сделать что-то более элегантное, используя дженерики. Сначала определите ваш метод Is() следующим образом:

public bool Is<T>() where T: Exception
{
    return typeof(T).FullName == this.TypeName;
}

Затем вы можете написать свое сравнение следующим образом:

if (ex.Is<Validator.ValidatorException>())
33
ответ дан Thomas Weller 18 December 2013 в 08:41
поделиться

is - это не перегруженное ключевое слово, но вы можете написать метод расширений следующим образом:

public static bool Is<T>(this Object source) where T : class
{
   return source is T;
}
11
ответ дан Ramchandra Apte 18 December 2013 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: