60

I need a table variable to store the particular rows from the table within the MySQL procedure. E.g. declare @tb table (id int,name varchar(200))

Is this possible? If yes how?

4

5 に答える 5

82

それらは 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 テーブルは現在の接続にのみ表示され、接続が閉じられると自動的に削除されます。これは、2 つの異なる接続が、それぞれと競合することなく同じ一時テーブル名を使用できることを意味します。他の、または同じ名前の既存の TEMPORARY 以外のテーブルを使用します (一時テーブルが削除されるまで、既存のテーブルは非表示になります。)"

于 2009-10-06T10:59:23.830 に答える
14

おそらく、一時テーブルはあなたが望むことをするでしょう。

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から。この記事の一時テーブルの部分も参照してください。

于 2009-10-06T11:04:12.420 に答える
7

あなたの質問に答えるには: いいえ、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)。

必要に応じて、Oracle と SQL Server の両方で提供されるものと同様の方法で一時テーブルを使用して、MySQL でテーブル/カーソル型の変数をシミュレートできます。

ただし、一時テーブルのアプローチとテーブル/カーソル型変数のアプローチには重要な違いがあり、パフォーマンスに多くの影響があります (これが、Oracle と SQL Server が一時テーブルで提供される機能に加えてこの機能を提供する理由です)。テーブル)。

具体的には、テーブル/カーソル型の変数により、クライアントはクライアント側で複数行のデータを照合し、それらをストアド プロシージャまたは準備済みステートメントへの入力としてサーバーに送信できます。これによって排除されるのは、個々の行を送信するオーバーヘッドであり、代わりに、行のバッチに対してそのオーバーヘッドを 1 回支払うだけです。これは、大量のデータをインポートしようとすると、全体的なパフォーマンスに大きな影響を与える可能性があります。

考えられる回避策:

試してみたいことは、一時テーブルを作成してから、LOAD DATA (http://dev.mysql.com/doc/refman/5.1/en/load-data.html) コマンドを使用してデータを一時テーブルにストリーミングすることです。テーブル。次に、一時テーブルの名前をストアド プロシージャに渡すことができます。これでもデータベース サーバーへの 2 つの呼び出しが発生しますが、十分な数の行を移動している場合は節約になる可能性があります。もちろん、これが実際に役立つのは、ターゲット テーブルを更新するときにストアド プロシージャ内で何らかのロジックを実行している場合のみです。そうでない場合は、ターゲット テーブルに直接 LOAD DATA を実行することをお勧めします。

于 2012-05-17T00:34:50.547 に答える
2

テーブルをデータベースに保存したくない場合は、@Evan Todd が既に一時テーブル ソリューションを提供しています。

ただし、他のユーザーのためにそのテーブルが必要で、データベースに保存したい場合は、以下の手順を使用できます。

以下の「ストアド プロシージャ」を作成します。

———————————</p>

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 ;

———————————————–</p>

これで、この手順を実行して、以下のように変数名テーブルを作成できます-

sp_variable_table() を呼び出します。

以下のコマンドを実行した後、新しいテーブルを確認できます-

テストを使用;「%zafar%」のようなテーブルを表示; — test はここでは「データベース」名です。

以下のパスで詳細を確認することもできます-

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

于 2014-02-19T08:08:22.437 に答える