Anda di halaman 1dari 7

PROCEDIMIENTO ALMACENADO

El procedimiento almacenado para la Base de Datos fabrica_metal, guarda la información y la estructura de la Base de Datos a un archivo nuevo.
Este procedimiento nos tiene como objetivo guardar información que ya no se ocupe para poder continuar ingresando información.

Primero, creara el esquema para la información si es que no existe. En las siguientes líneas se muestra como:

# Crea el esquema si no existe


SET @sql = CONCAT('CREATE SCHEMA IF NOT EXISTS ',in_newDB,';');
PREPARE create_schema FROM @sql;
EXECUTE create_schema;
DEALLOCATE PREPARE create_schema;

Segundo, el curso recorre tabla por tabla y registro por registro de la Base de Datos.

DECLARE curTable CURSOR FOR


SELECT `table_name`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = fabrica_metal
and TABLE_TYPE='BASE TABLE'

Tercero, crea un ciclo que permite recorrer las tablas que serán copiadas y hasta que ya no haya tablas que copiar, este se detendrá.

# Loop sobre las tablas del viejo esquema


OPEN curTable;
clone_tables: LOOP

# obtén el nombre de la Base de Datos


FETCH curTable INTO v_tname;

# Quitar si has terminado


IF v_finished = 1 THEN LEAVE clone_tables; END IF;
PROCEDIMIENTO ALMACENADO- RUTINA

CREATE DEFINER=`root`@`localhost` PROCEDURE `copy_schema`(


IN fabrica_metal varchar(256),
IN in_newDB varchar(256),
IN in_copyData int(1)
)
BEGIN

DECLARE v_finished INTEGER DEFAULT 0;


DECLARE v_tname varchar(100) DEFAULT "";

DECLARE curTable CURSOR FOR


SELECT `table_name`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = fabrica_metal
and TABLE_TYPE='BASE TABLE'
;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

set @result=NULL;

# Create new schema if it doesn't exist


SET @sql = CONCAT('CREATE SCHEMA IF NOT EXISTS ',in_newDB,';');
PREPARE create_schema FROM @sql;
EXECUTE create_schema;
DEALLOCATE PREPARE create_schema;

# Loop over tables in old schema


OPEN curTable;
clone_tables: LOOP
# get next table name
FETCH curTable INTO v_tname;

# Quit if we're done


IF v_finished = 1 THEN LEAVE clone_tables; END IF;

# Clone the table


SET @sql = CONCAT("CREATE TABLE `", in_newDB, "`.`", v_tname, "` LIKE `", fabrica_metal, "`.`", v_tname, "`;");
PREPARE clone_table FROM @sql;
EXECUTE clone_table;
DEALLOCATE PREPARE clone_table;

# Optionally copy data


#select v_tname; # This just gives some feedback in workbench for long-running copies
IF (in_copyData > 0) THEN
SET @sql = CONCAT("INSERT INTO `", in_newDB, "`.`", v_tname, "` SELECT * FROM `", fabrica_metal, "`.`", v_tname, "`;");
PREPARE clone_data FROM @sql;
EXECUTE clone_data;
DEALLOCATE PREPARE clone_data;
END IF;

# Result message
SET @result = IFNULL(CONCAT(@result,',',v_tname),v_tname);

END LOOP clone_tables;

# Close cursor
CLOSE curTable;
/*call copy_schema('fabrica_metal','ya',12);*/
# Print result message
SELECT CONCAT("Copied the following tables from ", fabrica_metal, " to ", in_newDB, ": ", @result);
END
Llamaremos al procedimiento almacenado sobre la Base de Datos fabrica_metal.
Escribimos el nombre de la Base de Datos, junto con el nombre nuevo del archivo.

Anda mungkin juga menyukai