Crea una variabile di tabella in MySQL

Ho bisogno di una variabile table per memorizzare le righe particolari dalla tabella all’interno della procedura MySQL . Ad esempio, dichiara @tb table (id int, name varchar (200))

È ansible? Se sì come?

Non esistono in MySQL? Basta usare una tabella temporanea:

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 .... */ 

Da MySQL qui

“È ansible utilizzare la parola chiave TEMPORARY durante la creazione di una tabella: una tabella TEMPORARY è visibile solo alla connessione corrente e viene rilasciata automaticamente quando la connessione viene chiusa. Ciò significa che due diverse connessioni possono utilizzare lo stesso nome di tabella temporaneo senza conflitto con ciascuna altro o con una tabella non TEMPORANEA esistente con lo stesso nome (la tabella esistente è nascosta fino a quando la tabella temporanea non viene rilasciata). ”

Forse un tavolo temporaneo farà quello che vuoi.

 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; 

Da forge.mysql.com . Vedi anche le tabelle temporanee di questo articolo .

Per rispondere alla tua domanda: no, MySQL non supporta variabili tipizzate da tabella nello stesso modo in cui fornisce SQL Server (http://msdn.microsoft.com/en-us/library/ms188927.aspx). Oracle fornisce funzionalità simili, ma le chiama tipi di Cursore anziché tipi di tabella (http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm).

A seconda delle esigenze, è ansible simulare variabili di tipo tabella / cursore in MySQL utilizzando tabelle temporanee in modo simile a quanto fornito da Oracle e SQL Server.

Tuttavia, vi è un’importante differenza tra l’approccio della tabella temporanea e l’approccio della variabile tabella / tipo di cursore e ha molte implicazioni sulle prestazioni (questo è il motivo per cui Oracle e SQL Server forniscono questa funzionalità oltre a quella fornita con il temporaneo tabelle).

Nello specifico: le variabili table / cursor-typed consentono al client di raggruppare più righe di dati sul lato client e inviarle al server come input per una stored procedure o istruzione preparata. Ciò che elimina è il sovraccarico di inviare ogni singola riga e invece di pagare quel sovraccarico una volta per un lotto di righe. Ciò può avere un impatto significativo sulle prestazioni generali quando si tenta di importare grandi quantità di dati.

Un ansible work-around:

Quello che vorresti provare è creare una tabella temporanea e poi usare un comando LOAD DATA (http://dev.mysql.com/doc/refman/5.1/en/load-data.html) per trasmettere i dati in modo temporaneo tavolo. È quindi ansible passare loro il nome della tabella temporanea nella stored procedure. Ciò comporterà comunque due chiamate al server del database, ma se si spostano abbastanza righe potrebbero esserci dei risparmi. Naturalmente, questo è davvero utile solo se si sta facendo una sorta di logica all’interno della stored procedure mentre si aggiorna la tabella di destinazione. In caso contrario, si può semplicemente voler CARICARE DATI direttamente nella tabella di destinazione.

Se non si desidera memorizzare la tabella nel database, @Evan Todd ha già fornito una soluzione temporanea per la tabella.

Ma se hai bisogno di quella tabella per altri utenti e vuoi archiviare in db, puoi usare la procedura qui sotto.

Crea sotto ‘stored procedure’:

————

 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 ; 

—————-

Ora puoi eseguire questa procedura per creare una tabella dei nomi delle variabili come da

chiama sp_variable_table ();

Puoi controllare la nuova tabella dopo aver eseguito sotto il comando-

usa test; mostra tabelle come ‘% zafar%’; – Il test è qui il nome ‘database’.

Puoi anche controllare più dettagli sotto il percorso

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

Non è la soluzione alla domanda, ma un’altra semplice alternativa. se la tabella è una tabella a colonna singola, è necessario derivare una stringa param concatenando i valori ed estraendoli all’interno dell’SP.