Я пытаюсь вызвать хранимую процедуру со страницы php, но не получаю желаемого результата.
Я использую oci с php, выполнение запроса выглядит следующим образом:
function executeQuery($c, $query){
$stid = oci_parse($c, $query);
if (!$stid) {
$e = oci_error($c);
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
$response['success'] = oci_execute($stid);
if (!$response['success']) {
$e = oci_error($stid);
$response['error'] = $e;
return $response;
trigger_error(htmlentities($e['message'], ENT_QUOTES), E_USER_ERROR);
}
//oci_commit($c); //auto commit is by default with oci_execute but I've tried this too.
oci_free_statement($stid);
}
Если мой $query
является вставкой, он отлично работает и фиксирует вставку, но когда он CALL MY_PROC('VAR1
, 'VAR2', VAR3 '), $response['success']
имеет значение true, но в базе данных ничего не изменилось.
И если я выполню CALL MY_PROC('VAR1', 'VAR2', VAR3')
в редакторе TOAD и зафиксирую, будет работать как положено Я вижу результаты в базе данных.Но не тогда, когда я вызываю свою процедуру из php.
Я пытался использовать EXECUTE
вместо CALL
, добавляя COMMIT;
в конце запроса, и oci_commit($c)
это все равно не влияет набаза данных.
- Что я делаю не так?Может ли это быть проблемой фиксации?
- Что я могу сделать, чтобы получить ошибки вместо "успеха"?
- Вызовы процедур ведут себя иначе, чем операции вставки и выбора, может быть?
Хранимые процедуры вызывают пакет, который я сам не написал и имеет параметров , может быть поэтому я не получаю ошибки?(Опять же, когда я запускаю его в жабе с теми же значениями, он работает нормально, и, в частности, не выдает ошибок).
Моя процедура выглядит следующим образом:
CREATE OR REPLACE MY_PROC(
VAR1 IN VARCHAR2,
VAR2 IN VARCHAR2,
VAR3 IN VARCHAR2
)
IS
BEGIN
ERROR_CODE := NULL; --//inherited from the packages, don't really know what do do with them
ERROR_MSG := NULL;
IF VAR2 = NULL THEN
VAR2 := 'DEFAULT';
END IF;
PKG_USER.CREATE_USER(VAR1, VAR2, VAR3, ERROR_CODE, ERROR_MSG);
IF (ERROR_CODE != NULL OR ERROR_MSG != NULL) THEN
DBMS_OUTPUT.PUT_LINE('ERROR_CODE : ' || ERROR_CODE);
DBMS_OUTPUT.PUT_LINE('ERROR_MSG: ' || ERROR_MSG);
RAISE PROGRAM_ERROR; --//tried doing this to catch the errors but doesn't work
END IF;
END;
/
Я думаю, что частьпроблема с этими параметрами ошибки, но опять-таки он работает нормально, без ошибок, когда я запускаю в нем TOAD.
EDIT : я только что понял, что если я пытаюсь вызвать процедуру, которая не существует , как и CALL MYY_PROC()
, оно по-прежнему не возвращает ошибку и возвращает "успех".
Еще одна вещь, которую стоит отметить, это то, что явызов номера процедур на разных базах данных .На всех других базах, кроме этой, я обычно получаю ошибки и вызываю процедуру, которая не существует, по праву возвращает:
ORA-06576: not a valid function or procedure name
Так что IMO это может быть 2 вещи: copy- вставьте ошибки (которые я проверяю прямо сейчас) или некоторые настройки базы данных, такие как @cdb_dba.
Кстати, платформа, которую я разрабатываю для этого, использует php4.Очевидно, не мой выбор, не спрашивайте.