php + firebird ошибка при вызове процедуры

TssDragon

Новичок
Всем привет.
Господа, снова требуется ваша помощь :)

В проекте используется база 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)
- пуст. Как следствие, функция вылетает с fatal error, ибо не может выполнить не существующий запрос.
[http://joxi.ru/4AkewL9tM9My3m]
Пробовал пересоздать процедуру, переименовать - ни в какую. На уровне базы процедура корректна и отрабатывает правильно. Ничего сверх естественного в процедуре нет. Она практически идентична уже ранее созданной, которая работает...

Есть идеи, почему такое может происходить ? )
Если надо, прикреплю код процедур


UPD
пробовал создать совсем другую процедуру, с простейшей выборкой - не работает :(
все уже существующие процедуры работают...
погрешил на лимит (?) удалил одну из существующих и создал новую - все равно нет...
 
Последнее редактирование:

TssDragon

Новичок
Отмена. Тему можно закрыть. Нашел ошибку. Мой косяк из-за невнимательности. Создавал процедуры в одной базе, а пытался вызвать их из другой.
 
Сверху