2011-12-09 11 views
1

同じスキーマを持つ10個の表があります。 オーバーロードされたストアドプロシージャを作成しようとしているので、テーブルの束を単純なSELECT(SELECT * FROM tableX)と組み合わせることができます。各テーブルに1000(異なる)行がある場合、次のようなストアドプロシージャを作成します。可変数のテーブルからの結合。 (ストアド・ストアド・プロシージャのオーバーロード)

CALL getRowsByNum(table1); -> 1000 rows 
CALL getRowsByNum(table1, table2, table4); -> 3000 rows 

...など。

私は希望SELECT * FROM X UNION ALL SELECT * FROM X UNION ALL 10のオーバーロードされた手順.....などを書いて道の一部を得たが、それは本当に狂気です。

誰かが別の提案をしていますか?この愚かなセットアップは、以前に行われたアーキテクチャ上の決定の結果です。

ありがとうございます!

+1

は – ajreal

+0

クレイジー、建築痛いが、役に立つの再設計、私は感じて誰かがそれを視覚化して素敵な果たしているように...「オーバーロードされた」ビットであることを言うだろう持っていましたアプリ。 – batman

答えて

1

同じ名前の変数またはプロシージャーを複数持つことはできません。

私はあなたの問題を簡単に解決できるとは思わない。

編集:私は本当に醜い解決策を考えましたが、あなたがそれを使いたいなら、私はあなたにそれを残します。これは、テストされていない疑似コードのみです。

「table1、table2、table3、...」などの値を保持するのに十分な長さのvarcharを使用してprocを作成します。 (当然の別の識別子かもしれません)

すべてのテーブルをユニオンで書き込みます。同じものなので、時間と空間を節約するために*を使用してください。

delimiter // 

create procedure megaunion (tables varchar(255)) 
begin 
    select * from table1 where find_in_set('table1', tables) 
    union 
    select * from table2 where find_in_set('table2', tables) 
    .... 
end// 

すべてのテーブルをリストしてください。少なくともあなたは可能な順列を列挙する必要はなく、プロシージャのユーザーはあなたのやり方を知らないでしょう:)

+0

機能はありませんか?私はあなたがそれらをオーバーロードすることができると思います... – batman

+0

いいえ。すべてのprocsと関数はmysql.procに格納されています。データベースごとに同じ名前を使用できるように、主キーはdb、name、およびtypeです。 1つはproc用、もう1つは関数用です。また、関数は結果セットを返すことができません。 –

+0

お役立ち情報ありがとうございます – batman

4

DB構造を再考する必要があることに同意します。ところで、ちょうど楽しみのため :)

drop database if exists my_test; 

create database my_test; 

use my_test; 

create table table1 (
id int not null auto_increment primary key, 
my_field varchar(10) 
) engine = myisam; 

create table table2 like table1; 
create table table3 like table1; 
create table table4 like table1; 
create table table5 like table1; 

insert into table1 (my_field) values ('aaa'),('bbb'); 
insert into table2 (my_field) values ('ccc'),('ddd'),('eee'); 
insert into table3 (my_field) values ('fff'),('ggg'); 
insert into table4 (my_field) values ('hhh'),('iii'),('jjj'); 
insert into table5 (my_field) values ('kkk'),('lll'); 


delimiter // 
drop procedure if exists tables_union // 
create procedure tables_union (in str varchar(10000),in db varchar(100)) 
begin 
set @qry = (select group_concat(concat('select * from ',table_name) separator ' union all ') 
      from information_schema.tables 
      where find_in_set(table_name,str) 
      and table_schema = db); 
-- select @qry; 
prepare stmt from @qry; 
execute stmt; 
deallocate prepare stmt;    

end; // 
delimiter ; 

call tables_union('table4,table3,table1','my_test'); 

+----+----------+ 
| id | my_field | 
+----+----------+ 
| 1 | aaa  | 
| 2 | bbb  | 
| 1 | fff  | 
| 2 | ggg  | 
| 1 | hhh  | 
| 2 | iii  | 
| 3 | jjj  | 
+----+----------+ 
7 rows in set (0.00 sec) 
関連する問題