TssDragon
Новичок
Всем привет.
Господа, снова требуется ваша помощь
В проекте используется база firebird и вся работа с ней ведется через процедуры.
Функция php для вызова процедуры следующая:
На вход функции подается имя процедуры и массив с параметрами. Затем, ищется процедуры с данным именем и получается список входных параметров и тип (есть возвращаемые значения или нет). Потом они, входные параметры, сопоставляются с переданным массивом и, собственно, подается запрос на выполнение процедуры.
И все бы ничего, все прекрасно работает уже на протяжении 100+ процедур.
Но тут я создаю новую процедуру и эта функция просто отказывается ее искать. То есть, результат выполнения
- пуст. Как следствие, функция вылетает с fatal error, ибо не может выполнить не существующий запрос.
[http://joxi.ru/4AkewL9tM9My3m]
Пробовал пересоздать процедуру, переименовать - ни в какую. На уровне базы процедура корректна и отрабатывает правильно. Ничего сверх естественного в процедуре нет. Она практически идентична уже ранее созданной, которая работает...
Есть идеи, почему такое может происходить ? )
Если надо, прикреплю код процедур
UPD
пробовал создать совсем другую процедуру, с простейшей выборкой - не работает
все уже существующие процедуры работают...
погрешил на лимит (?) удалил одну из существующих и создал новую - все равно нет...
Господа, снова требуется ваша помощь
В проекте используется база firebird и вся работа с ней ведется через процедуры.
Функция php для вызова процедуры следующая:
PHP:
public function exec($prc, $paramValues, $debug = 0) {
try {
// определяем список параметров процедуры
$sql = "SELECT";
$sql .= " p.RDB\$PARAMETER_NUMBER,";
$sql .= " p.RDB\$PARAMETER_NAME,";
$sql .= " f.RDB\$FIELD_TYPE,";
$sql .= " f.RDB\$DEFAULT_SOURCE,";
$sql .= " f.RDB\$FIELD_LENGTH,";
$sql .= " f.RDB\$FIELD_PRECISION,";
$sql .= " f.RDB\$FIELD_SCALE";
$sql .= " FROM RDB\$PROCEDURE_PARAMETERS p INNER JOIN RDB\$FIELDS f";
$sql .= " ON p.RDB\$FIELD_SOURCE=f.RDB\$FIELD_NAME";
$sql .= " WHERE p.RDB\$PARAMETER_TYPE=0 AND p.RDB\$PROCEDURE_NAME = '" . $prc . "'";
$sql .= " ORDER BY p.RDB\$PARAMETER_NUMBER;";
$params = array();
foreach ($this->conn->query($sql) as $row) {
$paramName = strtolower(trim($row["RDB\$PARAMETER_NAME"]));
$params[$row["RDB\$PARAMETER_NUMBER"]] = array(
"name" => $paramName,
"type" => $row["RDB\$FIELD_TYPE"],
"length" => $row["RDB\$FIELD_LENGTH"],
"precision" => $row["RDB\$FIELD_PRECISION"],
"scale" => $row["RDB\$FIELD_SCALE"]
);
if (array_key_exists($paramName, $paramValues)) {
$params[$row["RDB\$PARAMETER_NUMBER"]]["value"] = $paramValues[$paramName];
} else {
$params[$row["RDB\$PARAMETER_NUMBER"]]["value"] = null;
}
}
ksort($params);
// определяем тип процедуры
$sql = "SELECT COUNT(1) as c FROM RDB\$PROCEDURE_PARAMETERS p WHERE p.RDB\$PARAMETER_TYPE=1 AND p.RDB\$PROCEDURE_NAME = '" . $prc . "';";
$hasRetVal = 0;
foreach ($this->conn->query($sql) as $row) {
if ($row[0] > 0) {
$hasRetVal = 1;
break;
}
}
// готовим вызов процедуры
if ($hasRetVal == 0) {
// процедура без возвращаемых параметров
$sql = "EXECUTE PROCEDURE \"" . $prc . "\"(";
} else {
// процедура c возвращаемым набором параметров
$sql = "SELECT * FROM \"" . $prc . "\"(";
}
foreach ($params as $key => $param) {
if ($key > 0) {
$sql .= ", ";
}
$sql .= ":" . strtolower($param["name"]);
}
$sql .= ");";
// отладка
if ($debug <> 0) {
echo "<br />" . $sql;
prettyPrint($params);
}
// заполняем параметры вызова
$cmd = $this->conn->prepare($sql);
$myNull = null;
foreach ($params as $param) {
if (is_null($param["value"])) {
try {
$cmd->bindParam(":" . $param["name"], $myNull, PDO::PARAM_NULL);
} catch (PDOException $e) {
prettyPrint($e);
}
} else {
try {
$cmd->bindParam(":" . $param["name"], $param["value"], $param["type"], $param["length"]);
} catch (PDOException $e) {
prettyPrint($e);
}
}
}
// отладка
if ($debug <> 0) {
echo "<pre>";
echo $cmd->debugDumpParams();
echo "</pre>";
}
try {
$cmd->execute();
} catch (PDOException $e) {
prettyPrint($e);
}
$result = $cmd->fetchAll();
$this->conn->commit();
return $result;
} catch (PDOException $e) {
echo $e->getMessage();
}
}
И все бы ничего, все прекрасно работает уже на протяжении 100+ процедур.
Но тут я создаю новую процедуру и эта функция просто отказывается ее искать. То есть, результат выполнения
PHP:
$this->conn->query($sql)
Пробовал пересоздать процедуру, переименовать - ни в какую. На уровне базы процедура корректна и отрабатывает правильно. Ничего сверх естественного в процедуре нет. Она практически идентична уже ранее созданной, которая работает...
Есть идеи, почему такое может происходить ? )
Если надо, прикреплю код процедур
UPD
пробовал создать совсем другую процедуру, с простейшей выборкой - не работает
все уже существующие процедуры работают...
погрешил на лимит (?) удалил одну из существующих и создал новую - все равно нет...
Последнее редактирование: