Зарегистрируйте продажу с подробным описанием продажи через транзакции в хранимой процедуре MYSQL

Я пытаюсь зарегистрировать 2 таблицы через транзакции в MySQL, и у меня есть таблица VENTA, которую я помещаю в поле PK id_venta и которая имеет тип int автоинкремента, у меня также есть таблица DETALLE_VENTA, которая имеет в качестве FK - поле id_venta типа int, которое ссылается на то же поле в таблице VENTA.

Теперь у меня нет проблем во время регистрации продажи в разных хранимых процедурах без транзакций, подробности в том, что я читал в Интернете, что идеальным было бы, чтобы процесс продажи осуществлялся посредством транзакции в одном восстановлении SP. id_venta с функцией mysql LAST_INSERT_ID, а затем запишите сведения о продаже (все продукты, включенные в эту продажу), чтобы сделать ее более безопасной, поскольку в случае возникновения ошибки при продаже деталь больше не будет зарегистрирован и не повлияет ни на одну таблицу.

На форумах мне было сказано сохранить заголовок продажи и затем передать эти данные с помощью запроса (например, select max(id_venta) from venta), но я так думаю, если другой терминал вставит регистрацию в базу данных. В то же время я могу столкнуться с большими проблемами и не считаю его эффективным.

Я буду бесконечно благодарен за помощь, с наилучшими пожеланиями.

1
задан 01.07.2016, 21:18
3 ответа

с языка программирования в методе ты посылаешь заголовок, с хранившейся процедурой ups_venta_insertar, этот возвратит idventa и тогда ты пробегаешь сверчка, где у тебя есть линии, которые составляют деталь продажи, и ты посылаешь в другую хранившуюся процедуру ups_venta_detalle_insertar:

-- CABECERA VENTA (tabla venta)

DELIMITER $
CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_venta_insertar`(
IN `p_fecha` datetime,
IN `p_id_cliente` int(10) UNSIGNED,
IN `p_subtotal` decimal,
IN `p_descuentos` decimal,
IN `p_total` decimal,
OUT `p_idventa` int(11) UNSIGNED,
OUT `p_mierror_cod` int(11),
OUT `p_mierror_msg`  text)
MODIFIES SQL DATA
COMMENT 'Insertar Venta'
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN

ROLLBACK;
    GET DIAGNOSTICS CONDITION 1 @RETURNED_SQLSTATE = RETURNED_SQLSTATE, @MYSQL_ERRNO = MYSQL_ERRNO, @MESSAGE_TEXT = MESSAGE_TEXT;
    SET p_mierror_cod = -10;
    SET p_mierror_msg = CONCAT("ERRNO: ",@MYSQL_ERRNO, ", SQLSTATE: ", @RETURNED_SQLSTATE, ", TEXT: ", @MESSAGE_TEXT);

END;

START TRANSACTION;

    SET p_idventa = 0;

    INSERT INTO `venta` (`id_cliente`, `subtotal`, `descuentos`, `total`)
      VALUES (`p_id_cliente`, `p_subtotal`, `p_descuentos`, `p_total`);

    SELECT LAST_INSERT_ID() INTO p_idventa;

     -- Exitosamente
    SET p_mierror_cod = 1;
    SET p_mierror_msg = 'Venta insertado correctamente';

COMMIT;

END$
DELIMITER ;

-- LINEA VENTA (TABLA venta_detalle)
DELIMITER $
CREATE DEFINER=`root`@`localhost` PROCEDURE `usp_venta_detalle_insertar`(
IN `p_id_venta` int(10) UNSIGNED,
IN `p_id_producto` int(10) UNSIGNED,
IN `p_cantidad` int,
IN `p_precio_unitario` decimal,
IN `p_importe` decimal,
OUT `p_idventa_detalle` int(11) UNSIGNED,
OUT `p_mierror_cod` int(11),
OUT `p_mierror_msg`  text)
MODIFIES SQL DATA
COMMENT 'Insertar Venta Detalle (linea)'
BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
BEGIN

ROLLBACK;
    GET DIAGNOSTICS CONDITION 1 @RETURNED_SQLSTATE = RETURNED_SQLSTATE, @MYSQL_ERRNO = MYSQL_ERRNO, @MESSAGE_TEXT = MESSAGE_TEXT;
    SET p_mierror_cod = -10;
    SET p_mierror_msg = CONCAT("ERRNO: ",@MYSQL_ERRNO, ", SQLSTATE: ", @RETURNED_SQLSTATE, ", TEXT: ", @MESSAGE_TEXT);

END;

START TRANSACTION;

    SET p_idventa_detalle = 0;

    INSERT INTO `venta_detalle` (`id_venta`, `id_producto`,`cantidad`,`precio_unitario`,`importe`)
      VALUES (`p_id_venta`,`p_id_producto`,`p_cantidad`,`p_precio_unitario`,`p_importe`);

    SELECT LAST_INSERT_ID() INTO p_idventa_detalle;

     -- Exitosamente
    SET p_mierror_cod = 1;
    SET p_mierror_msg = 'Venta Detalle (Linea) insertado correctamente';

COMMIT;

END$
DELIMITER ;
1
ответ дан 24.11.2019, 13:57

Я реализовал процессы как эти, и самое подходящее состояло в том, чтобы посылать файл xml с заголовком и деталью в единственный SP, в котором находятся оба INSERTS внутри сделки. Я это сделал в SQL Server, представляю себе то, что в MySQL также было бы нужно мочь делать. Привет.

0
ответ дан 24.11.2019, 13:57
  • 1
    ¿ Algú n пример, который нужно вносить для того, чтобы OP поняло то, что ты описываешь? –  NaCl 18.07.2016, 23:11
  • 2
    Я имею ссылку, что será большого количества помощи. elguille.info/colabora/NET2006/… –  Juan Carlos Rocafuerte 19.07.2016, 23:37
  • 3
    Serí в хорошую идею помещать значимые детали вышеупомянутого соединения в ответ, для того, чтобы если dí в соединение уже не está ответ aú n будьте vá lida. –  NaCl 20.07.2016, 05:09

Я рекомендовал бы тебе использовать единственный одинокий код, что ты должен делать перед твоим реестром в таблице ПРОДАЖУ один:

 SELECT UUID() INTO @codigo_unico;

Что ты это будешь должен сохранять внутри поля тип char или varchar, такой ты предотвращаешь проблему того, которого число id повторяет. или я использовал другой. Этот единственный код ты это используешь в ПРОДАЖЕ и это будет FK в DETALLE_VENTA. Если ты будешь нуждаться в большей безопасности в процессе, ты будешь должен использовать START TRANSACTION. и все то, что он поддерживает.

0
ответ дан 24.11.2019, 13:57