2011-11-10 96 views
0

我正在使用mysql 5.0。我有一個存儲過程,它獲取數據庫中的所有元數據並將其返回。在其中我調用另一個存儲過程來獲取表的元數據。我現在用的是下面來獲得字符串我的sql存儲過程

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

對此我附上領域的元數據模式和他們的表的列表中通過調用另一個存儲過程:

call Getfields(tbNm, dbNm, fields); 

領域已被宣佈爲:

Declare fields blob default ""; 

我再串連所有獲得一個字符串:

set output = concat(output, dbNm, ".", tbNm, "*", fields); 

dbNm和tbNm被聲明爲

varchar(50) 

存儲過程在我getFields的輸出是類型的out fields blob

從我的主要過程的輸出是OUT output blob

當我單獨運行getfields它返回一個表的字段數據,但是當我從我的主要過程中調用它時,它會返回一個1406錯誤數據,對於第16行上的coltype來說太長了! 我看到列表中的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

是的,我用編輯的查詢沒有光標。但它只返回單個表數據。我想要所有數據庫的所有查詢,如果我只運行內部查詢,它會顯示所有數據庫中所有表的所有行,但在添加外部組concat後,只顯示一個表數據。我的查詢處於編輯狀態。 – kavita

0

我認爲RES ult由於group_concat_max_len而縮減。所以我把它設置爲4,294,967,295(中等大小)的大小,現在它顯示所有的數據。