Как я могу разобрать данные в таблицу за пределами MySQL курсора - PullRequest
0 голосов
/ 25 октября 2018

Поэтому я собираюсь создать дамп данных всех табличных данных, которые связаны с идентификатором клиента - и мне не разрешено использовать представления ...

Я новичок в MYSQL и все еще пытаюсьчтобы разобраться в логике.

Я создал несколько временных таблиц, чтобы все таблицы и все клиенты / поставщики (поставщики - это следующий шаг ... Сначала мне нужно исправить клиентов) подключились кcustomerID.

Как разработчик, я думал, что когда я выполняю внутреннее соединение в каждом цикле, финальная таблица получит все результаты, прикрепленные к нему, но когда я пытаюсь объединить значения, моя финальная таблица никогда не изменяется,Проблема должна быть где-то в точке 17, я думаю ...

    -- 1. Set current database
    USE customer;


    -- 2. Set variables
    SET @customer = 'acmemax';
    SET @domain = '%@acmemax.com';


    -- 3. Get customer acmemax
    DROP TEMPORARY TABLE IF EXISTS temporaryCustomerTable;
    CREATE TEMPORARY TABLE temporaryCustomerTable
      SELECT id
      FROM customer.Customer
      WHERE id = @customer
      OR hierarchyId = @customer
      OR hierarchyId LIKE CONCAT(@customer, '|%')


    -- 4. Get any of customer acmemax child entities
      OR hierarchyId LIKE CONCAT('|%', @customer)
      OR hierarchyId LIKE CONCAT('|%', @customer, '|%');


    -- 5. Get any supplier that has a businesslink to any of above acmemax customers
    DROP TEMPORARY TABLE IF EXISTS temporarySupplierTable;
    CREATE TEMPORARY TABLE temporarySupplierTable
      SELECT bln.supplierId AS id
      FROM supplier.Supplier AS spl
      INNER JOIN `business-link`.BusinessLink AS bln
      ON spl.id = bln.supplierId
      INNER JOIN customer.temporaryCustomerTable AS tct
      ON tct.id = bln.customerId;


    -- 6. Get any supplier that has a user assigned that uses an         acmemax.com email address
    DROP TEMPORARY TABLE IF EXISTS temporaryAssignedSupplierTable;
    CREATE TEMPORARY TABLE temporaryAssignedSupplierTable
      SELECT spl.id AS id
      FROM user.User AS usr
      INNER JOIN supplier.Supplier AS spl
      ON spl.id = usr.supplierId
      WHERE usr.id LIKE @domain;


    -- 7. Merge tables as idTable
    DROP TEMPORARY TABLE IF EXISTS idTable;
    CREATE TEMPORARY TABLE idTable
      SELECT ID
      FROM temporaryCustomerTable
      UNION ALL
      SELECT ID
      FROM temporarySupplierTable
      UNION ALL
      SELECT ID
      FROM temporaryAssignedSupplierTable;

    -- 8. Temporary table of suppliers in DB
    DROP TEMPORARY TABLE IF EXISTS allSupplierTables;
    CREATE TEMPORARY TABLE allSupplierTables
      SELECT DISTINCT CONCAT('`', constraints.TABLE_SCHEMA, '`.`',         columns.TABLE_NAME, '`') content
      FROM information_schema.COLUMNS as columns
      RIGHT JOIN information_schema.TABLE_CONSTRAINTS as constraints
      ON columns.TABLE_NAME = constraints.TABLE_NAME
      WHERE columns.COLUMN_NAME = 'supplierId'
      AND constraints.TABLE_SCHEMA NOT LIKE 'mysql'
        AND constraints.TABLE_SCHEMA NOT LIKE 'voucher';


    -- 9. Temporary table of customers in DB
    DROP TEMPORARY TABLE IF EXISTS allCustomerTables;
    CREATE TEMPORARY TABLE allCustomerTables
      SELECT DISTINCT CONCAT('`', constraints.TABLE_SCHEMA, '`.`',         columns.TABLE_NAME, '`') content
      FROM information_schema.COLUMNS as columns
      RIGHT JOIN information_schema.TABLE_CONSTRAINTS as constraints
      ON columns.TABLE_NAME = constraints.TABLE_NAME
      WHERE columns.COLUMN_NAME = 'customerId'
      AND constraints.TABLE_SCHEMA NOT LIKE 'mysql'
      AND constraints.TABLE_SCHEMA NOT LIKE 'voucher';


    -- 10. Get all customer data
    DELIMITER $$

    DROP PROCEDURE IF EXISTS GetAllCustomerData;
    CREATE PROCEDURE GetAllCustomerData(IN tableName VARCHAR(255))
      DETERMINISTIC


      -- 11. Begin procedure to get all customer data
      BEGIN

        DECLARE currentTable VARCHAR(100);
        DECLARE done INT DEFAULT 0;


        -- 12. Declare cursor from temporary table
        DECLARE cur_table CURSOR FOR SELECT content FROM temporaryTable;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;


        -- 13. Create temporary table for cursor
        DROP TEMPORARY TABLE IF EXISTS temporaryTable;
        SET @a = CONCAT('
          CREATE TEMPORARY TABLE temporaryTable
            SELECT DISTINCT content
            FROM ', tableName
        );

        PREPARE stmt1 FROM @a;
        EXECUTE stmt1;

        -- 14. Create temporary table for all fetched data
        DROP TEMPORARY TABLE IF EXISTS allData;
        CREATE TEMPORARY TABLE allData
          SELECT customer.*
          FROM customer.Customer AS customer
          INNER JOIN idTable
          WHERE customer.id LIKE idTable.Id;


        -- 15. Open cursor to fetch data
        OPEN cur_table;

        WHILE done = 0 DO

          FETCH cur_table INTO currentTable;


          -- 16. Create temporary table from current selected data
          DROP TEMPORARY TABLE IF EXISTS currentSelectedTable;
          SET @b = CONCAT('
            CREATE TEMPORARY TABLE currentSelectedTable
            SELECT ct.*
            FROM ', currentTable,' AS ct;
          ');

          PREPARE stmt2 FROM @b;
          EXECUTE stmt2;


          -- 17. Attach fetched data to output table
          SET @c = CONCAT('
            SELECT *
            FROM allData
            INNER JOIN currentSelectedTable
            ON allData.id LIKE currentSelectedTable.customerId;
          ');

          PREPARE stmt3 FROM @c;
          EXECUTE stmt3;

        END WHILE;


        -- 18. Show complete output table
        SELECT * FROM allData;

        CLOSE cur_table;

      END $$

    DELIMITER ;


    -- 19. Start procedure
    CALL GetAllCustomerData('allCustomerTables');

Когда я запускаю это в Datagrid, я получаю 32 таблицы, в которых всегда есть данные customer.Customer в начале и соответствующие значениякаждой строки таблицы в конце, но последняя таблица «allData» по-прежнему содержит только данные из customer.Customer, который соответствует идентификатору customerTid IDTables, НИЧЕГО нового не добавляется.

...