2009-03-26 2 views
15

これは質問653714と非常によく似ていますが、SQL Serverの代わりにMySQLの場合に似ています。MySQL [ストアドプロシージャ]から[temp table]を挿入する方法

基本的に、私はいくつかのストアドプロシージャの基礎となる複雑な選択を持っています。私は、ストアドプロシージャを介してコードを共有したいと思いますが、私はこれを行う方法がわかりません。私はこれを行うことができる1つの方法は、共有の選択ストアドプロシージャを作成し、そのストアドプロシージャを他のストアドプロシージャから呼び出すことです。ネストされたストアドプロシージャの結果セットを操作する方法を理解できません。私がそれらを一時テーブルに入れることができれば、結果を効果的に使うことができましたが、私は一時テーブルでそれらを取得する方法を理解できません。たとえば、これはうまくいかない:

CREATE TEMPORARY TABLE tmp EXEC nested_sp(); 

答えて

13

問題は、ストアドプロシージャは実際に直接出力を返さないことです。スクリプト内でselect文を実行できますが、戻り値はありません。

CALL StoredProcedureName();経由でストアドプロシージャが呼び出され、のようにその出力を指示できません。(関数とは異なります)が返されません。

MySQL Call Command

+0

インラインサブクエリを使用してみてください – bobobobo

+14

これは答えですか?解決策はどこですか? – Serge

+0

これはできませんか? – Samra

5

私の最初の反応は「それは私のように思える」と言われました。それは抽象的ではありませんので、ケースごとにSPにばらつきを加えるだけですか?

そうでなければ存在しない一時テーブルを追加するものは、非常に可能性の高い反パターンです。

4

は、私は、これは遅れて本当に来ている知っているが、それは本当の解決策を見つけるために私の年齢を取ったので、私も共有することがあります。私は下の例で取り組んだ。作成した

テーブルは以下のとおりです。

CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(B_ID), 
TITLE VARCHAR(100), 
DESCRIPTION VARCHAR(30), 
PRICE DOUBLE); 

CREATE TABLE BOOK_COMMENT(

PRIMARY KEY(B_C_ID), 
B_C_ID INT NOT NULL AUTO_INCREMENT, 
REMARK VARCHAR(120), 
B_ID INT, 
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 

CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(A_ID), 
A_NAME CHAR(15), 
B_ID INT, 

FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 
  1. DELIMITER

CREATE PROCEDURE BOOK_IMPORTANT(_PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT) 

BEGIN 

INSERT INTO BOOK(PRICE) 

VALUES(_PRICE); 

SET _B_ID=LAST_INSERT_ID(); 

INSERT INTO BOOK_COMMENT(B_ID) 

VALUES(_B_ID); 

SET _BD_ID=LAST_INSERT_ID(); 

INSERT INTO AUTHOR(A_NAME,B_ID) 

VALUES(A_NAME,_BD_ID); 

END 

その後、値を挿入するには、次を使用します。

CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID()); 

LAST_INSERT_ID()は、テーブルの最後の自動インクリメントを取り、子テーブルの参照列に挿入します。

プロシージャのパラメータ_B_ID_BD_IDは、B_IDが両方のテーブルの外部キーとして必要なので、B_IDを表します。

ご迷惑をおかけして申し訳ありません。他のすべての人は、あなたが自動的にそれを行う方法を知っていることを期待しています。欲しいのですが。

3

ストアドプロシージャでは「SELECT INTO」できません。

最初にテンポラリ・テーブルを作成し、通常の "INSERT INTO"を使用してクエリ結果を作成したテンポラリ・テーブルに格納するストアド・プロシージャを用意してください。一時テーブルは、ドロップするか、接続が閉じられるまで表示されます。

関連する問題