2011-11-10 1 views
0

私はmysql 5.0を使用しています。私は文字列内のデータベースのすべてのメタデータを取得し、それを返すストアドプロシージャを持っています。私はテーブルのメタデータを取得するために別のストアドプロシージャを呼び出します。My SQLストアドプロシージャ

call Getfields(tbNm, dbNm, fields); 

フィールドとして宣言されました:私は私が別のストアドプロシージャを呼び出すことにより、フィールドのメタデータを添付しています。この文字列内の

DECLARE tb_cur CURSOR FOR SELECT table_name, table_schema FROM INFORMATION_SCHEMA.TABLES; 

をスキーマとそのテーブルのリストを取得するには、以下を使用しています:

:私は、単一の文字列を取得するために、すべてを連結

Declare fields blob default ""; 

私は別にれるGetFieldsを実行すると3210

dbNmとtbNmが

varchar(50) 

procの保存私れるGetFieldsで出力型であると宣言されているout fields blob

私の主な手順からの出力はOUT output blob

ですテーブルのフィールドデータを返しますが、メインプロシージャ内から呼び出すと、行16のcoltypeで長すぎる1406エラーデータが返されます。 カラムテーブルのcolumn_typeフィールドのタイプが長いテキストであることがわかりましたので、連結変数タイプのBLOBを作成しました。

ヒント/提案? 私は数日間このことに固執しています!

- クエリ

SELECT GROUP_CONCAT(table_info SEPARATOR '~') table_info FROM (
    SELECT CONCAT(t.table_schema, '.', t.table_name, '*', 
    GROUP_CONCAT(CONCAT(c.column_name, '+', c.COLUMN_TYPE) SEPARATOR ',')) 
    table_info 
    FROM information_schema.TABLES t 
    JOIN information_schema.COLUMNS c 
    ON t.table_schema = c.table_schema AND t.table_name = c.table_name 
    GROUP BY t.table_name 
    ) t; 

答えて

1

もっと簡単な方法は、ちょうどそれを実行 -

SET @db = 'test'; -- Specify your schema 

SELECT CONCAT(t.table_schema, '.', t.table_name, '*', GROUP_CONCAT(c.column_name)) table_info FROM information_schema.`TABLES` t 
    JOIN information_schema.`COLUMNS` c 
    ON t.table_schema = c.table_schema AND t.table_name = c.table_name 
WHERE t.TABLE_SCHEMA = @db 
GROUP BY t.table_name; 

編集

SELECT GROUP_CONCAT(table_info SEPARATOR '\r\n') table_info FROM (
    SELECT CONCAT(t.table_schema, '.', t.table_name, '*', GROUP_CONCAT(c.column_name)) table_info FROM information_schema.`TABLES` t 
    JOIN information_schema.`COLUMNS` c 
     ON t.table_schema = c.table_schema AND t.table_name = c.table_name 
    WHERE t.TABLE_SCHEMA = @db 
    GROUP BY t.table_name 
) t; 
+0

ストアドプロシージャの内部呼び出しでエラーが発生していたのはなぜですか?私は、カーソルとしてクエリを使用し、コンマ区切り文字列を作成し、それは何の問題もない!どうもありがとう! – kavita

+0

まだカーソルの使用を避けることができます。編集したクエリを見てください。 – Devart

+0

はいカーソルなしで編集したクエリを使用しました。 1つの表データのみを戻します。私はすべてのデータベースのすべてのクエリを、私はすべてのデータベースのすべてのテーブルのすべての行を表示する内側のクエリを実行する場合は、外部のグループconcatを追加した後に単一のテーブルのデータが表示されます。私のクエリは編集されています。 – kavita

0

私は解像度を考えますultはgroup_concat_max_lenによって縮小されます。だから私は4,294,967,295(中程度の大きさ)のサイズに設定し、今はすべてのデータを表示します。