У вас есть одинарные кавычки вокруг оператора CALL ...Переменные интерполируются только в строки в двойных кавычках, а не в строки в одинарных кавычках.Измените их на двойные кавычки следующим образом:
my $result = $dbh->prepare("CALL GetPictureDataForSendMsg($input)") or error($q, "Problem with database call");
Это будет интерполировать переменную в строку, поэтому вы сейчас отправляете «CALL GetPictureDataForSendMsg (ABC1)» в базу данных.Это тоже не сработает.База данных поместит все, что вы дадите в качестве параметра, непосредственно в строку SQL.Если вы процитируете ABC1 как «ABC1», он будет видеть это как строку;в противном случае он будет думать, что ABC1 - это имя столбца, но это не так.
Итак, эта строка будет работать:
my $result = $dbh->prepare("CALL GetPictureDataForSendMsg('$input')") or error($q, "Problem with database call");
Но есть проблема и с этой строкой.Что если строка, представленная $ input, содержит одинарную кавычку?Это сломается.Вот как происходят атаки с использованием SQL-инъекций.Вместо этого вы должны использовать функцию цитирования DBI, например:
my $result = $dbh->prepare('CALL GetPictureDataForSendMsg('.$dbh->quote($input).')') or error($q, "Problem with database call");
Я протестировал это на своем экземпляре MySQL (версия сервера: 5.1.49-1ubuntu8.1 (Ubuntu)), и это сработало.