hareshdgr8 Ответов: 1

Как передать предложение where в качестве параметра хранимой процедуре?


Создайте процедуру sp_MasterCountry (в whereData longtext)
начать
объявить sqlQuery longtext;
набор SQL-запрос="выбрать * из CountryMaster_tb" + whereData ;

вызов SQL-запрос;

конец;

Мне нужно передать полное предложение where с моей страницы, потому что какое-то время я буду проходить мимо имени страны, а когда-то я буду проходить просто короткое имя имени страны, используя like

Что я уже пробовал:

CREATE PROCEDURE sp_MasterCountry (IN whereData longtext)
begin
declare sqlQuery longtext;
set sqlQuery="Select * from CountryMaster_tb" + whereData ;
 
call sqlQuery;
 
end;


даешь мне ошибку

в MYSQL сервере
Я использую MYSQL Workbench для GUI

1 Ответов

Рейтинг:
12

OriginalGriff

Насаждения играют важную роль.
Попробуйте изменить это:

set sqlQuery="Select * from CountryMaster_tb" + whereData ;
До настоящего времени:
set sqlQuery="Select * from CountryMaster_tb " + whereData ;


Но... мы предупреждаем, что это очень опасно.
Вы никогда не должны объединять строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого всегда используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:
SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

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


hareshdgr8

sqlQuery не существует получая эту проблему сэр

OriginalGriff

Попробуйте Exec вместо вызова - но обратите внимание на то, что я сказал относительно SQL-инъекции...

hareshdgr8

Exec находится в SQL а не в MYSQL сэр
Я читал сэр о SQL инъекции
Если мне нужно передать два параметра, но если я не хочу использовать первый параметр, то как я могу это сделать, например

Country_No int,Country_Name некоторое время я не хочу использовать Country_No, тогда как я должен написать процедуру хранения mysql

OriginalGriff

Простой - разрешить параметрам содержать NULL.
Затем ваш SP проверяет, является ли один или оба пусты, и выбирает соответствующий оператор SELECT.

Maciej Los

Еще 5 за этот комментарий!

Maciej Los

5ed!