Использование функции Dynami c SQL в MySql - PullRequest
0 голосов
/ 27 января 2020

Я создал функцию в phpMyAdmin, как показано на этом скриншоте screenshot.

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

Select DMax ("id","customers")

I получить ошибку # 1305 о том, что uTable не существует. Вероятно, это некоторая базовая проблема синтаксиса c, поскольку uTable в операторе sql воспринимается буквально и не рассматривается как параметр. Так как мне заставить это работать?

1 Ответ

1 голос
/ 27 января 2020

Нельзя использовать параметры для процедуры для имен столбцов или таблиц. Вместо этого вам нужно подготовить оператор с использованием этих значений и выполнить его. Например:

BEGIN
    DECLARE uValue INT(11);
    SET @sql = CONCAT('SELECT MAX(', uField, ') INTO uValue FROM ', uTable);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    RETURN uValue;
END

Обратите внимание, что вы не можете использовать Dynami c SQL в функции, поэтому вам необходимо преобразовать это в хранимую процедуру с параметром uValue OUT, т.е.

CREATE PROCEDURE DMax(
  IN uField VARCHAR(100),
  IN uTable VARCHAR(100),
  OUT uValue <appropriate type>
)
BEGIN
    DECLARE uValue INT(11);
    SET @sql = CONCAT('SELECT MAX(', uField, ') INTO uValue FROM ', uTable);
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

Тогда вам нужно будет вызвать процедуру, что-то вроде

CALL DMax('table1', 'column1', @DMax)

, и тогда вы сможете

SELECT @DMax

(да, это монументальная боль)

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