Они более безопасны, чем то, что вы делаете. Ваш запрос отправляет необработанный SQL в базу данных, что означает, что ваши параметры не рассматриваются как параметры sql, а как простой старый sql.
Вот что я имею в виду.
При сохраненной процедуре переменная пароля не может быть sql, она должна быть частью информации, которую ищет система. В вашем примере, что на самом деле отправляется в БД:
SELECT * FROM Пользователь, где пароль = ('ваш пароль здесь' - переменная $ Password) ..... так что кто-то может сделать что-то вроде
SELECT * FROM пользователя WHERE Password = («здесь ваш пароль»; SELECT * FROM User - переменная $ password).
или еще хуже:
SELECT * FROM пользователя WHERE Password = ('ваш пароль здесь; DROP Database Database_Name - переменная $ password).
Нединамическая хранимая процедура SQL не допустит этого, потому что входной параметр не будет выполняться как дополнительный SQL.
Параметризованный SQL действительно заботится об этом, но технически хранимые процедуры все еще немного более безопасны, потому что пользователю, осуществляющему доступ к информации в таблице, не требуется доступ на чтение. Нужно только иметь возможность выполнить хранимую процедуру. В зависимости от ваших потребностей это может вступать или не вступать в игру.