我需要一个表变量来存储MySQL过程中表中的特定行。 例如。声明@tb表(id int,name varchar(200))
这可能吗?如果是的话怎么样?
答案 0 :(得分:63)
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 .... */
“您可以使用TEMPORARY关键字 在创建表格时。临时的 表仅对当前可见 连接,并被删除 连接时自动 关闭。这意味着两个不同 连接可以使用相同的临时 表名没有冲突 彼此或与现有的 非TEMPORARY同名表。 (现有表格一直隐藏到 临时表被删除。)“
答案 1 :(得分:9)
也许临时表会做你想做的事。
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的临时表格。
答案 2 :(得分:5)
回答你的问题:不,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)。
根据您的需要,您可以使用临时表以类似于Oracle和SQL Server提供的方式在MySQL中模拟表/游标类型变量。
但是,临时表方法和表/游标类型变量方法之间存在重要差异,并且它具有很多性能影响(这就是为什么Oracle和SQL Server提供此功能的原因除了提供临时表格。
具体来说:表/游标类型变量允许客户端在客户端整理多行数据,并将它们作为输入发送到存储过程或预准备语句。这消除了发送每个单独行的开销,而是为一批行支付一次开销。当您尝试导入大量数据时,这会对整体性能产生重大影响。
可能的解决方法:
您可能想要尝试创建一个临时表,然后使用LOAD DATA(http://dev.mysql.com/doc/refman/5.1/en/load-data.html)命令来传输数据进入临时表。然后,您可以将临时表的名称传递给存储过程。这仍然会导致对数据库服务器的两次调用,但是如果要移动足够的行,那么可能会节省一些。当然,如果您在更新目标表时在存储过程中执行某种逻辑,这实际上是有益的。如果没有,您可能只想将DATA直接加载到目标表中。
答案 3 :(得分: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();
执行以下命令后可以检查新表 -
使用test;显示'%zafar%'等表格; - 测试在这里'数据库'名称。
您还可以在以下路径查看更多详细信息 -
http://mydbsolutions.in/how-can-create-a-table-with-variable-name/
答案 4 :(得分:1)
MYSQL 8通过以下方式做到这一点:
MYSQL 8支持JSON表,因此您可以将结果加载到JSON变量中,然后使用JSON_TABLE()命令从该变量中进行选择。
答案 5 :(得分:0)
不是问题的解决方案,而是另一个简单的替代方案。 如果表是您想要的单个列表,则通过连接值并在SP内提取来派生字符串参数。