Member 13153537 Ответов: 1

Как справиться с любой ошибкой в хранимой процедуре mysql.


Я создал хранимую процедуру с использованием некоторых обработчиков 1062 обработчика и 1264 обработчика
Обработчик 1062 работает нормально, но обработчик 1264 не работает.После создания sp и во время выполнения

-- показывает правильную ошибку 1062

вызов insert_article_tags_2 (1,1)


--он не показывает вне зоны действия errror
вызов insert_article_tags_2(1555555555555,1877777755555555555)

почему, пожалуйста, помогите мне в этом.заранее спасибо.

Что я уже пробовал:

DELIMITER $$
CREATE PROCEDURE insert_article_tags_2(IN article_id INT, IN tag_id INT)
BEGIN
 
 declare exit handler for sqlexception
 select 'sql exception invoked';
 
 
 DECLARE EXIT HANDLER FOR 1062 
 
        SELECT 'MySQL error code 1062 invoked';
        
 DECLARE EXIT HANDLER FOR 1264

	SELECT 'Out of range exception';


 -- insert a new record into article_tags
 INSERT INTO article_tags(article_id,tag_id)
   VALUES(article_id,tag_id);
    
END

1 Ответов

Рейтинг:
0

Jochen Arndt

Это зависит от того, откуда вы звоните

call insert_article_tags_2(155555555555555,1877777755555555555)
Переданные аргументы выходят за пределы значений, которые могут быть удержаны 32-битным целым числом (используемый тип для SQL INT). Язык / оболочка или откуда вы ее вызываете, могут просто усечь переданные аргументы:
155555555555555 = 8D7A19A1B8E3 hex
Это может быть усечено до
19A1B8E3 hex = 430029027
что является допустимым значением.


Member 13153537

спасибо за ответ.я называю mysql workbench сам по себе.то, что я хочу, это если я передам эти значения(155555555555555,1877777755555555555), я хочу ошибку вне диапазона.Что я создал выше, используя обработчик 1264.

Jochen Arndt

Я не знаю, как MySQL Workbench анализирует и обрабатывает входные данные. Но в вашем случае сам верстак должен (по крайней мере) генерировать предупреждение о том, что входные числа усечены.

Просто догадываюсь, что происходит:
Верстак анализирует входные данные и преобразует числа из текста в числовые значения.

Если верстак поддерживает 64-битные числа, он должен выдать предупреждение, привести числа к 32-битному (INT) и передать их.

Если верстак не поддерживает 64-битные числа, он должен сам проверить входные данные на наличие больших значений и выдать ошибку.

Во всех случаях это проблема верстака, который в конечном итоге передает (допустимый) 32-битный INT в MySQL, так что MySQL никогда не получает недопустимое значение.

Вы можете проверить его со значением между 2147483647 и 4294967295. Это недопустимые входы со знаком, но допустимые целые числа без знака,и они могут быть переданы верстаком.

Member 13153537

workbench бросает ошибку, когда я передаю эти значения, как этот вызов insert_article_tags_2(4300290271,4300290271) код ошибки: 1264. Значение вне диапазона для столбца 'article_id' в строке 1

я хочу показать эту ошибку вместо того, чтобы mysql показывал ошибку.Я обрабатываю эту ошибку с помощью этого
ОБЪЯВИТЬ ОБРАБОТЧИК ВЫХОДА ДЛЯ 1264
Выберите "исключение из диапазона".

Jochen Arndt

Мне очень жаль, но я до сих пор не понимаю, какая ошибка отображается, когда (значения), по которым (SQL или Workbench).

Если вы вызываете процедуру с числовыми значениями INT (не текстовыми), то из SQL никогда не возникнет ошибка out of range, поскольку все возможные 32-битные значения INT допустимы.

Чтобы получить ошибку, сгенерированную SQL, вы должны передать ее в виде текста, чтобы SQL выполнял преобразование (непроверенное):

call insert_article_tags_2('155555555555555','1877777755555555555')

Member 13153537

В любом случае спасибо за помощь.Но это не решает моей проблемы.

Jochen Arndt

У вас есть две части: база данных и пользовательский интерфейс.
И то, и другое может (и должно) проверять на наличие ошибок, но - хотя и связано - это две независимые вещи.

Пожалуйста, попробуйте объяснить вашу проблему еще раз (другими словами). База данных работает так, как ожидалось, и вы добавили обработчики ошибок.

Так что ваша проблема может быть только в части пользовательского интерфейса. Но поведение пользовательского интерфейса не может быть изменено такими частями, как хранимые процедуры, принадлежащие базе данных.

Member 13153537

это моя таблица, а ниже-хранимая процедура.

создать таблицу customer (firstname varchar(100) unique,lastname varchar(10) unique)

ОГРАНИЧИТЕЛЬ $$
Создать процедуры хранимые процедуры insertcustomer(в " имя "типа varchar(100), в "фамилия" типа varchar(100))
НАЧАТЬ
объявить обработчик выхода для sqlexception
выберите "вызванное исключение sql".;

ОБЪЯВИТЬ ОБРАБОТЧИК ВЫХОДА ДЛЯ 1062

Выберите "вызван код ошибки MySQL 1062".;

-- вставить новую запись в article_tags
Вставить в клиентов(имя,фамилия)
Значения (имя, фамилия);

-- возврат количества тегов для статьи
КОНЕЦ

а ниже приведен php код







#conatiner{
выравнивание текста:по центру;
обивка-топ:18%;
}

< title & gt;Добавить

<? php include("connection2.php");?>



<? php
if (isset ($_POST ['submit'])) {
$link = mysqli_connect("localhost", "root", "Admin@123", " Test");

$firstname = $_POST['firstname'];
$lastname = $_POST ['фамилия'];

$в res=mysqli_query($Link "и вызывать хранимые процедуры insertcustomer('$имя', '$имя')");

if ($res= = = false){

Эхо mysql_errno""..mysql_errno;
}

}
?>


имя:

фамилия:







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

Jochen Arndt

Но это совершенно отличается от вашего первоначального вопроса (строки вместо INT, использование PHP вместо Workbench).

Если вы попытаетесь вставить уже существующий уникальный ключ, то получите ошибку SQL. Так почему же вам нужно обрабатывать их в рамках процедуры?

В вашем PHP-коде вы показываете номер ошибки SQL, но не текст, заданный обработчиком. Честно говоря, на данный момент я не знаю, Может ли и как PHP получить доступ к тексту ошибки и что возвращается.

Кстати: с моей точки зрения, оператор SELECT в обработчиках должен быть заключен в BEGIN и END:

DECLARE EXIT HANDLER FOR 1062
    BEGIN
        SELECT 'MySQL error code 1062 invoked';
    END;

Member 13153537

Хорошо, спасибо.