Tengo dos preguntas sobre Compound-Statement y Transactions en MySQL.COMIENZO DE LA TRANSACCIÓN dentro de COMIENZO ... contexto END o fuera y sintaxis LOOP
PRIMERO:
Hay dos notas en el Manual de MySQL:
Nota
Dentro de todos los programas almacenados, las golosinas analizador de empezar [TRABAJO] como el comienzo de una EMPEZAR .. . FIN bloque. Para comenzar una transacción en este contexto , use START TRANSACTION en su lugar.
Nota
Dentro de todos los programas almacenados (procedimientos almacenados y funciones, disparadores, y eventos), las golosinas analizador de empezar [TRABAJO] como el comienzo de un bloque BEGIN ... END . Comience una transacción en este contexto con START TRANSACCIÓN en su lugar.
No entiendo exactamente lo que significa. ¿Quiere decir que tengo que poner START TRANSACTION
en lugar de BEGIN
o justo después de BEGIN
?
// 1st variant:
BEGIN
START TRANSACTION
COMMIT
END
// 2nd variant:
START TRANSACTION
COMMIT
END
¿Cuál es la forma correcta, primera variante o segunda variante?
SEGUNDO:
no quiero crear un procedimiento almacenado o función. Sólo quiero crear un bloque compuesto-Declaración con un bucle interior en el flujo general, así:
USE 'someDb';
START TRANSACTION
... create table statement
... insert statement
// now I want to implement some insert/select statements using loop, I do as follows:
DELIMITER $
BEGIN
SET @n = 1, @m = 2;
lab1: LOOP
... some insert, select statements here
END LOOP lab1;
END $
DELIMITER ;
END
COMMIT
¿Es posible este tipo de estructura? Debido a que he tirado un error:
Query: BEGIN SET @n = 1, @m = 2; lab1: LOOP SELECT ...
Error Code: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET @n = 1, @m = 2;
lab1: LOOP SELECT ...
Mis preguntas son:
- ¿Está permitido el uso de
BEGIN...END
simplemente en el flujo general sin utilizar procedimientos almacenados o funciones? ¿Está permitido usar
BEGIN...END
dentro deSTART TRANSACTION...COMMIT
o tengo que ponerSTART TRANSACTION...COMMIT
dentro deBEGIN...END
?BEGIN START TRANSACTION COMMIT END // vs. START TRANSACTION BEGIN END COMMIT
Do I por todos los medios tienen que utilizar
BEGIN...END
si quiero usar sóloLOOP
? ¿Puedo simplemente usar la sintaxisLOOP
sin iniciarBEGIN...END
? El único ejemplo en el manual deLOOP
es la siguiente:CREATE PROCEDURE doiterate(p1 INT) BEGIN label1: LOOP ...
¿Por qué los bucles solo existen dentro de un proceso almacenado? Parece retrasado para tener que crear un proceso almacenado temporal solo para hacer una inserción de bucle simple ..... – Pacerier
@Pacerier: porque esa es la lógica de negocio que pertenece al código de la aplicación, no a la capa de la base de datos. – eggyal
@eggyal, aunque estoy totalmente de acuerdo contigo Pacerier tiene un punto muy válido, ¿por qué mysql se comporta diferente para programas almacenados vs consultas estándar? –