【问题标题】:MySQL stored procedure?MySQL存储过程?
【发布时间】:2011-11-10 08:39:23
【问题描述】:

我正在使用 mysql 5.0。我有一个存储过程,它以字符串形式获取数据库的所有元数据并返回它。在其中我调用另一个存储过程来获取表的元数据。我正在使用以下内容在字符串中获取模式列表及其表

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 而言太长了!!! 我看到columns表中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;

【问题讨论】:

    标签: mysql stored-procedures


    【解决方案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;
    

    【讨论】:

    • 不知道为什么对存储过程的内部调用会出错,但一切都很好!我将查询用作游标并创建了一个逗号分隔的字符串,它没有任何问题!非常感谢!
    • 你仍然可以避免使用游标,看看编辑过的查询。
    • 是的,我使用了没有光标的已编辑查询。但它只返回一个表数据。我想要所有数据库的所有查询,如果我只运行内部查询,它会显示所有数据库中所有表的所有行,但是在添加外部组 concat 后,只显示一个表数据。我的查询在编辑中.
    • 我认为结果由于 group_concat_max_len 而被缩减
    • 您对 'group_concat_max_len' 变量是正确的;在选择之前尝试执行此语句 - 'SET @@session.group_concat_max_len = 100000;'
    【解决方案2】:

    我认为结果由于 group_concat_max_len 而被缩减。所以我将它设置为 4,294,967,295(中等 blob)的大小,现在它显示了所有数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2017-04-26
      • 2011-03-09
      • 2011-03-31
      • 1970-01-01
      相关资源
      最近更新 更多