Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Они не существуют в 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 здесь

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

Ответ 2

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

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

Ответ 3

Ответьте на свой вопрос: нет, 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) для потоковой передачи данных во временную таблицу. Затем вы можете передать им имя временной таблицы в хранимую процедуру. Это все равно приведет к двум вызовам сервера базы данных, но если вы перемещаете достаточно строк, там может быть экономия. Конечно, это действительно полезно, если вы выполняете какую-то логику внутри хранимой процедуры при обновлении целевой таблицы. Если нет, вы можете просто захотеть ЗАГРУЗИТЬ ДАННЫЕ непосредственно в целевую таблицу.

Ответ 4

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

Ответ 5

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

Ответ 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;