2009-10-06 5 views
32

MySQLプロシージャ内のテーブルの特定の行を格納するには、テーブル変数が必要です。 など。 @tbテーブルを宣言する(ID int、name varchar(200))MySQLでテーブル変数を作成

これは可能ですか?はいの場合はどうですか?

+0

で詳細を確認することができ、アレクセイは右である、あなたは変数にテーブルを保存することができますが、機能ではなく、プロシージャを使用する必要があります。 MySQLのドキュメントは非常に明確です。 –

答えて

51

これらはMySQLには存在しませんか?テーブルを作成するときは、TEMPORARYキーワード を使用することができます」MySQL here

から

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 .... */ 

TEMPORARY 表は、現在 接続に表示され、そして廃棄されます:ただ一時テーブルを使用します。接続が の場合、 が自動的に閉じます。つまり、2つの異なる接続が同じ テーブル名を同じ と矛盾することなく使用できます。同じ名前の既存の 非TEMPORARYテーブルを使用します。 (既存のテーブルは、一時テーブルが削除され まで隠されています。)」

+2

複数のユーザーが同じプロシージャを実行しようとすると、並行性の問題が発生しますか? –

+8

番号。テンポラリテーブルはユーザ固有です。 – longneck

8

おそらく一時テーブルはあなたがやりたいだろう。forge.mysql.comから

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; 

。またの一時テーブルピースを参照してください。 this article

-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; 
+6

-1、これはテーブル変数ではありません。この例の変数はテーブル名のみを含んでいます。 – gazarsgo

4

質問に答えてください:いいえ、MySQLはSQL Server(http://msdn.microsoft.com/en-us/library/ms188927.aspx)と同じ方法でテーブル型変数をサポートしていません。 。オラクル社でも同様の機能が提供されていますが、表の型ではなくカーソル型が使用されています(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を直接ターゲット表に入れることができます。

0

問題の解決方法ではなく、別の簡単な方法です。 テーブルが単一の列テーブルの場合は、値を連結して文字列パラメータを取得し、SP内で抽出する必要があります。

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 ; 

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

今、あなたはbelow-

コールsp_variable_table(につきとして変数名のテーブルを作成するには、この手順を実行することができます)。

あなたはコマンド -

使用テストの下に実行した後、新しいテーブルを確認することができます;「%のzafarの%」のようなショーのテーブル。 - テストはここでは「データベース」の名前です。

ます。また、実際には以下のpath-

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

関連する問題