web-dev-qa-db-ja.com

MySQLでテーブル変数を作成する

MySQL プロシージャ内のテーブルから特定の行を格納するためのテーブル変数が必要です。例えば。 @tbテーブルの宣言(id int、name varchar(200))

これは可能ですか?はい、どうですか?

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

63
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; 

forge.mysql.com から。 この記事 の一時テーブルも参照してください。

9
Ewan Todd

あなたの質問に答えるために:いいえ、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が一時機能で提供される以上の機能を提供する理由ですテーブル)。

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

可能な回避策:

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

6
numbsafari

データベースにテーブルを保存したくない場合、@ 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/

2
Zafar Malik

MYSQL 8は、ある意味で:

MYSQL 8はJSONテーブルをサポートしているため、結果をJSON変数にロードし、JSON_TABLE()コマンドを使用してその変数から選択できます。

1
Justin Levene

質問に対する解決策ではなく、別の単純な代替案。テーブルが必要な単一列のテーブルである場合、値を連結してSP内で抽出することにより、文字列パラメーターを導出します。

0
sjd