Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Получить значение функции пакета (Oracle+PHP)  [new]
kolobok1981
Member

Откуда:
Сообщений: 1
Добрый день!

Первый раз столкнулся с использованием СУБД Oracle в PHP.

Есть некий пакет функций A, в котором мне нужно использовать функцию B, результатом которой является значение типа varchar2.

Пытаюсь выполнить такой код

$cursor1 = ocinewcursor($db);
$query = oci_parse($db, "declare myvar varchar2(30000); begin myvar := A.B(); :out := myvar; end;");
ocibindbyname($query,":out", $cursor1, -1, OCI_B_CURSOR);
oci_execute($query);

В ответ получаю следующее:

ORA-06550: line 1, column 80: PLS-00382: expression is of wrong type ORA-06550: line 1, column 72: PL/SQL: Statement ignored

Подскажите, в чем может быть ошибка?
25 ноя 08, 19:11    [6486677]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение функции пакета (Oracle+PHP)  [new]
Bely
Member

Откуда: Москва
Сообщений: 1903
kolobok1981

$cursor1 = ocinewcursor($db);
$query = oci_parse($db, "declare myvar varchar2(30000); begin myvar := A.B(); :out := myvar; end;");
ocibindbyname($query,":out", $cursor1, -1, OCI_B_CURSOR);
oci_execute($query);

В ответ получаю следующее:

ORA-06550: line 1, column 80: PLS-00382: expression is of wrong type ORA-06550: line 1, column 72: PL/SQL: Statement ignored

Подскажите, в чем может быть ошибка?
Подозреваю, что неправильный тип возвращаемой переменной.
У вас указано - CURSOR, адолжно что-нибудь типа "VARCHAR2".
25 ноя 08, 21:33    [6486984]     Ответить | Цитировать Сообщить модератору
 Re: Получить значение функции пакета (Oracle+PHP)  [new]
sdibrov
Member

Откуда:
Сообщений: 67
Чтоб передать курсор, нужно сначала его создать (см oci_new_cursor()), причем
смотрите примеры ТУТ - приведены примеры именно работы с получением курсора и последующего использования

$sql ="BEGIN sp_users_select(:p_start_index, :p_numbers_of_rows, :p_cursor, :p_result); END;";
        $stmt = oci_parse($this->connection, $sql);

        //Bind in parameter
        oci_bind_by_name($stmt, ':p_start_index', $start_index, 20);
        oci_bind_by_name($stmt, ':p_numbers_of_rows', $numbers_of_rows, 20);

        //Bind out parameter
        oci_bind_by_name($stmt, ':p_result', $result, 20); // returns 0 if stored procedure succeessfully executed.

        //Bind Cursor
        $p_cursor = oci_new_cursor($this->connection);
        oci_bind_by_name($stmt, ':p_cursor', $p_cursor, -1, OCI_B_CURSOR);

        // Execute Statement
        oci_execute($stmt);
        oci_execute($p_cursor, OCI_DEFAULT);

        oci_fetch_all($p_cursor, $cursor, null, null, OCI_FETCHSTATEMENT_BY_ROW);

Общее пожелание: читайте здесь и многие вопросы отпадут сами собой
26 ноя 08, 18:59    [6491667]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить