2009-10-06 3 views
32

Мне нужна переменная таблицы для хранения определенных строк из таблицы в процедуре MySQL. . declare @tb table (id int, имя varchar (200))Создать переменную таблицы в MySQL

Возможно ли это? Если да, то как?

+0

На самом деле, Алексей прав, вы можете сохранить таблицу в переменной, но вам нужно использовать функцию, а не процедуру , Документация MySQL очень понятна. – 2012-07-02 21:22:13

ответ

51

Они не существуют в MySQL, не так ли? Просто используйте временную таблицу:

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

От MySQL here

«Вы можете использовать ВРЕМЕННОЕ ключевое слово при создании таблицы временной таблицы видна только текущей связи и отбрасывается. автоматически, если соединение закрыто. Это означает, что два разных соединения могут использовать одно и то же временное имя таблицы , не вступая в противоречие с друг другу или с существующей таблицей с тем же именем. (существующая таблица скрыта, пока временная таблица не отбрасывается.)»

+2

Что делать, если несколько пользователей попытаются выполнить ту же процедуру, создаст ли она проблему параллелизма? –

+8

нет. временные таблицы зависят от пользователя. – longneck

8

Возможно, временная таблица будет делать то, что вы хотите.

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; 

С forge.mysql.com См. Также временные таблицы кусок this article.

-6

На самом деле вы можете использовать MySQL таблицы переменных. Ниже приведен пример из официальной документации 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; 
+6

-1, это не переменная таблицы, переменная в этом примере содержит только имя таблицы. – gazarsgo

4

Чтобы ответить на ваш вопрос: нет, MySQL не поддерживает типизированные в таблице переменные таким же образом, что и SQL Server (http://msdn.microsoft.com/en-us/library/ms188927.aspx) , Oracle обеспечивает аналогичную функциональность, но называет их типами курсора вместо типов таблиц (http://docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems012.htm).

В зависимости от ваших потребностей вы можете моделировать переменные таблицы/курсора в MySQL с использованием временных таблиц так же, как и Oracle и SQL Server.

Однако существует важное различие между временным табличным подходом и подходом, используемым таблицей/курсором, и оно имеет множество последствий для производительности (именно по этой причине Oracle и SQL Server предоставляют эту функциональность сверх того, что предоставляется временные таблицы).

В частности: переменные таблицы/курсора позволяют клиенту сопоставлять несколько строк данных на стороне клиента и отправлять их на сервер в качестве входных данных в хранимую процедуру или подготовленный оператор. Это устраняет накладные расходы на отправку каждой отдельной строки и вместо этого оплачивает эту накладную один раз для партии строк. Это может оказать значительное влияние на общую производительность при попытке импортировать большее количество данных.

Возможные обходный:

Что вы можете попробовать создают временную таблицу, а затем с помощью LOAD DATA (http://dev.mysql.com/doc/refman/5.1/en/ load-data.html) для потоковой передачи данных во временную таблицу.Затем вы можете передать им имя временной таблицы в хранимую процедуру. Это все равно приведет к двум вызовам сервера базы данных, но если вы перемещаете достаточно строк, там может быть экономия. Конечно, это действительно полезно, если вы выполняете какую-то логику внутри хранимой процедуры при обновлении целевой таблицы. Если нет, вы можете просто захотеть ЗАГРУЗИТЬ ДАННЫЕ непосредственно в целевой таблице.

0

Не решение вопроса, а еще одна простая альтернатива. , если таблица представляет собой таблицу с одним столбцом, которую вы хотите, затем выведите параметр строки, объединив значения и извлеките их из SP.

2

Если вы не хотите хранить таблицу в базе данных, тогда @Evan Todd уже предоставляется временное решение таблицы.

Но если вам нужна эта таблица для других пользователей и вы хотите сохранить ее в db, вы можете использовать ниже процедуру.

Создать ниже 'хранимая процедура':

------------

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 ; 

----------------

Теперь вы можете выполнить эту процедуру, чтобы создать таблицу переменного имени согласно ценам ниже

вызова sp_variable_table();

Вы можете проверить новую таблицу после выполнения ниже command- теста

использования, показать таблицы, как «% Зафар%»; - test - это имя базы данных.

Вы также можете проверить более подробную информацию в поле ниже path-

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

Смежные вопросы