За последние 24 часа нас посетили 20132 программиста и 1008 роботов. Сейчас ищут 364 программиста ...

Хранимые процедуры Oracle

Тема в разделе "Oracle Database", создана пользователем GreatWasp, 14 янв 2008.

  1. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Доброе утро,
    такая проблема: Есть удаленный сервер на котором установлена СУБД Oracle. Этот сервер соединен с моим по VPN.
    Для того, чтобы проводить определенные операции с базой на сервере Oracle у меня есть 2 хранимые процедуры:
    1) Проведение операции
    2) Отмена операции

    Вызываю хранимые процедуры примерно так (функция makeInvoke):
    PHP:
    1.  
    2. <?php
    3. class mobilePayment extends paymentOperations
    4. {
    5.     private $_SETTINGS;
    6.  
    7.     function __construct($login, $pswd)
    8.     {
    9.         $this->_SETTINGS['login']=$login;
    10.         $this->_SETTINGS['pswd']=$pswd;
    11.         $this->_SETTINGS['terminalId']="AAAAAAAAAAAAAAAA";
    12.     }
    13.  
    14.     public function makeInvoke($paymentAmount, $msisdn)
    15.     {
    16.         $db="(DESCRIPTION =
    17.               (ADDRESS =
    18.                  (PROTOCOL = TCP)
    19.                  (HOST = 171.16.16.10)
    20.                  (PORT = 1521)
    21.                    )
    22.                    (CONNECT_DATA =
    23.                         (SID = paydb)
    24.                    )
    25.                )
    26.         )";
    27.  
    28.         if ($connect=OCILogon($this->_SETTINGS['login'], $this->_SETTINGS['pswd'], $db))
    29.         {
    30.             echo "Соединение есть.... "; //test
    31.  
    32.             $invoke="begin                  spec_pay.add_payment(1,'".$this->_SETTINGS['terminalId']."','93".$msisdn."',".$paymentAmount.", :payId, :statusCode, :textResult);
    33.                     end;";
    34.  
    35.             $s = OCIParse($connect, $invoke);
    36.             OCIBindByName($s, ":payId", $payId, 10); //
    37.             OCIBindByName($s, ":statusCode", $resultCode, 1);
    38.             OCIBindByName($s, ":textResult", $errMsg, 20);
    39.             OCIExecute($s);
    40.  
    41.             $error = oci_error($connect); //test
    42.             echo $error['message']; //test
    43.             echo $payId.
    44.                  "<br>".
    45.                  $resultCode.
    46.                  "<br>".
    47.                  $errMsg; //test
    48.                  
    49.             echo "Никаких фатальных ошибок нет.";
    50.            
    51.             OCILogoff($connect);
    52.             return false;
    53.         }
    54.        
    55.     }
    56.  
    57. }
    58. ?>
    59.  
    В ответ получаю только "Соединение есть.... " и "никаких фатальных ошибок нет". Сама процедура, такое ощущение что ничего вообще не возвращает, хотя другие схожие системы работают с этим оператором и все ок.

    Я просто с ораклом работал то один раз в жизни, и то не помню когда. Может я лопухнулся где-то. Что скажете?
    (OCI установлен, соединение есть, процедура рабочая 100%).
     
  2. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    oci_execute
    (PHP 5)

    oci_execute -- Выполняет выражение SQL
    Описание
    bool oci_execute ( resource stmt [, int mode] )


    oci_execute() выполняет предварительно подготовленное к выполнению выражение SQL (см. oci_parse()). Необязательный третий параметр mode позволяет вам указывать режим выполнения (по умолчанию он равен OCI_COMMIT_ON_SUCCESS). Если вы не хотите, чтобы после выполнения выражения автоматически выполнялся оператор COMMIT, завершающий транзакцию, то вам необходимо указать OCI_DEFAULT, как значение параметра mode.

    Замечание: В версиях PHP ниже 5.0.0 эта функция называлась ociexecute(). В PHP 5.0.0 и выше ociexecute() является алиасом oci_execute(), поэтому вы можете продолжать использовать это имя, однако это не рекомендуется.

    Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

    P.S. Сама процедура ни каких данных не возвращает по определению. Данные могут возвращать функции.
     
  3. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Может я конечно неверно выразился, но вызывая процедуру указываются входящие и исходящие параметры. Так вот в исходящие параметры процедура записывает значения. Которое в данном случае не возвращается.
    А коммит ставить не обязательно в данном случае (так настроен удаленный сервер). Мануал я и без Вас полистал, спасибо!

    По существу чо есть???
     
  4. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    На лист хранимой процедуры можно глянуть?
     
  5. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    К сожалению листинга хранимый процедуры у меня нет, у меня есть только ее название и что первые 4ре передаваемых в нее параметра это входящие данные а последние 3 исходящие.

    И еще есть коротенькое описание:

    [sql]
    declare
    l_payment_id number(10,0);
    l_result number(1,0);
    l_err_msg varchar2(20);
    begin
    spec_pay.add_payment(1,'AAA','931800959',345,l_payment_id,l_result,l_err_msg);
    DBMS_OUTPUT.Put_Line( 'test' );
    DBMS_OUTPUT.Put_Line( l_payment_id );
    DBMS_OUTPUT.Put_Line( l_result );
    DBMS_OUTPUT.Put_Line( l_err_msg );
    end;
    [/sql]
     
  6. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    В Sql+ выводит результаты?
     
  7. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Разобрался вроде спасибо =)
    Оказывается на удаленном серваке поменяли названия процедур, и оповестили об этом только сегодня вечером. Код работает, все ок.

    Goryn, спасибо за оказанную "моральную" поддержку =)
     
  8. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Только тогда становится не понятно, почему не выдавалась ошибка что типа такой процедуры нет :(
     
  9. Goryn

    Goryn Активный пользователь

    С нами с:
    4 апр 2006
    Сообщения:
    398
    Симпатии:
    0
    Адрес:
    Ярославль
    Как вариант, анализировать результат OCIParse.