Ассоциативный массив с хранимой процедурой mysql в сценариях оболочки

Вот моя таблица ввода:

queue_id | queue_name|
----------------------
qid1     |  qname1   |
----------------------

Мой результат должен быть

key      | value     |
----------------------
queueId  | qid1      |
queueName| qname1    |
----------------------

где as map [queue_id] = queueId map [queue_name] = queueName

Вот сценарий, который у меня есть


    #!/bin/bash
    keyPair[queue_name]="queueName"
    keyPair[queue_id]="queueId"
    .....
    CREATE PROCEDURE queue_migration()
    BEGIN
    DECLARE rowcount INT DEFAULT 0;
    DECLARE colcount INT DEFAULT 0;
    DECLARE i INT DEFAULT 0;
    DECLARE j INT DEFAULT 0;
    DECLARE col_name VARCHAR(255);
    DECLARE col_names CURSOR FOR
      SELECT column_name
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE table_name = 'table_name' AND table_schema = 'dbname'
      ORDER BY ordinal_position;
    Get the row count into rowCount
    Get the column count into colCount
    SET i = 0;
    WHILE i= colcount THEN
                    CLOSE col_names;
                    LEAVE the_loop;
               END IF;
               FETCH col_names INTO col_name;

               INSERT INTO logy SELECT CONCAT(\"See ${keyPair[\",col_name,\"]} here\");
               SET j

         = j + 1;
                END LOOP

     the_loop;
            SET i = i + 1;
    END WHILE;

Я могу правильно видеть col_name (queue_id и queue_name). Но сопоставление не удается. Когда я выполняю $ {keyPair ['queue_name'], я получаю queueName. Но $ {keyPair [col_name]} пусто. Предложения, пожалуйста.


person Divya P    schedule 21.02.2015    source источник


Ответы (1)


Чтобы «построить» запрос в сохраненной подпрограмме, вам необходимо prepare и execute его. Никакой замены не происходит так, как вы надеетесь. Что-то вроде:

SET @stmt = CONCAT( 'INSERT INTO logy SELECT CONCAT("See ${keyPair["',
                    col_name,
                    '"]} here');
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

(Приносим извинения, если это не совсем так.)

person Rick James    schedule 21.02.2015