Вы должны использовать хранимые процедуры везде, где это возможно. Таким образом вы повышаете производительность, безопасность и обслуживание кода. Это должен быть ваш первый подход.
Если вы все еще хотите отделить запросы SP от DAL, почему бы не сохранить их в базе данных? Может показаться странным хранить запросы SQL в базе данных для абстракции, поскольку запрос необходим для извлечения других запросов. На самом деле это довольно распространенный подход, при котором вы можете выбирать запросы, соответствующие определенным критериям, и, возможно, (при необходимости) создавать запросы динамически.
Другой подход может заключаться в создании Query-классов, в которых запросы создаются динамически;
class FruitQuery {
...
public function addTypeCriteria($type) {
$this->internalSQLCriterias[] = "fruit=:type";
$this->internalSQLParameters[] = array(':type', $type);
}
...
public function create() {
$this->internalSQLQuery = "SELECT ... FROM Fruits";
if (sizeof($this->internalSQLCriterias) > 0) {
$this->internalSQLQuery .= " WHERE ";
$moreThanOne = '';
foreach ($this->internalSQLCriterias as $criteria) {
$this->internalSQLQuery .= $moreThanOne . $criteria;
$moreThanOne = " AND ";
}
}
}
...
public function execute() {
/* Bind the parameters to the internalSQLQuery, execute and return results (if any) */
}
...
Этот класс абсолютно не завершен в любом случае, и вы, возможно, захотите переосмыслить его структуру - но вы, вероятно, поймете мысль, которую я пытаюсь сформулировать. :) Конечно, вы должны отфильтровать входные данные для построителя запросов, чтобы избежать нарушений безопасности!