Создать табличную переменную в MySQL - PullRequest
43 голосов
/ 06 октября 2009

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

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

Ответы [ 6 ]

63 голосов
/ 06 октября 2009

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

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

С MySQL здесь

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

9 голосов
/ 06 октября 2009

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

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 . См. Также часть временных таблиц этой статьи .

5 голосов
/ 17 мая 2012

Чтобы ответить на ваш вопрос: нет, MySQL не поддерживает переменные с табличным типом так же, как SQL Server (http://msdn.microsoft.com/en-us/library/ms188927.aspx). Oracle предоставляет аналогичные функциональные возможности, но называет их типами Cursor вместо табличных типов (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)) для потоковой передачи данных во временную таблицу. Затем вы можете передать им имя временной таблицы в вашу хранимую процедуру. все равно приведет к двум вызовам к серверу базы данных, но если вы перемещаете достаточно строк, это может сэкономить. Конечно, это действительно выгодно, только если вы выполняете какую-то логику внутри хранимой процедуры при обновлении цели Таблица. Если нет, вы можете просто ЗАГРУЗИТЬ ДАННЫЕ непосредственно в таблицу назначения.

2 голосов
/ 19 февраля 2014

Если вы не хотите хранить таблицу в базе данных, @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 ();

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

использовать тест; показывать таблицы типа "% zafar%"; - здесь тест - имя базы данных.

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

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

1 голос
/ 11 октября 2018

MYSQL 8 делает, таким образом:

MYSQL 8 поддерживает таблицы JSON, поэтому вы можете загрузить свои результаты в переменную JSON и выбрать из этой переменной команду JSON_TABLE ().

0 голосов
/ 27 августа 2013

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

...