it-swarm.com.ru

Создать табличную переменную в MySQL

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

Это возможно? Если да, то как?

38
ANIL MANE

Они не существуют в 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 При создании таблицы. Таблица TEMPORARY Видна только для текущего подключения И автоматически удаляется , Когда подключение закрыто что два разных соединения могут использовать одно и то же временное имя таблицы , не конфликтуя друг с другом или с существующей таблицей пока временная таблица не будет удалена.) "

62
Preet Sangha

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

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; 

From forge.mysql.com . Смотрите также временные таблицы часть эта статья .

8
Ewan Todd

Чтобы ответить на ваш вопрос: нет, 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) для потоковой передачи данных во временную таблицу. Таблица. Затем вы можете передать им имя временной таблицы в вашу хранимую процедуру. Это все равно приведет к двум вызовам к серверу базы данных, но если вы перемещаете достаточно строк, это может сэкономить. Конечно, это действительно полезно только в том случае, если вы выполняете какую-то логику внутри хранимой процедуры при обновлении целевой таблицы. Если нет, вы можете просто загрузить данные непосредственно в таблицу назначения.

5
numbsafari

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

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

Создайте ниже «хранимую процедуру»:

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

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/

2
Zafar Malik

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

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

1
Justin Levene

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

0
sjd