Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:
Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference
или даже (чаще) a KeyNotFoundException
при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.
Если код NullReferenceException
задан кодом unsafe
, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero
или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.
(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)
То, что вы пытаетесь сделать, невозможно в хранимой процедуре с или без подготовленного оператора.
Вы могли бы сделать что-то подобное:
DELIMITER $$
DROP PROCEDURE IF EXISTS test_proc $$
CREATE PROCEDURE test_proc(param1 varchar(20))
BEGIN
CASE UPPER(param1)
WHEN 'MICROSECOND' THEN select DATE_SUB(now(), INTERVAL 1 MICROSECOND);
WHEN 'SECOND' THEN select DATE_SUB(now(), INTERVAL 1 SECOND);
WHEN 'MINUTE' THEN select DATE_SUB(now(), INTERVAL 1 MINUTE);
WHEN 'HOUR' THEN select DATE_SUB(now(), INTERVAL 1 HOUR);
WHEN 'DAY' THEN select DATE_SUB(now(), INTERVAL 1 DAY);
WHEN 'WEEK' THEN select DATE_SUB(now(), INTERVAL 1 WEEK);
WHEN 'MONTH' THEN select DATE_SUB(now(), INTERVAL 1 MONTH);
WHEN 'QUARTER' THEN select DATE_SUB(now(), INTERVAL 1 QUARTER);
WHEN 'YEAR' THEN select DATE_SUB(now(), INTERVAL 1 YEAR);
ELSE select 'UNEXPECTED UNIT';
END CASE;
END $$
DELIMITER ;