Хранимая процедура MySQL? - PullRequest
       5

Хранимая процедура MySQL?

0 голосов
/ 10 ноября 2011

Я использую MySQL 5.0.У меня есть хранимая процедура, которая получает все метаданные базы данных в строке и возвращает ее.В нем я вызываю другую хранимую процедуру, чтобы получить метаданные таблиц.Я использую следующее, чтобы получить список схем и их таблиц в строке

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

К этому я прикрепляю метаданные полей, вызывая другую хранимую процедуру:

call Getfields(tbNm, dbNm, fields);

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, слишком длинные для coltype в строке 16 !!!Я видел, что тип поля 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;

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Более простой способ, просто запустите его -

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 голосов
/ 11 ноября 2011

Я думаю, что результат сокращен из-за group_concat_max_len.поэтому я установил для него размер 4 294 967 295 (средний блоб), и теперь он показывает все данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...