автоматически помещать результаты вызванной процедуры в оператор выбора - PullRequest
1 голос
/ 09 июля 2010

Я играю с некоторым кодом из статьи, написанной Питером Броули , найденной здесь на странице 6 pdf. Я пытаюсь выяснить, как это автоматизировать, чтобы результат процедуры автоматически помещался в запрос выбора. Прямо сейчас я вызываю процедуру, экспортирую результат в текстовый файл, перехожу к текстовому файлу вручную (щелкаю мышью), копирую результат и вставляю его в оператор выбора. Я не смог выяснить, как вставить оператор select в процедуру или поместить процедуру в таблицу в моей базе данных или в переменную, которую я могу вызвать из оператора select. Есть идеи?

Вот пример кода от Питера Броули, который я пытался автоматизировать:

use database;
DROP PROCEDURE IF EXISTS writesumpivot;
DELIMITER |
CREATE PROCEDURE writesumpivot(
    db CHAR(64), tbl CHAR(64), pivotcol CHAR(64), sumcol CHAR(64)
)
BEGIN
DECLARE datadelim CHAR(1) DEFAULT '"';
DECLARE comma CHAR(1) DEFAULT ',';
DECLARE singlequote CHAR(1) DEFAULT CHAR(39);
SET @sqlmode = (SELECT @@sql_mode);
SET @@sql_mode='';
SET @pivotstr = CONCAT( 'SELECT DISTINCT CONCAT(', singlequote,
                    ',SUM(IF(', pivotcol, ' = ', datadelim, singlequote,
                    comma, pivotcol, comma, singlequote, datadelim,
                    comma, sumcol, ',0)) AS `',
                    singlequote, comma, pivotcol, comma, singlequote, '`',
                    singlequote, ') AS sumpivotarg FROM ', db, '.', tbl, 
                    ' WHERE ', pivotcol, ' IS NOT NULL' );
-- UNCOMMENT TO SEE THET MIDLEVEL SQL:
-- SELECT @pivotstr;
PREPARE stmt FROM @pivotstr;
EXECUTE stmt;
drop prepare stmt;
SET @@sql_mode=@sqlmode;
END
|
DELIMITER ;
call writesumpivot('database', 'table', 'pivotcol','sumcol');

Тогда оператор Select выглядит следующим образом:

SELECT
    infoField
    [results of the call]
FROM
    database.table
GROUP BY infoField;

Если предположить, что я выполнил вызов, экспортировал результаты, скопировал их и вставил их в оператор выбора, мои личные результаты вызова в запросе SELECT будут выглядеть примерно так:

SELECT 
    infoField
    ,SUM(IF(pivotcol = "Yellow",sumcol,0)) AS `Yellow`
    ,SUM(IF(pivotcol = "Red",sumcol,0)) AS `Red`
    ,SUM(IF(pivotcol = "Purple",sumcol,0)) AS `Purple`
    ,SUM(IF(pivotcol = "Orange",sumcol,0)) AS `Orange`
    ,SUM(IF(pivotcol = "Green",sumcol,0)) AS `Green`
    ,SUM(IF(pivotcol = "Blue",sumcol,0)) AS `Blue`
    ,SUM(IF(pivotcol = "White",sumcol,0)) AS `White`
FROM database.table
GROUP BY infoField;

Запуск приведенного выше оператора select дает мне нужную сводную таблицу. Я пытаюсь выяснить, как включить это в веб-сайт, поэтому его нужно автоматизировать.

Я попытался вставить таблицу создания, а затем сослаться на таблицу, но не получил желаемых результатов. Отредактировал последний раздел ПРОЦЕДУРЫ следующим образом:

--SELECT @pivotstr;
DROP TABLE IF EXISTS temp2;
CREATE TABLE IF NOT EXISTS temp2(sumpivotarg varchar(8000));
PREPARE stmt FROM @pivotstr;  
...

изменил вызов и выберите следующее:

call writesumpivot('database','table','pivotcol','sumcol');
insert into temp2(sumpivotarg) values(@pivotstr);

SELECT 
   table.infoField, temp2.sumpivotarg
FROM table, temp2
GROUP BY infoField

Результатом этого стал общий код, а не суммирование содержимого ячеек в базе данных. это выглядит примерно так:

infoField | sumpivotarg <- Col Заголовки </p>

123 | SELECT DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'') ..

124 | SELECT DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'') ..

125 | выберите DISTINCT CONCAT ('Sum (if (pivotcol = ", pivotcol", sumcol, 0)) AS 'pivotcol,'') ..

Ответы [ 2 ]

1 голос
/ 17 марта 2011

Я не имею в виду неуважение к mySQL, но вся эта запись в временную таблицу для передачи табличных данных между хранимыми процедурами является неоптимальной и опасной (в реальной обработке транзакций). Я искренне надеюсь, что команда MySQL создаст функциональность хранимых процедур на уровне предприятия. Кроме того, функции MySQL, которые не могут возвращать таблицы, являются явным недостатком.

Я медленно перемещаю процесс в Linux и mySQL из MSSQL. Недостатки mySQL в отделе процедур и функций вынуждают переписывать некоторые основные типы kludgey (временные таблицы и глобальные переменные и т. Д.).

Я пишу SP около 20 лет (Sybase до SQL Server) и твердо убежден, что использование динамического SQL не использует преимущества базы данных на стороне сервера. Многие пытаются реализовать уровень данных на уровне клиента, но сервер лучше подходит для этой задачи. Это естественное разделение функциональности и данных. Кроме того, одновременное выполнение нескольких предварительно скомпилированных вызовов на сервере несколько более оптимально, чем повторные вызовы на сервер для одних и тех же процессов.

Давай, команда MySQL, я держу пальцы скрещенными ...

0 голосов
/ 09 июля 2010

Вы можете создать временную таблицу в вашей БД. Используйте SQL insert для вставки данных во временную таблицу в результате выполнения хранимой процедуры. После этого вы можете использовать эту временную таблицу внутри оператора select.

Вот ответ, который показывает, как это сделать:

Использовать набор результатов хранимой процедуры mysql в другой хранимой процедуре

Просто чтобы упомянуть похожий вопрос:

MySQL Как вставить INTO временную таблицу из хранимой процедуры

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