Доброе утро, такая проблема: Есть удаленный сервер на котором установлена СУБД Oracle. Этот сервер соединен с моим по VPN. Для того, чтобы проводить определенные операции с базой на сервере Oracle у меня есть 2 хранимые процедуры: 1) Проведение операции 2) Отмена операции Вызываю хранимые процедуры примерно так (функция makeInvoke): PHP: <?php class mobilePayment extends paymentOperations { private $_SETTINGS; function __construct($login, $pswd) { $this->_SETTINGS['login']=$login; $this->_SETTINGS['pswd']=$pswd; $this->_SETTINGS['terminalId']="AAAAAAAAAAAAAAAA"; } public function makeInvoke($paymentAmount, $msisdn) { $db="(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = 171.16.16.10) (PORT = 1521) ) (CONNECT_DATA = (SID = paydb) ) ) )"; if ($connect=OCILogon($this->_SETTINGS['login'], $this->_SETTINGS['pswd'], $db)) { echo "Соединение есть.... "; //test $invoke="begin spec_pay.add_payment(1,'".$this->_SETTINGS['terminalId']."','93".$msisdn."',".$paymentAmount.", :payId, :statusCode, :textResult); end;"; $s = OCIParse($connect, $invoke); OCIBindByName($s, ":payId", $payId, 10); // OCIBindByName($s, ":statusCode", $resultCode, 1); OCIBindByName($s, ":textResult", $errMsg, 20); OCIExecute($s); $error = oci_error($connect); //test echo $error['message']; //test echo $payId. "<br>". $resultCode. "<br>". $errMsg; //test echo "Никаких фатальных ошибок нет."; OCILogoff($connect); return false; } } } ?> В ответ получаю только "Соединение есть.... " и "никаких фатальных ошибок нет". Сама процедура, такое ощущение что ничего вообще не возвращает, хотя другие схожие системы работают с этим оператором и все ок. Я просто с ораклом работал то один раз в жизни, и то не помню когда. Может я лопухнулся где-то. Что скажете? (OCI установлен, соединение есть, процедура рабочая 100%).
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. Сама процедура ни каких данных не возвращает по определению. Данные могут возвращать функции.
Может я конечно неверно выразился, но вызывая процедуру указываются входящие и исходящие параметры. Так вот в исходящие параметры процедура записывает значения. Которое в данном случае не возвращается. А коммит ставить не обязательно в данном случае (так настроен удаленный сервер). Мануал я и без Вас полистал, спасибо! По существу чо есть???
К сожалению листинга хранимый процедуры у меня нет, у меня есть только ее название и что первые 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]
Разобрался вроде спасибо =) Оказывается на удаленном серваке поменяли названия процедур, и оповестили об этом только сегодня вечером. Код работает, все ок. Goryn, спасибо за оказанную "моральную" поддержку =)