web-dev-qa-db-fra.com

Créer une variable de table dans MySQL

J'ai besoin d'une variable de table pour stocker les lignes particulières de la table dans MySQL procedure . E.g. declare table @tb (id int, nom varchar (200))

Est-ce possible? Si oui comment?

38
ANIL MANE

Ils n'existent pas dans MySQL, n'est-ce pas? Il suffit d'utiliser une table temporaire:

CREATE PROCEDURE my_proc () BEGIN 

CREATE TEMPORARY TABLE TempTable (myid int, myfield varchar(100)); 
INSERT INTO TempTable SELECT tblid, tblfield FROM Table1; 

/* Do some more stuff .... */

De MySQL ici

"Vous pouvez utiliser le mot-clé TEMPORARY Lors de la création d'une table. Une table TEMPORARY N'est visible que pour la connexion Actuelle et est supprimée Automatiquement. que deux connexions .__ différentes peuvent utiliser le même nom de table temporaire sans entrer en conflit avec l'une avec l'autre ou avec une table existante non-TEMPORAIRE du même nom . jusqu'à ce que la table temporaire soit supprimée.) "

62
Preet Sangha

Peut-être qu'une table temporaire fera ce que vous voulez.

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 . Voir aussi la partie des tables temporaires de cet article .

8
Ewan Todd

POUR répondre à votre question: non, MySQL ne prend pas en charge les variables de type table de la même manière que SQL Server (http://msdn.Microsoft.com/en-us/library/ms188927.aspx). Oracle propose des fonctionnalités similaires, mais les appelle des types de curseur au lieu de types de table (http://docs.Oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm).

Selon vos besoins, vous pouvez simuler des variables de type table/curseur dans MySQL en utilisant des tables temporaires de la même manière que celles fournies par Oracle et SQL Server.

Cependant, il existe une différence importante entre l’approche table temporaire et l’approche variable table/curseur et cela a de nombreuses implications en termes de performances (c’est la raison pour laquelle Oracle et SQL Server fournissent cette fonctionnalité au-delà de ce qui est fourni avec les tables).

Plus précisément, les variables table/curseur permettent au client de rassembler plusieurs lignes de données côté client et de les envoyer au serveur en tant qu'entrée d'une procédure stockée ou d'une instruction préparée. Cela élimine le temps d’envoi de chaque ligne et le paie au lieu de cela une fois pour un lot de lignes. Cela peut avoir un impact significatif sur les performances globales lorsque vous essayez d'importer de plus grandes quantités de données.

Une solution possible:

Ce que vous voudrez peut-être essayer, c’est de créer une table temporaire, puis d’utiliser une commande LOAD DATA (http://dev.mysql.com/doc/refman/5.1/fr/load-data.html) pour transférer les données dans le fichier temporaire. table. Vous pouvez ensuite leur transmettre le nom de la table temporaire dans votre procédure stockée. Cela entraînera toujours deux appels au serveur de base de données, mais si vous déplacez suffisamment de lignes, des économies peuvent être réalisées. Bien entendu, cela n’est vraiment utile que si vous utilisez une sorte de logique dans la procédure stockée lors de la mise à jour de la table cible. Sinon, vous voudrez peut-être simplement CHARGER DES DONNÉES directement dans la table cible.

5
numbsafari

Si vous ne souhaitez pas stocker de table dans la base de données, @Evan Todd a déjà reçu la solution de table temporaire.

Mais si vous avez besoin de cette table pour d’autres utilisateurs et que vous souhaitez stocker dans la base de données, vous pouvez utiliser la procédure ci-dessous.

Créer ci-dessous «procédure stockée»:

————————————

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 ;

————————————————–

Vous pouvez maintenant exécuter cette procédure pour créer une table de noms de variables, comme indiqué ci-dessous.

appelez sp_variable_table ();

Vous pouvez vérifier la nouvelle table après avoir exécuté la commande ci-dessous.

utilisez test; affichez des tables comme ‘% zafar%’; - test est ici le nom de la base de données.

Vous pouvez également consulter plus de détails sur le chemin ci-dessous.

http://mydbsolutions.in/how-can-create-a-table-with-variable-name/

2
Zafar Malik

MYSQL 8 fait en quelque sorte:

MYSQL 8 prend en charge les tables JSON, vous pouvez donc charger vos résultats dans une variable JSON et sélectionner cette variable à l'aide de la commande JSON_TABLE ().

1
Justin Levene

Pas la solution à la question mais une autre alternative simple . si la table est une table à une seule colonne, dérivez un paramètre de chaîne en concaténant les valeurs et extrayez-les dans le SP. 

0
sjd