Вызов процедуры возвращает «успех», но в базе ничего не изменилось - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь вызвать хранимую процедуру со страницы 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.Очевидно, не мой выбор, не спрашивайте.

1 Ответ

0 голосов
/ 28 февраля 2019

Ну, я чувствую себя глупо, но, как оказалось, если ваша $query переменная null, oci_execute всегда будет возвращать успех.

Моя переменная не была вызвана $query: я имелустановить (и повторил для подтверждения) $queryProcFTTx, но я выполнил $queryProcFttx.Я был обманут VSCode, который выделил оба, когда я дважды щелкнул по переменной, игнорируя регистр.

...