Necesito una variable de tabla para almacenar las filas particulares de la tabla dentro del procedimiento MySQL. P. ej. declarar tabla @tb (id int, nombre varchar (200))Crear variable de tabla en MySQL
¿Esto es posible? Si es así, ¿cómo?
Necesito una variable de tabla para almacenar las filas particulares de la tabla dentro del procedimiento MySQL. P. ej. declarar tabla @tb (id int, nombre varchar (200))Crear variable de tabla en MySQL
¿Esto es posible? Si es así, ¿cómo?
No existen en MySQL ¿verdad? Sólo tiene que utilizar una tabla temporal:
CREATE PROCEDURE my_proc() BEGIN
CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100));
INSERT INTO TmpTable SELECT tblid, tblfield FROM Table1;
/* Do some more stuff .... */
De MySQL here
"Se puede utilizar la palabra clave TEMPORAL al crear una tabla Un tabla temporal se visibles sólo para la conexión actual , y se deja caer. automáticamente cuando la conexión es cerrada. Esto significa que dos conexiones diferentes pueden usar el mismo nombre de tabla temporal sin conflicto con entre sí o con una tabla existente no TEMPORAL del mismo nombre. (La tabla existente se podrá ver hasta se deja caer la tabla temporal.)"
¿Qué pasa si el usuario múltiple intenta ejecutar el mismo procedimiento, creará algún problema de simultaneidad? –
no. las tablas temporales son específicas del usuario. – longneck
Tal vez una tabla temporal va a hacer lo que quiere.
CREATE TEMPORARY TABLE SalesSummary (
product_name VARCHAR(50) NOT NULL
, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00
, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00
, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0
) ENGINE=MEMORY;
INSERT INTO SalesSummary
(product_name, total_sales, avg_unit_price, total_units_sold)
SELECT
p.name
, SUM(oi.sales_amount)
, AVG(oi.unit_price)
, SUM(oi.quantity_sold)
FROM OrderItems oi
INNER JOIN Products p
ON oi.product_id = p.product_id
GROUP BY p.name;
/* Just output the table */
SELECT * FROM SalesSummary;
/* OK, get the highest selling product from the table */
SELECT product_name AS "Top Seller"
FROM SalesSummary
ORDER BY total_sales DESC
LIMIT 1;
/* Explicitly destroy the table */
DROP TABLE SalesSummary;
De forge.mysql.com. Véase también la tablas temporales pieza de . this article
En realidad se puede utilizar variables de tabla MySQL. a continuación se muestra un ejemplo de la documentación oficial http://dev.mysql.com/doc/refman/5.5/en/sql-syntax-prepared-statements.html
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);
mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);
mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
-1, esta no es una variable de tabla, la variable en este ejemplo solo contiene el nombre de la tabla. – gazarsgo
Para responder a su pregunta: no, MySQL no soporta variables de tabla-mecanografiada de la misma manera que SQL Server (http://msdn.microsoft.com/en-us/library/ms188927.aspx) ofrece . Oracle proporciona una funcionalidad similar pero los llama tipos de Cursor en lugar de tipos de tabla (http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm).
Dependiendo de sus necesidades, puede simular variables de tabla/cursor-tipadas en MySQL utilizando tablas temporales de forma similar a la proporcionada por Oracle y SQL Server.
Sin embargo, hay una diferencia importante entre el enfoque de tabla temporal y el de tabla/cursor-tipo variable y tiene muchas implicaciones de rendimiento (esta es la razón por la que Oracle y SQL Server proporcionan esta funcionalidad más allá de se proporciona con tablas temporales).
Específicamente: las variables de tabla/cursor permiten que el cliente clasifique varias filas de datos en el lado del cliente y las envíe al servidor como entrada a un procedimiento almacenado o una declaración preparada. Lo que esto elimina es la sobrecarga de enviar cada fila individual y en su lugar pagar esa sobrecarga una vez por un lote de filas. Esto puede tener un impacto significativo en el rendimiento general cuando intenta importar grandes cantidades de datos.
Una posible solución alternativa:
Lo que es posible que desee probar es la creación de una tabla temporal y luego utilizando un conjunto de datos de carga (http://dev.mysql.com/doc/refman/5.1/en/ load-data.html) para transmitir los datos en la tabla temporal.Luego puede pasarles el nombre de la tabla temporal en su procedimiento almacenado. Esto aún generará dos llamadas al servidor de la base de datos, pero si mueve suficientes filas puede haber ahorros. Por supuesto, esto solo es beneficioso si está haciendo algún tipo de lógica dentro del procedimiento almacenado mientras actualiza la tabla de objetivos. De lo contrario, quizás quiera CARGAR DATOS directamente en la tabla de destino.
No es la solución a la pregunta sino otra alternativa simple. si la tabla es una tabla de una sola columna que desea, entonces deriva un parámetro de cadena al concatenar los valores y extraer dentro del SP.
Si no desea almacenar la tabla en la base de datos, @Evan Todd ya recibió una solución de tabla temporal.
Pero si necesita esa tabla para otros usuarios y desea almacenarla en db, puede utilizar el siguiente procedimiento.
Crear abajo 'procedimiento almacenado':
------------
DELIMITER $$
USE `test`$$
DROP PROCEDURE IF EXISTS `sp_variable_table`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_variable_table`()
BEGIN
SELECT CONCAT(‘zafar_’,REPLACE(TIME(NOW()),’:',’_')) INTO @tbl;
SET @str=CONCAT(“create table “,@tbl,” (pbirfnum BIGINT(20) NOT NULL DEFAULT ’0′, paymentModes TEXT ,paymentmodeDetails TEXT ,shippingCharges TEXT ,shippingDetails TEXT ,hypenedSkuCodes TEXT ,skuCodes TEXT ,itemDetails TEXT ,colorDesc TEXT ,size TEXT ,atmDesc TEXT ,promotional TEXT ,productSeqNumber VARCHAR(16) DEFAULT NULL,entity TEXT ,entityDetails TEXT ,kmtnmt TEXT ,rating BIGINT(1) DEFAULT NULL,discount DECIMAL(15,0) DEFAULT NULL,itemStockDetails VARCHAR(38) NOT NULL DEFAULT ”) ENGINE=INNODB DEFAULT CHARSET=utf8″);
PREPARE stmt FROM @str;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SELECT ‘Table has been created’;
END$$
DELIMITER ;
----------------
ya se puede ejecutar este procedimiento para crear una tabla nombre de la variable de acuerdo a continuación-
sp_variable_table llamada();
Puede comprobar nueva tabla después de la ejecución de comandos de prueba a continuación
uso; tablas muestran como ‘zafar%%’; - test está aquí nombre de 'base de datos'.
También puede consultar más detalles a continuación en camino-
http://mydbsolutions.in/how-can-create-a-table-with-variable-name/
En realidad, Aleksey es adecuado, se puede almacenar una tabla de una variable, pero tendrá que utilizar una función, no un procedimiento . Los documentos de MySQL son muy claros en eso. –