2011-11-10 4 views
0

J'utilise mysql 5.0. J'ai une procédure stockée qui obtient toutes les métadonnées de la base de données dans une chaîne et le renvoie. J'y appelle une autre procédure stockée pour obtenir les métadonnées des tables. J'utilise ce qui suit pour obtenir la liste des schémas et leurs tables dans une chaîneMa procédure stockée sql

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

Pour cela, je joins les métadonnées des champs en appelant une autre procédure stockée:

call Getfields(tbNm, dbNm, fields); 

champs a été déclarée :

Declare fields blob default ""; 

Je concaténer alors tout pour obtenir une seule chaîne:

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

dbNm et tbNm sont déclarés comme

varchar(50) 

La sortie dans mes getFields stockées proc est de type out fields blob

La sortie de ma procédure principale est OUT output blob

Quand je lance les getfields séparément il retourne les données de champ pour une table, mais quand je l'appelle à partir de ma procédure principale, il retourne une erreur 1406 données trop longtemps pour coltype sur la ligne 16 !!! J'ai vu que le type de champ column_type dans la table des colonnes est long, donc j'ai fait le type de variable de concaténation blob.

Des astuces/suggestions ?? J'ai été coincé avec cela pendant quelques jours !!

- requête

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; 

Répondre

1

façon plus facile, il suffit de courir -

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; 

Modifier

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

Je ne sais pas pourquoi l'appel interne à une procédure stockée donnait une erreur mais tout ce qui finit bien est bien !! J'ai utilisé la requête comme un curseur et créé une chaîne séparée par des virgules et il n'a aucun problème! Merci beaucoup! – kavita

+0

Vous pouvez toujours éviter d'utiliser des curseurs, jetez un oeil à la requête éditée. – Devart

+0

oui j'ai utilisé la requête éditée sans curseur. mais il retourne seulement une seule table de données. Je veux toutes les requêtes de toutes les bases de données, si je n'exécute que la requête interne, elle affiche toutes les lignes de toutes les bases de données, mais après l'ajout de la concaténation de groupe externe, une seule table est affichée. . – kavita

0

Je pense que les res ult est réduit en raison de group_concat_max_len. donc je l'ai mis à la taille de 4 294 967 295 (blob moyen) et maintenant il montre toutes les données.